synth/include/generators.hpp

31 lines
743 B
C++

#include <math.h>
#include <stdint.h>
template<int32_t period, int32_t max_val>
int32_t sine(int32_t t) {
// 0 <= t < period is 0 <= t_2pi < 2 pi
t %= period;
float t_2pi = 2 * M_PI / static_cast<float>(period) * t;
return static_cast<int32_t>(sinf(t_2pi) * max_val);
}
template<int32_t period, int32_t max_val>
int32_t square(int32_t t) {
t %= period;
if (t <= period / 2) {
return -max_val;
} else {
return max_val;
}
}
template<int32_t period, int32_t max_val>
int32_t sawtooth(int32_t t) {
// f(t) = a t + y
// f(0) = -max_val = y
// f(period) = a * period - max_val = max_val
// a = 2 * max_val / period
t %= period;
return 2 * max_val * t / period - max_val;
}