From d3592214b1c5d0bb5950ef4908cfcd6594574663 Mon Sep 17 00:00:00 2001 From: Paul Fd Date: Sun, 9 Feb 2020 16:49:54 +0100 Subject: [PATCH] The filters have to be initialized with samplerate --- src/sfizz/FilterPool.cpp | 13 ++++++++++++- src/sfizz/FilterPool.h | 14 +++++++++++++- src/sfizz/Synth.cpp | 2 ++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/sfizz/FilterPool.cpp b/src/sfizz/FilterPool.cpp index 6922d6ef..d037abc4 100644 --- a/src/sfizz/FilterPool.cpp +++ b/src/sfizz/FilterPool.cpp @@ -59,7 +59,7 @@ void sfz::FilterHolder::process(const float** inputs, float** outputs, unsigned lastGain = baseGain; for (auto& mod: description->gainCC) { - lastResonance += midiState.getCCValue(mod.first) * mod.second; + lastGain += midiState.getCCValue(mod.first) * mod.second; } filter.process(inputs, outputs, lastCutoff, lastResonance, lastGain, numFrames); @@ -132,3 +132,14 @@ size_t sfz::FilterPool::setNumFilters(size_t numFilters) return filters.size(); } + +void sfz::FilterPool::setSampleRate(float sampleRate) +{ + for (auto& filter: filters) + filter->setSampleRate(sampleRate); +} + +void sfz::FilterHolder::setSampleRate(float sampleRate) +{ + filter.init(static_cast(sampleRate)); +} diff --git a/src/sfizz/FilterPool.h b/src/sfizz/FilterPool.h index cb1da2c9..b76d48da 100644 --- a/src/sfizz/FilterPool.h +++ b/src/sfizz/FilterPool.h @@ -47,6 +47,12 @@ public: * @return float */ float getLastGain() const; + /** + * @brief Set the sample rate for a filter + * + * @param sampleRate + */ + void setSampleRate(float sampleRate); private: /** * Reset the filter. Is called internally when using setup(). @@ -103,10 +109,16 @@ public: * @return size_t the actual number of filters in the pool */ size_t setNumFilters(size_t numFilters); + /** + * @brief Set the sample rate for all filters + * + * @param sampleRate + */ + void setSampleRate(float sampleRate); private: std::atomic givingOutFilters { false }; std::atomic canGiveOutFilters { true }; - + float sampleRate { config::defaultSampleRate }; const MidiState& midiState; std::vector filters; }; diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 53761633..c61bb0c9 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -401,6 +401,8 @@ void sfz::Synth::setSampleRate(float sampleRate) noexcept this->sampleRate = sampleRate; for (auto& voice : voices) voice->setSampleRate(sampleRate); + + resources.filterPool.setSampleRate(sampleRate); } void sfz::Synth::renderBlock(AudioSpan buffer) noexcept