#pragma once #include #include "Params.h" namespace serum { // =========================================================================== // Base class for a stereo effect unit. Each unit processes a full-wet buffer. // =========================================================================== class FXUnit { public: virtual ~FXUnit() = default; virtual void prepare (double sampleRate, int maxBlockSize) = 0; virtual void reset() = 0; virtual void process (float* l, float* r, int numSamples, const float p[4]) = 0; }; // =========================================================================== // Snapshot of one FX slot. // =========================================================================== struct FxSlotParams { int type = (int) FxType::Off; float mix = 0.0f; float p[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; }; // =========================================================================== // Reorderable effects rack. Slots are processed in list order; reordering is // simply swapping FxSlotParams entries. Nine effect unit implementations are // preconstructed per slot with independent DSP history. // =========================================================================== class FXProcessor { public: FXProcessor(); ~FXProcessor(); void prepare (double sampleRate, int maxBlockSize); void reset(); void process (juce::AudioBuffer& buffer, const FxSlotParams* slots, int numSlots); static juce::String fxTypeName (int type); private: static constexpr int kNumEffectTypes = (int) FxType::Count - 1; std::array, kNumEffectTypes>, kNumFxSlots> units; std::array activeTypes {}; juce::AudioBuffer wet; }; } // namespace serum