You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
23 lines
636 B
C
23 lines
636 B
C
#include "oscillator.h"
|
|
#include "config.h"
|
|
|
|
int16_t oscillator_render_sample(struct Oscillator *osc) {
|
|
if(osc->period == 0) return 0;
|
|
|
|
osc->phase += 0x10000; // add one sample in fixed
|
|
osc->sub_phase += 0x10000;
|
|
|
|
fixed sub_period = osc->period << 1;
|
|
|
|
while(osc->phase > osc->period)
|
|
osc->phase -= osc->period;
|
|
while(osc->sub_phase > sub_period)
|
|
osc->sub_phase -= sub_period;
|
|
|
|
return (1 << 13) - (osc->phase << 3) / (osc->period >> 11) + (osc->sub_phase - osc->period / 2 > osc->period ? 4096 : -4096);
|
|
}
|
|
|
|
void oscillator_set_freq(struct Oscillator *osc, float freq) {
|
|
osc->period = ((float)SAMPLE_RATE / freq) * 65536.0;
|
|
}
|