#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 // owned here and shared across slots. // =========================================================================== 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: std::array, 9> units; juce::AudioBuffer dry, wet; }; } // namespace serum