28template<u
int16_t TableSize, u
int8_t MaxTables = 8>
39 if (count_ >= MaxTables)
return false;
40 tables_[count_++] = table;
48 void set_scan(
float position) { scan_pos_ = position; }
64 void set_note(
float midi_note,
float sample_rate = 48000.0f) {
79 void process(
float* out, uint16_t frames) {
81 for (uint16_t i = 0; i < frames; ++i) out[i] = 0.0f;
89 compute_scan(idx_a, idx_b, balance);
91 const float* ta = tables_[idx_a];
92 const float* tb = tables_[idx_b];
94 for (uint16_t i = 0; i < frames; ++i) {
102 out[i] = s * amplitude_;
119 void compute_scan(uint8_t& idx_a, uint8_t& idx_b,
float& balance)
const {
127 float pos = scan_pos_;
128 if (pos < 0.0f) pos = 0.0f;
129 if (pos > 1.0f) pos = 1.0f;
130 float scaled = pos *
static_cast<float>(count_ - 1);
131 idx_a =
static_cast<uint8_t
>(scaled);
132 if (idx_a >= count_ - 1) {
138 balance = scaled -
static_cast<float>(idx_a);
142 dsp::PhaseAccumulator phase_;
143 const float* tables_[MaxTables] = {};
144 float amplitude_ = 1.0f;
145 float scan_pos_ = 0.0f;
void reset()
Reset phase to zero.
void set_increment(uint32_t inc)
Set the phase increment per sample.
uint32_t increment() const
Current phase increment.
void advance()
Advance phase by one sample.
static uint32_t freq_to_inc(float freq_hz, float sr=48000.0f)
Convert frequency in Hz to phase increment.
uint32_t phase() const
Current phase value.
uint16_t lookup_linear(const uint16_t *table, uint32_t phase)
uint32_t note_to_phase_increment(float midi_note, float sample_rate)