diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index 49c3c3db..766c1786 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -491,11 +491,11 @@ void sfz::Synth::finalizeSfzLoad() regions.resize(currentRegionCount); modificationTime = checkModificationTime(); - for (auto& voice : voices) { - voice->setMaxFiltersPerVoice(maxFilters); - voice->setMaxEQsPerVoice(maxEQs); - voice->prepareSmoothers(maxModifiers); - } + settingsPerVoice.maxFilters = maxFilters; + settingsPerVoice.maxEQs = maxEQs; + settingsPerVoice.maxModifiers = maxModifiers; + + applySettingsPerVoice(); } bool sfz::Synth::loadScalaFile(const fs::path& path) @@ -1205,6 +1205,17 @@ void sfz::Synth::resetVoices(int numVoices) } this->numVoices = numVoices; + + applySettingsPerVoice(); +} + +void sfz::Synth::applySettingsPerVoice() +{ + for (auto& voice : voices) { + voice->setMaxFiltersPerVoice(settingsPerVoice.maxFilters); + voice->setMaxEQsPerVoice(settingsPerVoice.maxEQs); + voice->prepareSmoothers(settingsPerVoice.maxModifiers); + } } void sfz::Synth::setOversamplingFactor(sfz::Oversampling factor) noexcept diff --git a/src/sfizz/Synth.h b/src/sfizz/Synth.h index 00372288..9835b593 100644 --- a/src/sfizz/Synth.h +++ b/src/sfizz/Synth.h @@ -631,6 +631,10 @@ private: * @param numVoices */ void resetVoices(int numVoices); + /** + * @brief Make the stored settings take effect in all the voices + */ + void applySettingsPerVoice(); /** * @brief Render the voice to its designated outputs and effect busses. @@ -702,6 +706,14 @@ private: int noteOffset { 0 }; int octaveOffset { 0 }; + // Settings per voice + struct SettingsPerVoice { + size_t maxFilters { 0 }; + size_t maxEQs { 0 }; + ModifierArray maxModifiers { 0 }; + }; + SettingsPerVoice settingsPerVoice; + Duration dispatchDuration { 0 }; Parser parser;