Files
serumalt/Source/Modulation/AGENTS.md
T
biggy 4b0db50271 refactor(source): move every implementation into its module directory
- 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.
2026-10-06 09:17:49 +02:00

1.4 KiB

modulation module

Owned files

  • ModulationMatrix.h, ModulationMatrix.cpp
  • MacroControls.h, MacroControls.cpp
  • RAVEButton.h, RAVEButton.cpp, which define RaveController

Rules

  • Use bool return codes for bounded inserts (addConnection, addAssignment).
  • Require a cap on connection and assignment counts (kMaxConnections, kMaxAssignments).
  • Serialise and restore state through juce::ValueTree so presets survive save and load.
  • Never accept a ModTarget::None connection; reject it and return false.
  • RaveController applies a non-destructive boost to render settings. It does not write APVTS parameters or keep a restoration snapshot.
  • Keep the existing RAVEButton filenames unless a rename is explicitly in scope.

GUI/audio state

Hold Engine::getControlLock() while reading or editing the control-side matrix, macro assignments, or LFO shapes. The audio thread tries that lock once per block and copies into reserved audio-side storage. If the lock is busy, it keeps the previous settings and continues rendering. Never iterate the control-side vectors from the render path.

Master and FX-mix modulation use global sources directly. Per-voice sources for those destinations come from the newest active voice.

If addConnection or addAssignment returns false, handle the failed insert.

This file refines the repository-root AGENTS.md for the related sources.