diff --git a/src/sfizz/EQPool.cpp b/src/sfizz/EQPool.cpp index 59cdecb5..bca8c711 100644 --- a/src/sfizz/EQPool.cpp +++ b/src/sfizz/EQPool.cpp @@ -14,6 +14,7 @@ sfz::EQHolder::EQHolder(Resources& resources) void sfz::EQHolder::reset() { eq->clear(); + prepared = false; } void sfz::EQHolder::setup(const Region& region, unsigned eqId, float velocity) @@ -30,29 +31,12 @@ void sfz::EQHolder::setup(const Region& region, unsigned eqId, float velocity) baseBandwidth = description->bandwidth; baseGain = description->gain + velocity * description->vel2gain; - // Setup the modulated values - float lastFrequency = baseFrequency; - for (const auto& mod : description->frequencyCC) - lastFrequency += resources.midiState.getCCValue(mod.cc) * mod.data; - lastFrequency = Default::eqFrequencyRange.clamp(lastFrequency); - - float lastBandwidth = baseBandwidth; - for (const auto& mod : description->bandwidthCC) - lastBandwidth += resources.midiState.getCCValue(mod.cc) * mod.data; - lastBandwidth = Default::eqBandwidthRange.clamp(lastBandwidth); - - float lastGain = baseGain; - for (const auto& mod : description->gainCC) - lastGain += resources.midiState.getCCValue(mod.cc) * mod.data; - lastGain = Default::filterGainRange.clamp(lastGain); - gainTarget = resources.modMatrix.findTarget(ModKey::createNXYZ(ModId::EqGain, region.id, eqId)); bandwidthTarget = resources.modMatrix.findTarget(ModKey::createNXYZ(ModId::EqBandwidth, region.id, eqId)); frequencyTarget = resources.modMatrix.findTarget(ModKey::createNXYZ(ModId::EqFrequency, region.id, eqId)); - // Initialize the EQ - DBG(baseFrequency << " " << baseBandwidth << " " << baseGain); - eq->prepare(lastFrequency, lastBandwidth, lastGain); + // Disables smoothing of the parameters on the first call + prepared = false; } void sfz::EQHolder::process(const float** inputs, float** outputs, unsigned numFrames) @@ -83,7 +67,10 @@ void sfz::EQHolder::process(const float** inputs, float** outputs, unsigned numF if (float* mod = mm.getModulation(gainTarget)) add(absl::Span(mod, numFrames), *gainSpan); - DBG(frequencySpan->back() << " " << bandwidthSpan->back() << " " << gainSpan->back()); + if (!prepared) { + eq->prepare(frequencySpan->front(), bandwidthSpan->front(), gainSpan->front()); + prepared = true; + } eq->processModulated( inputs, diff --git a/src/sfizz/EQPool.h b/src/sfizz/EQPool.h index f284e69e..30ce889a 100644 --- a/src/sfizz/EQPool.h +++ b/src/sfizz/EQPool.h @@ -48,6 +48,7 @@ private: float baseBandwidth { Default::eqBandwidth }; float baseFrequency { Default::eqFrequency1 }; float baseGain { Default::eqGain }; + bool prepared { false }; ModMatrix::TargetId gainTarget; ModMatrix::TargetId frequencyTarget; ModMatrix::TargetId bandwidthTarget; diff --git a/src/sfizz/FilterPool.cpp b/src/sfizz/FilterPool.cpp index d60accad..c5eadcef 100644 --- a/src/sfizz/FilterPool.cpp +++ b/src/sfizz/FilterPool.cpp @@ -15,6 +15,7 @@ sfz::FilterHolder::FilterHolder(Resources& resources) void sfz::FilterHolder::reset() { filter->clear(); + prepared = false; } void sfz::FilterHolder::setup(const Region& region, unsigned filterId, int noteNumber, float velocity) @@ -41,33 +42,20 @@ void sfz::FilterHolder::setup(const Region& region, unsigned filterId, int noteN baseGain = description->gain; baseResonance = description->resonance; - // Setup the modulated values - float lastCutoff = baseCutoff; - for (const auto& mod : description->cutoffCC) - lastCutoff *= centsFactor(resources.midiState.getCCValue(mod.cc) * mod.data); - lastCutoff = Default::filterCutoffRange.clamp(lastCutoff); - - float lastResonance = baseResonance; - for (const auto& mod : description->resonanceCC) - lastResonance += resources.midiState.getCCValue(mod.cc) * mod.data; - lastResonance = Default::filterResonanceRange.clamp(lastResonance); - - float lastGain = baseGain; - for (const auto& mod : description->gainCC) - lastGain += resources.midiState.getCCValue(mod.cc) * mod.data; - lastGain = Default::filterGainRange.clamp(lastGain); - ModMatrix& mm = resources.modMatrix; gainTarget = mm.findTarget(ModKey::createNXYZ(ModId::FilGain, region.id, filterId)); cutoffTarget = mm.findTarget(ModKey::createNXYZ(ModId::FilCutoff, region.id, filterId)); resonanceTarget = mm.findTarget(ModKey::createNXYZ(ModId::FilResonance, region.id, filterId)); - // Initialize the filter - filter->prepare(lastCutoff, lastResonance, lastGain); + // Disable smoothing of the parameters on the first call + prepared = false; } void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned numFrames) { + if (numFrames == 0) + return; + if (description == nullptr) { for (unsigned channelIdx = 0; channelIdx < filter->channels(); channelIdx++) copy({ inputs[channelIdx], numFrames }, { outputs[channelIdx], numFrames }); @@ -96,6 +84,11 @@ void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned if (float* mod = mm.getModulation(gainTarget)) add(absl::Span(mod, numFrames), *gainSpan); + if (!prepared) { + filter->prepare(cutoffSpan->front(), resonanceSpan->front(), gainSpan->front()); + prepared = true; + } + filter->processModulated( inputs, outputs, diff --git a/src/sfizz/FilterPool.h b/src/sfizz/FilterPool.h index 9e7f0522..f11ede24 100644 --- a/src/sfizz/FilterPool.h +++ b/src/sfizz/FilterPool.h @@ -53,6 +53,7 @@ private: ModMatrix::TargetId gainTarget; ModMatrix::TargetId cutoffTarget; ModMatrix::TargetId resonanceTarget; + bool prepared { false }; using filterRandomDist = std::uniform_int_distribution; filterRandomDist dist { 0, sfz::Default::filterRandom }; };