chore: land janitor round 1 and graft integration

Round 1 findings and fixes, all previously uncommitted:
- FXProcessor per-slot DSP history repair (HEAD does not compile without it)
- SynthVoice::getModulationValue, editor control-lock guard
- ExactCompare.h naming the deliberate exact float comparisons
- KnobLookAndFeel replacing the never-installed SerumLookAndFeel
- 55 first-party compiler warnings to 0
- AGENT.md renamed to AGENTS.md across Source/
- graft repository context graph and its hooks
- JANITOR_TASKS.md and UI_UX_AUDIT.md records
This commit is contained in:
biggy committed 2026-10-06 08:50:45 +02:00
1 parent 5c942cad0c
commit e4cea300db
63 files changed
+2360 -805

No files matched your search

@@ -3,8 +3,7 @@
## Related source files
This directory contains guidance. All files listed below remain in the parent
`Source/` directory. The preparation rules below are requirements for changes,
not a claim that lazy wavetable allocation has already been fixed.
`Source/` directory.
- Wavetable.h, Wavetable.cpp
- Oscillator.h, Oscillator.cpp
@@ -26,10 +25,11 @@ not a claim that lazy wavetable allocation has already been fixed.
- Use `(size_t)` casts when indexing containers with int loop variables.
- Pass global per-block state into voices as a `const RenderContext&`.
- Never allocate memory in the audio path.
- Keep oscillator phase when changing held-note parameters. LFO phase offsets are separate from the running phase.
## IF-THEN
- IF a wavetable is read in the render path THEN build all tables in `prepare()` by calling `WavetableLibrary::prebuild()` before the first block.
- Wavetables are prebuilt during Engine construction. Audio and GUI code read them without triggering generation.
- IF a parameter is read every block THEN snapshot it into a struct (`OscParams`, `RenderContext`) instead of reading the APVTS per sample.
## Examples
@@ -40,8 +40,8 @@ const Wavetable& wt = library.getTable (wave);
```
```cpp
// GOOD: build once at prepare time, then only read const references
library.prebuild(); // in prepareToPlay
// GOOD: build once in the Engine constructor, then only read const references
library.prebuild(); // in the Engine constructor
const Wavetable& wt = library.getTable (wave); // lookup, no allocation
```
@@ -55,4 +55,4 @@ const double step = 6.28318530717958647692 * freq / sr;
const double step = juce::MathConstants<double>::twoPi * freq / sr;
```
This file overrides /AGENT.md where they conflict.
This file overrides /AGENTS.md where they conflict.