Properly set the initial value for the smoothers

Take into account the curve
This commit is contained in:
Paul Ferrand 2020-07-01 14:14:45 +02:00
parent d8d956562e
commit ae0ac8d632

View file

@ -136,21 +136,24 @@ void sfz::Voice::startVoice(Region* region, int delay, int number, float value,
for (auto& modId : allModifiers) { for (auto& modId : allModifiers) {
ASSERT(modifierSmoothers[modId].size() >= region->modifiers[modId].size()); ASSERT(modifierSmoothers[modId].size() >= region->modifiers[modId].size());
forEachWithSmoother(modId, [modId, this](const CCData<Modifier>& mod, Smoother& smoother) { forEachWithSmoother(modId, [modId, this](const CCData<Modifier>& mod, Smoother& smoother) {
const auto ccValue = resources.midiState.getCCValue(mod.cc);
const auto curve = resources.curves.getCurve(mod.data.curve);
const auto finalValue = curve.evalNormalized(ccValue) * mod.data.value;
switch (modId) { switch (modId) {
case Mod::volume: case Mod::volume:
smoother.reset(db2mag(resources.midiState.getCCValue(mod.cc) * mod.data.value)); smoother.reset(db2mag(finalValue));
break; break;
case Mod::pitch: case Mod::pitch:
smoother.reset(centsFactor(resources.midiState.getCCValue(mod.cc) * mod.data.value)); smoother.reset(centsFactor(finalValue));
break; break;
case Mod::amplitude: case Mod::amplitude:
case Mod::pan: case Mod::pan:
case Mod::width: case Mod::width:
case Mod::position: case Mod::position:
smoother.reset(normalizePercents(resources.midiState.getCCValue(mod.cc) * mod.data.value)); smoother.reset(normalizePercents(finalValue));
break; break;
default: default:
smoother.reset(resources.midiState.getCCValue(mod.cc) * mod.data.value); smoother.reset(finalValue);
break; break;
} }
smoother.setSmoothing(mod.data.smooth, sampleRate); smoother.setSmoothing(mod.data.smooth, sampleRate);