psyn/osc.h

60 lines
1.1 KiB
C
Raw Permalink Normal View History

2010-01-13 10:35:51 +00:00
2010-01-20 07:49:38 +00:00
#define LOOKUP_SAMPLES 3600
2010-01-13 10:35:51 +00:00
2010-01-20 07:49:38 +00:00
extern double _lookup_table[6][LOOKUP_SAMPLES + 1];
2010-01-13 10:35:51 +00:00
2010-01-21 08:36:18 +00:00
enum {
OSC_SINE,
OSC_SAW,
OSC_TRIANGLE,
OSC_SQUARE,
OSC_MOOGSAW,
OSC_EXP,
};
2010-01-13 10:35:51 +00:00
struct osc_t
{
double freq;
double step;
double ramp;
2010-01-20 07:49:38 +00:00
double level;
2010-01-13 10:35:51 +00:00
2010-01-20 07:49:38 +00:00
uint8_t shape;
2010-01-13 10:35:51 +00:00
};
void osc_init();
void osc_setfreq(struct osc_t *osc, double freq);
2010-01-20 07:49:38 +00:00
static inline void osc_setphase(struct osc_t *osc, double phase)
{
osc->ramp = LOOKUP_SAMPLES * phase;
}
2010-01-13 10:35:51 +00:00
static inline void osc_tick(struct osc_t *osc)
{
osc->ramp += osc->step;
if (osc->ramp > LOOKUP_SAMPLES) osc->ramp -= LOOKUP_SAMPLES;
2010-01-20 07:49:38 +00:00
//uint32_t pos = floor(osc->ramp);
//osc->sin = _sin_table[pos];
//osc->saw = _saw_table[pos];
//osc->tri = _tri_table[pos];
}
2010-06-14 14:08:49 +00:00
static inline double osc_getsample(const struct osc_t *osc)
2010-01-20 07:49:38 +00:00
{
uint32_t pos = osc->ramp;
return _lookup_table[osc->shape][pos] * osc->level;
}
2010-06-14 14:08:49 +00:00
static inline double osc_getsamplewithphase(const struct osc_t *osc, float phase)
2010-01-20 07:49:38 +00:00
{
double sample = osc->ramp + phase * LOOKUP_SAMPLES;
if (sample < 0.0) sample += LOOKUP_SAMPLES;
else if (sample > LOOKUP_SAMPLES) sample -= LOOKUP_SAMPLES;
2010-01-13 10:35:51 +00:00
2010-01-20 07:49:38 +00:00
uint32_t pos = sample;
return _lookup_table[osc->shape][pos] * osc->level;
2010-01-13 10:35:51 +00:00
}