From 4748bfe768c746080d6bf4d1206caa3d8cbd5af7 Mon Sep 17 00:00:00 2001 From: Igor Barcik Date: Wed, 9 Sep 2026 14:32:58 +0200 Subject: [PATCH] refactor(fx): give each FX slot independent DSP history MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the single shared array of 9 effect units with a 2D array of kNumFxSlots × kNumEffectTypes, so each slot owns its own DSP state. This prevents state bleed when the same effect type appears in multiple slots and allows reordering without carrying over internal history. Track activeTypes to skip unchanged slots. Remove the dry buffer since it was unused. --- Source/FXProcessor.cpp | 27 +++++++++++++++------------ Source/FXProcessor.h | 8 +++++--- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/Source/FXProcessor.cpp b/Source/FXProcessor.cpp index 72a296b..3e4e9a8 100644 --- a/Source/FXProcessor.cpp +++ b/Source/FXProcessor.cpp @@ -14,24 +14,27 @@ namespace serum FXProcessor::FXProcessor() { - units[0] = std::make_unique(); - units[1] = std::make_unique(); - units[2] = std::make_unique(); - units[3] = std::make_unique(); - units[4] = std::make_unique(); - units[5] = std::make_unique(); - units[6] = std::make_unique(); - units[7] = std::make_unique(); - units[8] = std::make_unique(); + for (auto& slotUnits : units) + { + slotUnits[0] = std::make_unique(); + slotUnits[1] = std::make_unique(); + slotUnits[2] = std::make_unique(); + slotUnits[3] = std::make_unique(); + slotUnits[4] = std::make_unique(); + slotUnits[5] = std::make_unique(); + slotUnits[6] = std::make_unique(); + slotUnits[7] = std::make_unique(); + slotUnits[8] = std::make_unique(); + } } FXProcessor::~FXProcessor() = default; void FXProcessor::prepare (double sampleRate, int maxBlockSize) { - for (auto& u : units) - u->prepare (sampleRate, maxBlockSize); - dry.setSize (2, maxBlockSize, false, false, true); + for (auto& slotUnits : units) + for (auto& u : slotUnits) + u->prepare (sampleRate, maxBlockSize); wet.setSize (2, maxBlockSize, false, false, true); reset(); } diff --git a/Source/FXProcessor.h b/Source/FXProcessor.h index 9eb6876..bc3919a 100644 --- a/Source/FXProcessor.h +++ b/Source/FXProcessor.h @@ -31,7 +31,7 @@ struct FxSlotParams // =========================================================================== // Reorderable effects rack. Slots are processed in list order; reordering is // simply swapping FxSlotParams entries. Nine effect unit implementations are -// owned here and shared across slots. +// preconstructed per slot with independent DSP history. // =========================================================================== class FXProcessor { @@ -47,8 +47,10 @@ public: static juce::String fxTypeName (int type); private: - std::array, 9> units; - juce::AudioBuffer dry, wet; + static constexpr int kNumEffectTypes = (int) FxType::Count - 1; + std::array, kNumEffectTypes>, kNumFxSlots> units; + std::array activeTypes {}; + juce::AudioBuffer wet; }; } // namespace serum