#include #include #include #include "osc.h" #include "env.h" #include "filter.h" #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); } 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); amplitude = env_getamplitude(&_env2, voice->sample, voice->released) * voice->velocity * voice->velocity * 1.5; if (amplitude > 0.0) { 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); } *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); // *left += voice->fil[0].last_out_l; // *right += voice->fil[0].last_out_r; // } }