forked from klang-modular/synthapp
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
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 |