#ifndef __VOICE_H__ #define __VOICE_H__ #include "globals.h" #include "preset.h" #include "dsp/oscillator.h" #include "dsp/filter.h" #include "dsp/adsr.h" class Voice { public: typedef struct { float unison; Oscillator::Mode osc1Mode; Oscillator::Mode osc2Mode; float oscMix; float oscDetune; float osc2Pitch; float noiseMix; Filter::Settings filter; ADSR::Envelope ampEnv; ADSR::Envelope modEnv; float modEnvFltGain; float keyTrack; float lfoStep; float lfoPitchMod; float lfoFltMod; float reverb; } Settings; private: Settings const * settings; ADSR adsrAmp; ADSR adsrMod; Oscillator osc1; Oscillator osc2; Filter filter; public: int note; float gain; float pan; float detune; void reset(); void assign(Settings const * settings); void noteOn(int note, float detune = 0, float gain = 1.0, float pan = 0.5); void noteOff(); inline bool isIdle() { return adsrAmp.isIdle(); } inline float tick(float pitchMod, float fltMod) { const float basePitch = note + pitchMod + detune; const float osc1CV = noteToCV(basePitch - settings->oscDetune); const float osc2CV = noteToCV(basePitch + settings->oscDetune + settings->osc2Pitch); float out = 0; out += (1 - settings->oscMix) * osc1.tick(osc1CV); out += settings->oscMix * osc2.tick(osc2CV); out += settings->noiseMix * ((1.f / 3.f) * (whiteNoise() + whiteNoise() + whiteNoise()) - out); const float keyTrackVal = settings->keyTrack * (note - 72) / 12.f; out = filter.tick(out, settings->modEnvFltGain * adsrMod.tick() + keyTrackVal + fltMod); out *= gain * adsrAmp.tick(); return out; } }; #endif