psyn/voice.c

73 lines
1.7 KiB
C
Raw Normal View History

2010-01-13 10:35:51 +00:00
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "osc.h"
#include "env.h"
#include "filter.h"
2010-01-13 10:35:51 +00:00
#include "voice.h"
#include "psyn.h"
#include "rng.h"
void voice_init(struct voice_t *voice, double freq)
{
// filter_init_rc(&voice->fil[0], 1000.0, 0.000000047);
// filter_init_rc(&voice->fil[1], 47000.0, 0.000000047);
filter_init_freq(&voice->fil[0], 2000.0);
filter_init_freq(&voice->fil[1], 150.0);
osc_setfreq(&voice->osc[0], freq);
osc_setfreq(&voice->osc[1], freq * 1.2);
osc_setfreq(&voice->osc[2], freq * 5);
}
2010-01-13 10:35:51 +00:00
static inline void voice_tick(struct voice_t *voice)
{
unsigned i;
for (i = 0; i < VOICE_OSCILLATORS; i++) {
osc_tick(voice->osc + i);
}
voice->sample++;
}
void voice_run(struct voice_t *voice, uint32_t samples, float *left, float *right)
{
// uint32_t pos;
double amplitude;
double l;
double r;
//for (pos = 0; pos < samples; pos++) {
voice_tick(voice);
amplitude = env_getamplitude(&_env, voice->sample, voice->released);
if (amplitude <= 0.0001) {
voice->playing = false;
return;
}
amplitude *= voice->velocity;
l = amplitude * voice->osc[0].sin * (1.0 + rng() * 0.25);
r = amplitude * voice->osc[0].sin * (1.0 + rng() * 0.25);
2010-01-13 10:35:51 +00:00
amplitude = env_getamplitude(&_env2, voice->sample, voice->released) * voice->velocity * voice->velocity * 1.5;
if (amplitude > 0.0) {
2010-01-13 11:37:26 +00:00
l += amplitude * voice->osc[1].tri * (1.0 + voice->osc[2].sin * 0.25);
r += amplitude * voice->osc[1].tri * (1.0 + voice->osc[2].sin * 0.25);
2010-01-13 10:35:51 +00:00
}
*left += l;
*right += r;
// filter_run_lp(&voice->fil[0], l, r);
// filter_run_hp(&voice->fil[1], voice->fil[0].last_out_l, voice->fil[0].last_out_r);
2010-01-13 10:35:51 +00:00
// *left += voice->fil[0].last_out_l;
// *right += voice->fil[0].last_out_r;
2010-01-13 10:35:51 +00:00
// }
}