From 1f7786cc74c5a5c4d87ddfe0d3508cd756506677 Mon Sep 17 00:00:00 2001 From: Paul Ferrand Date: Mon, 30 Mar 2020 20:07:54 +0200 Subject: [PATCH] Be explicit in the filter/EQ processes --- src/sfizz/EQPool.cpp | 32 ++++++++++++++++++++++++-------- src/sfizz/FilterPool.cpp | 30 ++++++++++++++++++++++-------- src/sfizz/MidiState.h | 31 ------------------------------- 3 files changed, 46 insertions(+), 47 deletions(-) diff --git a/src/sfizz/EQPool.cpp b/src/sfizz/EQPool.cpp index 81821e1e..a9f8c2bc 100644 --- a/src/sfizz/EQPool.cpp +++ b/src/sfizz/EQPool.cpp @@ -28,12 +28,20 @@ void sfz::EQHolder::setup(const EQDescription& description, unsigned numChannels baseGain = description.gain + velocity * description.vel2gain; // Setup the modulated values - lastFrequency = baseFrequency + midiState.fastAdditiveModifiers(description.frequencyCC); + lastFrequency = baseFrequency; + for (auto& mod : description.frequencyCC) + lastFrequency += midiState.getCCValue(mod.cc) * mod.value; lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency); - lastBandwidth = baseBandwidth + midiState.fastAdditiveModifiers(description.bandwidthCC); + + lastBandwidth = baseBandwidth; + for (auto& mod : description.bandwidthCC) + lastBandwidth += midiState.getCCValue(mod.cc) * mod.value; lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth); - lastGain = baseGain + midiState.fastAdditiveModifiers(description.gainCC); - lastGain = Default::eqGainRange.clamp(lastGain); + + lastGain = baseGain; + for (auto& mod : description.gainCC) + lastGain += midiState.getCCValue(mod.cc) * mod.value; + lastGain = Default::filterGainRange.clamp(lastGain); // Initialize the EQ eq.prepare(lastFrequency, lastBandwidth, lastGain); @@ -53,12 +61,20 @@ void sfz::EQHolder::process(const float** inputs, float** outputs, unsigned numF // TODO: Once the midistate envelopes are done, add modulation in there! // For now we take the last value - lastFrequency = baseFrequency + midiState.fastAdditiveModifiers(description->frequencyCC); + lastFrequency = baseFrequency; + for (auto& mod : description->frequencyCC) + lastFrequency += midiState.getCCValue(mod.cc) * mod.value; lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency); - lastBandwidth = baseBandwidth + midiState.fastAdditiveModifiers(description->bandwidthCC); + + lastBandwidth = baseBandwidth; + for (auto& mod : description->bandwidthCC) + lastBandwidth += midiState.getCCValue(mod.cc) * mod.value; lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth); - lastGain = baseGain + midiState.fastAdditiveModifiers(description->gainCC); - lastGain = Default::eqGainRange.clamp(lastGain); + + lastGain = baseGain; + for (auto& mod : description->gainCC) + lastGain += midiState.getCCValue(mod.cc) * mod.value; + lastGain = Default::filterGainRange.clamp(lastGain); if (lastGain == 0.0f) { justCopy(); diff --git a/src/sfizz/FilterPool.cpp b/src/sfizz/FilterPool.cpp index 4e89e802..f28002f4 100644 --- a/src/sfizz/FilterPool.cpp +++ b/src/sfizz/FilterPool.cpp @@ -40,11 +40,19 @@ void sfz::FilterHolder::setup(const FilterDescription& description, unsigned num baseResonance = description.resonance; // Setup the modulated values - lastCutoff = baseCutoff * midiState.fastMultiplicativeModifiers(description.cutoffCC, multiplyByCentsModifier); + lastCutoff = baseCutoff; + for (auto& mod : description.cutoffCC) + lastCutoff *= centsFactor(midiState.getCCValue(mod.cc) * mod.value); lastCutoff = Default::filterCutoffRange.clamp(lastCutoff); - lastResonance = baseResonance + midiState.fastAdditiveModifiers(description.resonanceCC); + + lastResonance = baseResonance; + for (auto& mod : description.resonanceCC) + lastResonance += midiState.getCCValue(mod.cc) * mod.value; lastResonance = Default::filterResonanceRange.clamp(lastResonance); - lastGain = baseGain + midiState.fastAdditiveModifiers(description.gainCC); + + lastGain = baseGain; + for (auto& mod : description.gainCC) + lastGain += midiState.getCCValue(mod.cc) * mod.value; lastGain = Default::filterGainRange.clamp(lastGain); // Initialize the filter @@ -62,13 +70,19 @@ void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned // TODO: Once the midistate envelopes are done, add modulation in there! // For now we take the last value // TODO: the template deduction could be automatic here? - lastCutoff = baseCutoff * midiState.fastMultiplicativeModifiers(description->cutoffCC, [](const int& modifier, float value) -> float { - return value * centsFactor(modifier); - }); + lastCutoff = baseCutoff; + for (auto& mod : description->cutoffCC) + lastCutoff *= centsFactor(midiState.getCCValue(mod.cc) * mod.value); lastCutoff = Default::filterCutoffRange.clamp(lastCutoff); - lastResonance = baseResonance + midiState.fastAdditiveModifiers(description->resonanceCC); + + lastResonance = baseResonance; + for (auto& mod : description->resonanceCC) + lastResonance += midiState.getCCValue(mod.cc) * mod.value; lastResonance = Default::filterResonanceRange.clamp(lastResonance); - lastGain = baseGain + midiState.fastAdditiveModifiers(description->gainCC); + + lastGain = baseGain; + for (auto& mod : description->gainCC) + lastGain += midiState.getCCValue(mod.cc) * mod.value; lastGain = Default::filterGainRange.clamp(lastGain); filter.process(inputs, outputs, lastCutoff, lastResonance, lastGain, numFrames); diff --git a/src/sfizz/MidiState.h b/src/sfizz/MidiState.h index 0d14e41c..7d4078fb 100644 --- a/src/sfizz/MidiState.h +++ b/src/sfizz/MidiState.h @@ -123,37 +123,6 @@ public: */ void resetAllControllers(int delay) noexcept; - /** - * @brief Modulate a value using the last entered CCs in the midiState - * - * @tparam T - * @tparam U - * @param value the base value - * @param modifiers the list of CC modifiers - * @param validRange a range to clamp the output - * @param lambda the function to apply for each modifier - * @return T - */ - template)> - float fastAdditiveModifiers(const CCMap& modifiers, F&& lambda = gainModifier) const noexcept - { - float returnedValue { 0.0f }; - for (auto& mod: modifiers) { - returnedValue += lambda(getCCValue(mod.cc), mod.value); - } - return returnedValue; - } - - template)> - float fastMultiplicativeModifiers(const CCMap& modifiers, F&& lambda = gainModifier) const noexcept - { - float returnedValue { 1.0f }; - for (auto& mod: modifiers) { - returnedValue *= lambda(getCCValue(mod.cc), mod.value); - } - return returnedValue; - } - const EventVector& getEvents(int ccIdx) const noexcept; template