Mathematically correct key tracking

main
Thor 1 year ago
parent 055e447ca0
commit 838cd922bf
  1. 15
      include/synth/dsp/filter.h
  2. 4
      include/synth/voice.h

@ -7,11 +7,14 @@
#include "util.h"
#define FILTER_K_BASE 6.907755278982137
inline float noteToK(float note) {
return ((note - 69) / 12.0) / (FILTER_K_BASE * M_LOG2E);
}
class SVF12 {
public:
float frequency;
float Q;
typedef struct {
float lp; // low-pass
float bp; // band-pass
@ -66,9 +69,9 @@ private:
public:
void assign(Settings const * settings);
inline float tick(float in, float freqAdd, float freqScale) {
float freq = clamp(freqScale * settings->freq + freqAdd, 0, 1);
float kK = tan(M_PI_4 * clamp(0.001 * exp(freq * 6.907755278982137), 0, 1));
inline float tick(float in, float freqAdd) {
float freq = clamp(settings->freq + freqAdd, 0, 1);
float kK = tan(M_PI_4 * clamp(0.001 * exp(freq * FILTER_K_BASE), 0, 1));
float kQ = M_SQRT1_2 + settings->res;
SVF12::Output outA = fltA.tick(in, kK, kQ);

@ -48,13 +48,13 @@ public:
inline bool isIdle() { return adsrAmp.isIdle(); }
inline float tick(float pitchMod) {
const float keyTrackMul = 1 + settings->keyTrack * noteToFreq(note + pitchMod) / 440.0;
const float osc1PhaseStep = noteToFreq(note + pitchMod - settings->oscDetune) * PIx2 / SAMPLE_RATE;
const float osc2PhaseStep = noteToFreq(note + pitchMod + settings->oscDetune + settings->osc2Pitch) * PIx2 / SAMPLE_RATE;
float out = 0;
out += (1 - settings->oscMix) * osc1.tick(osc1PhaseStep);
out += settings->oscMix * osc2.tick(osc2PhaseStep);
out = filter.tick(out, settings->modEnvFltGain * adsrMod.tick(), keyTrackMul);
const float keyTrackVal = settings->keyTrack * noteToK(note);
out = filter.tick(out, settings->modEnvFltGain * adsrMod.tick() + keyTrackVal);
out *= adsrAmp.tick();
return out;
}

Loading…
Cancel
Save