2.4 KiB
AquaSynth Instructions
Purpose
AquaSynth is the C# authoring and compiler front-end for AquaSynth synth patches. It owns patch graph models, terse patch scripting, SFXR-derived patch mapping, analysis/scoring tools, preset catalogs, and Faust source/code generation for the AquaSynth/Vortice engine path.
The AquaSynth-rs branch may remain a reference lab and audio renderer. This repo should not depend on AquaSynth-rs for reusable authoring, analysis, preset, or Faust compiler behavior.
Persistent State
state/map.yamlis the canonical repo map.state/spine.yamlis the rehydration spine for multi-agent synth library work.state/memory.jsonstores durable project taste, doctrine, and decisions.state/scratch.mdis disposable current-slice working context.state/evidence.jsonlstores short lessons that should change future work.docs/audio-doctrine.mdis the live doctrine for DSP, realtime audio, and patch-language design.
Update these when the synth learns something durable. Delete stale guidance instead of stacking little commemorative plaques in the hallway.
Operating Doctrine
- Keep the audio work in this repo self-contained. External Faust is a compiler target, not an excuse to hide local contracts.
- Authoring code may allocate, parse, search, score, and explain. Generated DSP and runtime-facing code must assume realtime rules: no unbounded waits, no filesystem, no console I/O, no locks, no surprise allocation.
- Treat patch scripts as a dataflow language: terse surface, explicit graph, analyzable AST, deterministic lowering.
- Separate control-rate intent from audio-rate signal work. LFOs, envelopes, UI controls, and buses need clear rate semantics even when they compile into one Faust expression.
- Favor block-structured reasoning. Buffer-oriented APIs should make block size, sample rate, latency, and channel count visible where they matter.
- Keep Faust output boring and inspectable. The DSL may be expressive; emitted Faust should be stable, readable enough to debug, and easy to diff.
- Analysis metrics are tools, not judges. Spectral and envelope comparisons catch regressions; listening, target references, and gameplay context still matter.
Verification
Use focused checks:
dotnet test
For compiler-affecting changes, make sure tests cover parse -> patch -> Faust source. If Faust is installed, validation tests should continue to pass.