For agents, on top of README.md, which they read first.
Notes for agents
Stop playback before playing song.js. Its section masks count from cycle 0.
Every mask is 64 steps. The last 4 bars are the weide section: the 10.2 s theme holds 3 bars (.clip(3)) and fades over the fourth (.release(1.3), seconds), so it ends with its section instead of ringing past it.
The harmony moves every two bars on purpose. Each vocoded line is rendered on one chord (C, G, Am, F voicings in the samples provenance), so it must start on the first bar of its chord. tftypesafe is rendered on C and sped up to fit two bars at 180 bpm.
The XP riff's speeds are pitches. tfxperror is centred on C (measured: C4 → G3 → C3), so speed 1 = C and the riff's ratios spell the chord tones. Swap the sample and they are no longer in key.
Each drop section has its own four bars of amen edits (edits, keyed by section). Sections start on multiples of 4, so a 4-bar row plays only in its own section; a longer row would put the wrong bars in a repeated section.
Lines, the intro riff and the Weide theme are not parts. They play outside part() and the energy, so Jev can neither mute nor quiet them. Don't move them back.
Tempo-bound values: tfohno fills exactly bar 36 (1.31 s), the chorus stutters start 0.5 s into bars 20 and 44 after the memes' last words, transitions start on beat 2 after the line tails in bars 16 and 40, and the Weide fade's .release(1.3) is one bar: all assume 180 bpm. Re-cutting a meme means re-timing its stutter.
Measuring needs the new samples served. The dev server's sample map is the main tree's; a worktree's new or re-cut samples are not in it until merged.