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.
Sing only what the papers say. SPEC.md's table sets the brief against the two papers: neither says "robotic", "hiss", "sibilance", "mush", "phase modulation" or "vocoder sizzle", and TQCodec's bit allocation favours the low frequencies, not the 3–8 kHz band. "Almost metallic, like a snake" is the listener's ear and is sung as that. A new line needs its source in the Vocals table.
Neither paper links the band to generated music. TQCodec is a streaming codec that found its own RVQ noisy at 3000–8000 Hz on real music; WanSong names no band and no hiss. The link is the brief's, and song.what and the spec's Intent say so: keep the text Jev reads from crediting either paper with it.
The snake never goes through codec(). It is what the codec leaves behind: crushing it turns the band-limited hiss into broadband grit and the 3–8 kHz point is lost. Its band is two resonant filters (hiss), and the ending's last hiss uses the same ones.
The codec is section masks, not Jev. rough, scan, half and clean follow the bars as written, which form.arrange moves with each section, so a section sounds the same wherever Jev plays it. The hunt's last four bars are in none of the four masks on purpose: everything under codec() is silent there, and the kick under the snake is written outside it.
Nothing after the fix leads back before it. The form's one choice is whether the clean chorus repeats; a way from flow or later back to a rough section would bring the snake back after the song said it was gone.
What a passage is made of is not a part. These play outside part(), so Jev cannot turn them off: "That's a snake" (found), "Two stems, one run" (alone), the snake alone in the hunt and its answer in chorus 1 (snakeSolo), and the arpeggio in bars 1–4 (opening). They keep their part's orbit, so the meter and the level questions still see them. The ending is outside every level and the energy. The sung lines have no "out": vocals is a two-level question (back, full), played through sung(), not part().
A held note needs stopping() to honour a dropout. The gap mask only removes onsets in a section's last beat; a note already sounding rings through it. stopping(held, cut) plays the cut form on a dropout bar. It reads the next section's transition, so use it only where a next section always exists (not in the outro). Chorus 1's two-bar answer starts a bar early and reads it two bars ahead (dropsOutAfter).
No delay time in seconds. The echoes use superdough's default, delaysync 3/16 (a dotted eighth at the song's tempo). .delaytime(.375) is a dotted eighth at 120 bpm only.
The harmony moves every two bars on purpose. Each vocoded line is rendered on one chord (samples/README.md lists which). "Three to eight kilohertz" exists twice, shkhza on Am (the choruses) and shkhzf on F (the hunt).
Re-measure after any level change. measured: holds only for the song.js whose hash it records.