mirror of
https://github.com/radio95-rnt/fm95.git
synced 2026-07-29 15:59:14 +02:00
51 lines
1.4 KiB
C
51 lines
1.4 KiB
C
#include "oscillator.h"
|
|
|
|
void init_oscillator(Oscillator *osc, float frequency, float sample_rate) {
|
|
osc->phase = 0.0f;
|
|
osc->phase_increment = (M_2PI * frequency) / sample_rate;
|
|
osc->sample_rate = sample_rate;
|
|
}
|
|
|
|
inline void change_oscillator_frequency(Oscillator *osc, float frequency) {
|
|
osc->phase_increment = (M_2PI * frequency) / osc->sample_rate;
|
|
}
|
|
|
|
float get_oscillator_sin_sample(Oscillator *osc) {
|
|
float sample = sinf(osc->phase);
|
|
advance_oscillator(osc);
|
|
return sample;
|
|
}
|
|
|
|
float get_oscillator_cos_sample(Oscillator *osc) {
|
|
float sample = cosf(osc->phase);
|
|
advance_oscillator(osc);
|
|
return sample;
|
|
}
|
|
|
|
float get_oscillator_sin_multiplier_ni(Oscillator *osc, float multiplier) {
|
|
return sinf(osc->phase * multiplier);
|
|
}
|
|
|
|
float get_oscillator_cos_multiplier_ni(Oscillator *osc, float multiplier) {
|
|
return cosf(osc->phase * multiplier);
|
|
}
|
|
|
|
inline bool advance_oscillator(Oscillator *osc) {
|
|
osc->phase += osc->phase_increment;
|
|
if (osc->phase >= M_2PI) {
|
|
osc->phase -= M_2PI;
|
|
return true;
|
|
} return false;
|
|
}
|
|
|
|
bool oscillator_did_cycle(Oscillator *osc, float phase_shift, float *prev_shifted_phase) {
|
|
float shifted = osc->phase + phase_shift;
|
|
|
|
// wrap into [0, 2π)
|
|
while (shifted >= M_2PI) shifted -= M_2PI;
|
|
while (shifted < 0.0f) shifted += M_2PI;
|
|
|
|
bool crossed = shifted < *prev_shifted_phase;
|
|
*prev_shifted_phase = shifted;
|
|
return crossed;
|
|
} |