LFO and filter adjustments

main
Thor 1 year ago
parent c78d643707
commit 2f528ca33c
  1. 3
      include/synth/channel.h
  2. 4
      include/synth/dsp/filter.h
  3. 8
      include/synth/voice.h
  4. 6
      src/synth/channel.cpp
  5. 10
      src/synth/preset.cpp

@ -25,9 +25,10 @@ public:
frame tick() {
frame out{0};
float lfo = sin(lfoPhase);
Voice** voices = voiceManager->getChannelVoices(number);
for(Voice** voice = voices; *voice != NULL; ++voice) {
out += (*voice)->tick(pitchBend + settings.lfoPitchMod * sin(lfoPhase));
out += (*voice)->tick(pitchBend + settings.lfoPitchMod * lfo, settings.lfoFltMod * lfo);
}
out *= volume;

@ -7,7 +7,7 @@
#include "util.h"
#define FILTER_K_BASE 6.907755278982137
#define FILTER_K_BASE 6.214608098422192
inline float noteToK(float note) {
return ((note - 69) / 12.0) / (FILTER_K_BASE * M_LOG2E);
@ -71,7 +71,7 @@ public:
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 kK = tan(M_PI_4 * clamp(0.002 * exp(freq * FILTER_K_BASE), 0, 1));
float kQ = M_SQRT1_2 + settings->res;
SVF12::Output outA = fltA.tick(in, kK, kQ);

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

@ -22,7 +22,7 @@ float ccToLFOStep(int x) {
}
float ccToLFOPitchMod(int x) {
return 0.01 * exp(x * 7.090076835776092 / 127.0);
return pow(x / 127.0, 2) * 6;
}
void Channel::loadPreset(const Preset * preset) {
@ -51,7 +51,7 @@ void Channel::loadPreset(const Preset * preset) {
settings.keyTrack = preset->keyTrack / 127.0;
settings.lfoStep = ccToLFOStep(preset->lfoFreq);
settings.lfoPitchMod = ccToLFOPitchMod(preset->lfoPitchMod);
settings.lfoFltMod = preset->lfoFltMod / 127.0;
settings.lfoFltMod = (preset->lfoFltMod - 64) / 126.0;
}
void Channel::noteOn(int note, int velocity) {
@ -141,7 +141,7 @@ void Channel::control(int code, int value) {
break;
case CC_LFO_FLT: // LFO Filter Modulation
settings.lfoFltMod = value / 127.0;
settings.lfoFltMod = (value - 64) / 126.0;
break;
}
}

@ -18,19 +18,19 @@ const Preset DEFAULT_PRESET = {
.attack = 0,
.decay = 80,
.sustain = 64,
.release = 64
.release = 100
},
.modEnv = {
.attack = 48,
.decay = 104,
.decay = 100,
.sustain = 0,
.release = 64
.release = 100
},
.modEnvFltGain = 40,
.keyTrack = 127,
.lfoFreq = 85,
.lfoFreq = 64,
.lfoPitchMod = 0,
.lfoFltMod = 0
.lfoFltMod = 64
};
Loading…
Cancel
Save