- 36 files move into the module whose AGENTS.md already claimed them: Engine/, Synth/, Modulation/, Params/, Plugin/, GUI/, EffectUnits/, Resources/ - Source/engine, modulation, params, plugin and synth become Engine, Modulation, Params, Plugin and Synth, matching the directories that already hold code - ExactCompare.h stays at the Source/ root as the one shared header - SERUMALT_INCLUDE_DIRS adds one include directory per module, so the 31 parent-relative includes become plain names with no path prefix - the module AGENTS.md files list owned files instead of describing a move that had not happened, and README.md and AGENTS.md describe the real tree Verified: the harness passes CTest, the Linux VST3 and Standalone link, the Windows cross-build passes its module checks, each configure exposes only its own targets, no first-party warning line appears, and the generated Windows manifest is unchanged.
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <JuceHeader.h>
|
|
#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<float>& buffer, const FxSlotParams* slots, int numSlots);
|
|
|
|
static juce::String fxTypeName (int type);
|
|
|
|
private:
|
|
static constexpr int kNumEffectTypes = (int) FxType::Count - 1;
|
|
std::array<std::array<std::unique_ptr<FXUnit>, kNumEffectTypes>, kNumFxSlots> units;
|
|
std::array<int, kNumFxSlots> activeTypes {};
|
|
juce::AudioBuffer<float> wet;
|
|
};
|
|
|
|
} // namespace serum
|