You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

46 lines
1.0 KiB

#ifndef __VOICE_H__
#define __VOICE_H__
#include "preset.h"
#include "dsp/oscillator.h"
#include "dsp/filter.h"
#include "dsp/adsr.h"
class Voice {
public:
typedef struct {
Filter::Settings filter;
Oscillator::Mode osc1Mode;
Oscillator::Mode osc2Mode;
float oscMix;
ADSR::Envelope ampEnv;
ADSR::Envelope fltEnv;
} Settings;
private:
const Settings* settings;
ADSR adsrAmp{&settings->ampEnv};
ADSR adsrFlt{&settings->fltEnv};
Oscillator osc1{&settings->osc1Mode};
Oscillator osc2{&settings->osc2Mode};
Filter filter{&settings->filter};
public:
Voice() = delete;
Voice(const Settings* settings) : settings(settings) {}
inline float tick(float osc1PhaseStep, float osc2PhaseStep) {
float out = 0;
out += (1 - settings->oscMix) * osc1.tick(osc1PhaseStep);
out += settings->oscMix * osc2.tick(osc2PhaseStep);
out = filter.tick(out, adsrFlt.tick());
out *= adsrAmp.tick();
return out;
}
};
#endif