2010-01-13 10:35:51 +00:00
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include <math.h>
|
|
|
|
#include "osc.h"
|
|
|
|
#include "env.h"
|
2010-01-13 17:05:00 +00:00
|
|
|
#include "filter.h"
|
2010-01-13 10:35:51 +00:00
|
|
|
#include "voice.h"
|
|
|
|
#include "psyn.h"
|
2010-01-13 17:05:00 +00:00
|
|
|
#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;
|
|
|
|
|
2010-01-13 17:05:00 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2010-01-13 17:05:00 +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
|
|
|
|
2010-01-13 17:05:00 +00:00
|
|
|
// *left += voice->fil[0].last_out_l;
|
|
|
|
// *right += voice->fil[0].last_out_r;
|
2010-01-13 10:35:51 +00:00
|
|
|
// }
|
|
|
|
}
|