1@README.md 2 3## Notes for agents 4 5**Stop playback before playing `song.js`.** Its section masks count from cycle 0. 6 7**The chord cycle is rotated on purpose.** It starts on Dm7 so the verses (cycles 4 and 20) open on Fmaj7; each vocoded line is rendered on one chord (`samples/README.md` lists which). The verse patterns are rotated to match: `<…>` indexes by cycle mod 8, so line 1 sits at index 4. Move a section and both rotations must move with it, or the lines must be re-rendered. 8 9**`ffhum` is one bar at 80 bpm, eight 8th-note slices.** It is exactly 3.0 s: the hum's thumps cut on their transients and placed on the 8th grid, each tuned to a note (slice 0 A, 1 E, 2 D, 3 a short thump, then again; `samples/README.md` has how). `slice(8, …)` assumes that; change the tempo and it must be re-cut. 10 11**Don't use `.delay()` for the vocal echo.** Superdough makes its delay line with the Web Audio default one-second maximum, so any `delaytime` over 1 s plays at 1 s (measured in Chromium, 2026-09-25). The echo is a second copy of each line, `.late(3/4)`. 12 13**The mix is set by its peaks.** Nothing limits the master, so up front (energy rung 3, postgain 1.1) must peak at or under −1 dBFS. The page's meter samples a fraction of the time and reads peaks low; check a capture of the output, not the meter. The vocal lines are peak-limited to −4.5 dBFS at −17.3 LUFS so they can sit forward. 14 15**The play-once mask stays `.mask("<1!48 0!952>")`.** The card's length and `tools/measure` parse that exact shape; the early stop after "This is fine" is a second mask (`ending`). 16 17**The fade is `velocity` on the inner stack.** Every layer except "This is fine" and the crackle sits inside it; don't put a `.gain()` on that stack, which would override each layer's own gain instead of scaling it.