From 0173aa1e960f2d90f55269492517a059e7222968 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Wed, 19 Feb 2020 13:38:48 +0100 Subject: [PATCH] Use the pepare() function to initialize filters --- src/sfizz/EQPool.cpp | 34 ++++++++++++++-------------------- src/sfizz/FilterPool.cpp | 31 +++++++++++++------------------ 2 files changed, 27 insertions(+), 38 deletions(-) diff --git a/src/sfizz/EQPool.cpp b/src/sfizz/EQPool.cpp index c79cbfeb..f38e8748 100644 --- a/src/sfizz/EQPool.cpp +++ b/src/sfizz/EQPool.cpp @@ -18,14 +18,22 @@ void sfz::EQHolder::reset() void sfz::EQHolder::setup(const EQDescription& description, unsigned numChannels, uint8_t velocity) { - reset(); eq.setChannels(numChannels); this->description = &description; const auto normalizedVelocity = normalizeVelocity(velocity); + // Setup the base values + baseFrequency = description.frequency + normalizedVelocity * description.vel2frequency; baseBandwidth = description.bandwidth; - baseGain = Default::eqGainRange.clamp(description.gain + normalizedVelocity * description.vel2gain); - baseFrequency = Default::eqFrequencyRange.clamp(description.frequency + normalizedVelocity * description.vel2frequency); + baseGain = description.gain + normalizedVelocity * description.vel2gain; + + // Setup the modulated values + lastFrequency = midiState.modulate(baseFrequency, description.frequencyCC, Default::eqFrequencyRange); + lastBandwidth = midiState.modulate(baseBandwidth, description.bandwidthCC, Default::eqBandwidthRange); + lastGain = midiState.modulate(baseGain, description.gainCC, Default::eqGainRange); + + // Initialize the EQ + eq.prepare(lastFrequency, lastBandwidth, lastGain); } void sfz::EQHolder::process(const float** inputs, float** outputs, unsigned numFrames) @@ -42,23 +50,9 @@ 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; - for (auto& mod: description->frequencyCC) { - lastFrequency += midiState.getCCValue(mod.first) * mod.second; - } - lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency); - - lastBandwidth = baseBandwidth; - for (auto& mod: description->bandwidthCC) { - lastBandwidth += midiState.getCCValue(mod.first) * mod.second; - } - lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth); - - lastGain = baseGain; - for (auto& mod: description->gainCC) { - lastGain += midiState.getCCValue(mod.first) * mod.second; - } - lastGain = Default::eqGainRange.clamp(lastGain); + lastFrequency = midiState.modulate(baseFrequency, description->frequencyCC, Default::eqFrequencyRange); + lastBandwidth = midiState.modulate(baseBandwidth, description->bandwidthCC, Default::eqBandwidthRange); + lastGain = midiState.modulate(baseGain, description->gainCC, Default::eqGainRange); if (lastGain == 0.0f) { justCopy(); diff --git a/src/sfizz/FilterPool.cpp b/src/sfizz/FilterPool.cpp index 5eb6cb3f..af56f3b6 100644 --- a/src/sfizz/FilterPool.cpp +++ b/src/sfizz/FilterPool.cpp @@ -19,11 +19,11 @@ void sfz::FilterHolder::reset() void sfz::FilterHolder::setup(const FilterDescription& description, unsigned numChannels, int noteNumber, uint8_t velocity) { - reset(); this->description = &description; filter.setType(description.type); filter.setChannels(numChannels); + // Setup the base values baseCutoff = description.cutoff; if (description.random != 0) { dist.param(filterRandomDist::param_type(0, description.random)); @@ -37,6 +37,14 @@ void sfz::FilterHolder::setup(const FilterDescription& description, unsigned num baseGain = description.gain; baseResonance = description.resonance; + + // Setup the modulated values + lastCutoff = midiState.modulate(baseCutoff, description.cutoffCC, Default::filterCutoffRange, multiplyByCents); + lastResonance = midiState.modulate(baseResonance, description.resonanceCC, Default::filterResonanceRange); + baseGain = midiState.modulate(baseGain, description.gainCC, Default::filterGainRange); + + // Initialize the filter + filter.prepare(lastCutoff, lastResonance, lastGain); } void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned numFrames) @@ -49,23 +57,10 @@ 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 - lastCutoff = baseCutoff; - for (auto& mod: description->cutoffCC) { - lastCutoff *= centsFactor(midiState.getCCValue(mod.first) * mod.second); - } - lastCutoff = Default::filterCutoffRange.clamp(lastCutoff); - - lastResonance = baseResonance; - for (auto& mod: description->resonanceCC) { - lastResonance += midiState.getCCValue(mod.first) * mod.second; - } - lastResonance = Default::filterResonanceRange.clamp(lastResonance); - - lastGain = baseGain; - for (auto& mod: description->gainCC) { - lastGain += midiState.getCCValue(mod.first) * mod.second; - } - lastGain = Default::filterGainRange.clamp(lastGain); + // TODO: the template deduction could be automatic here? + lastCutoff = midiState.modulate(baseCutoff, description->cutoffCC, Default::filterCutoffRange, multiplyByCents); + lastResonance = midiState.modulate(baseResonance, description->resonanceCC, Default::filterResonanceRange); + baseGain = midiState.modulate(baseGain, description->gainCC, Default::filterGainRange); filter.process(inputs, outputs, lastCutoff, lastResonance, lastGain, numFrames); }