SPEC.mdpreviewSPEC.mdsource297 lines · 21.9 KB · raw

title: HEY! LISTEN! theme: jev status: made song: song.js measured: {"date":"2026-09-26","song":"d732366f1e92","total":{"loudnessDbfs":-21,"peakDbfs":-2.4},"parts":{"arps":{"loudnessDbfs":-33.8,"peakDbfs":-20.5},"bass":{"loudnessDbfs":-28.5,"peakDbfs":-11.4},"drums":{"loudnessDbfs":-25.2,"peakDbfs":-6.6},"lead":{"loudnessDbfs":-30.1,"peakDbfs":-8.4},"other":{"loudnessDbfs":-41.9,"peakDbfs":-5.6},"vocals":{"loudnessDbfs":-26.9,"peakDbfs":-4.1}},"sections":{"1-4":{"total":{"loudnessDbfs":-32.6,"peakDbfs":-22.4},"parts":{"arps":{"loudnessDbfs":-32.6,"peakDbfs":-22.4}}},"5-8":{"total":{"loudnessDbfs":-25.8,"peakDbfs":-3.8},"parts":{"arps":{"loudnessDbfs":-32.5,"peakDbfs":-22.2},"vocals":{"loudnessDbfs":-26.7,"peakDbfs":-4.1}}},"9-12":{"total":{"loudnessDbfs":-21,"peakDbfs":-4},"parts":{"arps":{"loudnessDbfs":-37.3,"peakDbfs":-26.6},"bass":{"loudnessDbfs":-32.5,"peakDbfs":-22.5},"drums":{"loudnessDbfs":-27.1,"peakDbfs":-11.2},"vocals":{"loudnessDbfs":-22.8,"peakDbfs":-4.3}}},"13-16":{"total":{"loudnessDbfs":-20.9,"peakDbfs":-2.4},"parts":{"arps":{"loudnessDbfs":-37.3,"peakDbfs":-27},"bass":{"loudnessDbfs":-32.6,"peakDbfs":-22.5},"drums":{"loudnessDbfs":-27.2,"peakDbfs":-11},"vocals":{"loudnessDbfs":-22.5,"peakDbfs":-4.6}}},"17-20":{"total":{"loudnessDbfs":-20.9,"peakDbfs":-5},"parts":{"arps":{"loudnessDbfs":-34,"peakDbfs":-23.7},"bass":{"loudnessDbfs":-34.5,"peakDbfs":-24.5},"drums":{"loudnessDbfs":-25.3,"peakDbfs":-9.9},"vocals":{"loudnessDbfs":-23.6,"peakDbfs":-5.8}}},"21-24":{"total":{"loudnessDbfs":-19,"peakDbfs":-2.7},"parts":{"arps":{"loudnessDbfs":-34.1,"peakDbfs":-23.7},"bass":{"loudnessDbfs":-25.4,"peakDbfs":-13.7},"drums":{"loudnessDbfs":-22.6,"peakDbfs":-6.8},"lead":{"loudnessDbfs":-24.3,"peakDbfs":-8.4},"vocals":{"loudnessDbfs":-131.3,"peakDbfs":-107.2}}},"25-28":{"total":{"loudnessDbfs":-20.1,"peakDbfs":-4.4},"parts":{"arps":{"loudnessDbfs":-34,"peakDbfs":-23.9},"bass":{"loudnessDbfs":-25.8,"peakDbfs":-13.6},"drums":{"loudnessDbfs":-22.9,"peakDbfs":-7.7},"lead":{"loudnessDbfs":-27.7,"peakDbfs":-16.7}}},"29-32":{"total":{"loudnessDbfs":-19.8,"peakDbfs":-3.5},"parts":{"arps":{"loudnessDbfs":-34.1,"peakDbfs":-23.7},"bass":{"loudnessDbfs":-25.3,"peakDbfs":-14.3},"drums":{"loudnessDbfs":-22.9,"peakDbfs":-7.7},"lead":{"loudnessDbfs":-27.4,"peakDbfs":-15.7},"vocals":{"loudnessDbfs":-256.2,"peakDbfs":-217.1}}},"33-36":{"total":{"loudnessDbfs":-19.8,"peakDbfs":-3.8},"parts":{"arps":{"loudnessDbfs":-37.3,"peakDbfs":-26.9},"bass":{"loudnessDbfs":-32.2,"peakDbfs":-18.4},"drums":{"loudnessDbfs":-27.1,"peakDbfs":-11},"lead":{"loudnessDbfs":-55.2,"peakDbfs":-32.7},"vocals":{"loudnessDbfs":-21,"peakDbfs":-4.3}}},"37-40":{"total":{"loudnessDbfs":-21.4,"peakDbfs":-3.8},"parts":{"arps":{"loudnessDbfs":-37.4,"peakDbfs":-27},"bass":{"loudnessDbfs":-32.6,"peakDbfs":-22.5},"drums":{"loudnessDbfs":-27.2,"peakDbfs":-11.2},"lead":{"loudnessDbfs":-383.5,"peakDbfs":-362.1},"vocals":{"loudnessDbfs":-23.3,"peakDbfs":-4.5}}},"41-44":{"total":{"loudnessDbfs":-21,"peakDbfs":-3.2},"parts":{"arps":{"loudnessDbfs":-33.9,"peakDbfs":-23.7},"bass":{"loudnessDbfs":-34.5,"peakDbfs":-24.5},"drums":{"loudnessDbfs":-25.3,"peakDbfs":-9.7},"lead":{"loudnessDbfs":-715.2,"peakDbfs":-695.1},"vocals":{"loudnessDbfs":-23.7,"peakDbfs":-4.2}}},"45-48":{"total":{"loudnessDbfs":-18.8,"peakDbfs":-2.6},"parts":{"arps":{"loudnessDbfs":-31.3,"peakDbfs":-20.5},"bass":{"loudnessDbfs":-25.1,"peakDbfs":-13.8},"drums":{"loudnessDbfs":-22.7,"peakDbfs":-6.6},"lead":{"loudnessDbfs":-24.3,"peakDbfs":-8.6},"vocals":{"loudnessDbfs":-92.4,"peakDbfs":-65.9}}},"49-52":{"total":{"loudnessDbfs":-19.8,"peakDbfs":-4.2},"parts":{"arps":{"loudnessDbfs":-31.2,"peakDbfs":-20.5},"bass":{"loudnessDbfs":-25.4,"peakDbfs":-13.5},"drums":{"loudnessDbfs":-22.9,"peakDbfs":-7.7},"lead":{"loudnessDbfs":-27.7,"peakDbfs":-16.7}}},"53-56":{"total":{"loudnessDbfs":-19.7,"peakDbfs":-3.9},"parts":{"arps":{"loudnessDbfs":-31.3,"peakDbfs":-20.5},"bass":{"loudnessDbfs":-25.6,"peakDbfs":-12.2},"drums":{"loudnessDbfs":-22.9,"peakDbfs":-7.7},"lead":{"loudnessDbfs":-27.4,"peakDbfs":-15.7}}},"57-60":{"total":{"loudnessDbfs":-20.1,"peakDbfs":-4.4},"parts":{"arps":{"loudnessDbfs":-31.2,"peakDbfs":-20.5},"bass":{"loudnessDbfs":-25.4,"peakDbfs":-11.4},"drums":{"loudnessDbfs":-22.9,"peakDbfs":-7.7},"lead":{"loudnessDbfs":-27.7,"peakDbfs":-16.7}}},"61-64":{"total":{"loudnessDbfs":-28.4,"peakDbfs":-5.5},"parts":{"arps":{"loudnessDbfs":-37.1,"peakDbfs":-24.1},"bass":{"loudnessDbfs":-45.5,"peakDbfs":-21.5},"drums":{"loudnessDbfs":-40,"peakDbfs":-16.5},"lead":{"loudnessDbfs":-64.4,"peakDbfs":-42.9},"other":{"loudnessDbfs":-29.6,"peakDbfs":-5.6}}}}} critic: date: 2026-09-26 model: jev-1.13.0 method: rubric-1 art: 0.67 artRuns: [0.67, 0.67, 0.67] criteria: hook: 3.5 development: 3.3 structure: 3.2 concept: 3.9 originality: 3.2 craft: 2.9 ideas:

  • date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Give me some song ideas as prompts, in the same Jev theme: perhaps with actual memes in the vocals, or a vocoder sound." brief: "Make a chiptune jungle track about Jev playing A Link to the Past. Use Navi's "Hey! Listen!" as the hook, the Zelda secret-found jingle when the drop lands, and "It's dangerous to go alone, take this" in the build. Add a vocoder voice singing "Jev plays Link to the Past" over the chords. Square-wave leads, SNES-style reverb, 170 bpm."
  • date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Research Jev's real use cases; jab at people using Jev where deterministic code would do better, such as game bots." brief: "Your own ALttP project, and it jokes at its own expense. Navi's "Hey! Listen!" as the hook and the secret-found jingle on the drop. A vocoder sings "Jev picks the goal, Rust walks Link", making the point that pathfinding stays in code. Square-wave leads and SNES reverb." revisions:
  • rev: 1 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Make a chiptune jungle track about Jev playing A Link to the Past. Use Navi's "Hey! Listen!" as the hook, the Zelda secret-found jingle when the drop lands, and "It's dangerous to go alone, take this" in the build. Add a vocoder voice singing "Jev plays Link to the Past" over the chords. Square-wave leads, SNES-style reverb, 170 bpm." output: null # overwritten by rev 2 art: 0.59 artRuns: [0.58, 0.59, 0.59]
  • rev: 2 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Let Jev arrange the song as it plays. Name each 4-bar section and the sections allowed to follow it, keeping the 8-bar chord cycle intact; at each section Jev picks the next section, the move to play it with (as written, no drums, the chiptune alone, the breakbeat alone), and how intense it is, and ends the song by choosing the outro and Navi's last "Hey!", with a hard cap of 24 sections. Tell Jev the tempo, key, chords, lyrics and everything played so far, and how the listener reacted. Without Jev it plays as written." output: null # overwritten by rev 3 art: 0.66 artRuns: [0.66, 0.65, 0.67]
  • rev: 3 date: 2026-09-25 model: claude-opus-5-5 harness: claude-code prompt: "Fix the mix and make every line true and heard. Stop the clipping: peaks at or under -1 dBFS, the drums 3-4 dB over the bass and vocals, and the lead and the secret-found jingle carrying the drops within about 4 dB of the drums, with the jingle landing alone. Make the builds rise across all four bars. Replace the lines that describe the project wrongly: a C bot walks Link and Jev is asked about three times a minute to pick the goal, and the WASM build does not exist yet. Make "Jev" and "WASM" intelligible, and use an old man's clip that says "alone". Navi's last Hey! comes before the final hit, at full whatever the energy. Every vocoded line must be sung, so build 2 only follows verse 2. A fill replaces the break for the last half-bar, never plays into a drop, and follows the drums level. Use a real crash, let the snare rolls rise across both bars, and tell Jev only what the music does: which parts play in each section, back relative to the loudest part, and a dropout that lets the reverb ring." output: null # overwritten by rev 4 art: 0.67 artRuns: [0.67, 0.67, 0.67]
  • rev: 4 date: 2026-09-26 model: claude-opus-5-5 harness: claude-code prompt: "Keep Jev from looping a drop: each drop's loop may go round once more at most (drop1b, drop2b and drop2c play at most twice), so no run of drop sections passes 24 bars. Drop the detour from drop2d back to drop1, which could never end within the cap." output: song.js art: 0.67 artRuns: [0.67, 0.67, 0.67]

HEY! LISTEN! — spec

song.js is generated from this spec. Change the spec first, then the song.

Intent

A song for the user's own project, ~/jev ("Jev plays SNES", ~/brains/personal/technology/artificial-intelligence/jev/jev-plays-snes.md): a Rust app that hosts the jgenesis snes-core as a library so Jev plays A Link to the Past. Since 2026-09-21 a C bot (zbanks/alttp, vendored and hosted by the app) walks Link and presses the buttons, and Jev is asked only at the goal choice, about three times a game-minute (the page's "the C bot plays" and "Jev back at the goal choice" sections). The native build plays; the WASM build is planned and not yet made (the page's Outstanding list: "First buck2 WASM build").

The second brief's lyric "Jev picks the goal, Rust walks Link" comes back, corrected: rev 1 dropped it because the page did not then say pathfinding stays in code. It now does, except that the walking is C, not Rust, so the line is sung as "The bot walks, Jev picks". This was a wrong premise, not something the user withdrew. The lyrics below say only what the page does.

Style

  • Chiptune jungle, 170 bpm, G minor (ALttP-ish modal colour): Gm – Eb – F – D, two bars per chord, so each vocoded line sits on one chord.
  • Square/pulse leads with a wide SNES-style reverb; triangle bass; rolling amen under a jungle two-step kick.
  • The Zelda secret-found jingle written as notes (G5 F#5 D#5 A4 G#4 E5 G#5 C6, the note names checked against published transcriptions), seven 16ths and a held last note on a square lead, landing each drop alone: the lead melody rests for the jingle's bar, and both share one reverb (size .8).
  • The crash is Dirt-Samples hh27:1 (a real crash; cr is a ride), matched to the drums by level.
  • Mix. Peaks at or under −1 dBFS, measured (superdough has no limiter, so a master level sets it). The drums sit about 3–4 dB over the bass and vocals; the lead and the secret jingle carry the drops, within about 4 dB of the drums.

Structure

64 bars (~1:30).

BarsSectionContents
1–8IntroSquare arpeggio; "Hey! Listen!" on bar 5
9–16Verse 1Vocoder lines 1–4; half-speed beat, triangle bass
17–20Build 1"It's dangerous to go alone! Take this." on 17; rises across all 4 bars: the arpeggio's filter opens from 400 Hz to 3.2 kHz over a triangle pedal on G; snare roll in 19–20, rising across its two bars
21–32Drop 1Secret jingle alone on 21 (the lead rests that bar), crash; instrumental: two-step kick, amen, reese, chip lead from 22
33–40Verse 2Vocoder lines 5–8
41–44Build 2"Hey! Listen!" on 41 and 43; rises like build 1; roll in 43–44
45–60Drop 2Secret jingle alone on 45, crash; instrumental, bigger: 16th hats, double-time arp, lead from 46
61–64OutroArp alone; Navi's last "Hey!" on bar 63 beat 1, then the last hit (kick, 808, crash) on beat 3

Verse 2 starts on bar 33 so each vocoded line lands on the first bar of its chord (the harmony cycles every 8 bars); so drop 1 is 12 bars and drop 2 is 16.

Vocals

  • Vocoder, one line per 2 bars:
    1. "Jev plays Link to the Past" — Gm
    2. "The core's a library" — Eb (page: "The core: jgenesis snes-core")
    3. "Three questions a minute" — F (page, "Jev back at the goal choice": "3.1 questions/min" over 10 game-minutes)
    4. "The bot walks, Jev picks" — D (page, "the C bot plays": the vendored zbanks/alttp bot "drives the window"; "Jev at the goal choice": Jev picks among the goals the bot offers)
    5. "Native now, WASM some day" — Gm (page: the native app plays; "First buck2 WASM build" is still open)
    6. "Same program, both" — Eb (page: "It also makes the web build the same program rather than a port")
    7. "Hey, listen" — F (vocoded, answering the real clip)
    8. "Jev plays Link to the Past" — D
  • Jev is sung "Jehv", slower (SAPI rate −4, with a comma after it): the plain spelling is heard as "Jeff", "Jiv" or "Chip". A line is kept only when whisper.cpp or openai-whisper reads every word back, and a "Jev" line only when two whisper models read Jev or Jehv.
  • Memes: Navi's "Hey! Listen!" (Ocarina of Time); "It's dangerous to go alone! Take this." (The Legend of Zelda, 1986), in a fan reading of the 1986 game's on-screen text, since the game itself is silent.

Jev in the booth

Jev arranges the song as it plays, as two jevs declared at the top in TypeSafe's own shape (jev({ state, questions }), website/src/jev/), both given the song as state (subject, tempo, key, chords, lyrics, and which parts play in each section, partsBySection):

  • formJev asks one choice: which section plays next, among the song's sixteen 4-bar sections. Each section's description says what plays in it, part by part, from the same partsBySection map.
  • djJev asks, once that is decided, a level for each part (arpeggios, lead, drums, bass, voices: out, back or full in this section), how the song moves into it, and a score for the section's energy. Questions in one request cannot see each other's answers, so it is a second request, told the section just chosen (after: { section }).

Both are asked every 4 bars (.every(4, …)), and the answers are composed in ordinary Strudel at the bottom: walk holds the form's rules, each part plays at its level, the transition plays over the last bar before the section, and energy.score scales the velocity.

The form. A section may be followed only by these:

SectionBars as writtenMay be followed byPlays at most
intro1–4introB
introB5–8verse1
verse19–12verse1b
verse1b13–16build1
build117–20drop1
drop121–24drop1b
drop1b25–28drop1ctwice
drop1c29–32verse2, verse1, drop1b
verse233–36verse2b
verse2b37–40build2, build1
build241–44drop2
drop245–48drop2b
drop2b49–52drop2ctwice
drop2c53–56drop2d, drop2btwice
drop2d57–60outro, drop2c
outro61–64(the end)

Loops end. Uncapped, the ways back let Jev repeat a drop until the cap: up to 48 bars of it in a row. So drop1b, drop2b and drop2c, where the drops' loops return, each play at most twice (times in walk, which counts every play: a loop is a cycle of different sections, and none of them repeats back to back), and each loop goes round once more at most. The longest run of a drop any path can now take is 24 bars. Every detour can still play, the written order is never capped, and a section that has played its most is not offered, nor is one that could only reach the ending through one.

The detour from drop2d back to drop1 is gone: from drop2d, the shortest way on through drop1 (drop 1 again, verse 2, build 2 and drop 2) could never end within the cap of 24 sections, so Jev was never offered it. walk now refuses a way on that can never be taken.

Sections are 4 bars because the builds and the outro are. The chords turn over every 8 bars (Gm Eb | F D), so every section may only be followed by one that starts on the other half of the turn: the harmony never skips or repeats a half. Builds lead only into their drop, so every secret-found jingle lands where it should. Every vocoded line is sung at least once: build 2 comes only after verse 2, so no path to the outro skips lines 5–8 (in rev 2 drop 1 could go straight to build 2, and Jev took it on every run). The verse options quote their own lines, so Jev knows what a skip would cost. These rules are code (walk), not Jev: each request offers Jev only the sections allowed next. The written order is always allowed, and it is what plays when Jev can't be reached. The song ends when Jev picks the outro, whose last hit and "Hey!" always close it. The cap is 24 sections (about 2:15), not 16: at 4 bars a section the song as written is already 16, and a cap of 16 would leave Jev no room to repeat anything.

The parts. Each question says what the part is and where it plays as written: the arpeggios (the square-wave chords, in every section, doubled in drop 2), the lead (only in the drops: the melody, and the secret-found jingle that lands each drop alone), the drums (the verses' half-speed beat, the builds' snare rolls, the drops' amen break and 808), the bass (triangle in the verses, a triangle pedal in the builds, supersaw and sine sub in the drops), and the voices (the vocoded verses, Navi and the old man; the outro's last Hey! always plays). Which parts play in each section as written:

SectionParts
introarps
introBarps, vocals
verse1, verse1b, verse2, verse2barps, drums, bass, vocals
build1, build2arps, drums, bass, vocals
drop1 … drop1c, drop2 … drop2darps, lead, drums, bass
outroarps (and the ending, which always plays)

Jev sets each one's level: out (silent for the section), back (under the loudest part) or full (as loud as written), so it can drop parts to build tension, pull them back to make space, and bring them in full for the payoff. The answer is Jev's probability-weighted score: under 0.5 the part is silent. Back is relative: each part's velocity is its score divided by the highest score among the parts that play in that section and are not out, so the loudest part Jev chose plays as written and a part at back plays at half of it. Setting every part to back leaves the section as written; only energy sets the overall level. Each part plays on its own orbit, named for its question (orbit('arps'), …), so the meter hears it alone. A part keeps its own masks, so the jingle still lands only on the first bar of a drop and the voices only where the structure table puts them. The ending (Navi's last "Hey!" and the last kick, 808 and crash) always plays, at full: it sits outside the part levels and outside the energy, so Jev's outro energy never turns down the punchline. When Jev can't be reached, every part plays in full.

The transitions. Jev also picks how the song moves into each section, played over the last bar of the section before it, with the next section's answer (.early(1)): a cut (straight in), a fill (an amen fill, the break chopped into rolls down into the first beat: it replaces the running break and snare roll for the section's last half-bar, so no hit doubles; it follows the drums level; and it never plays into a drop, because a build's snare roll already is that fill, and the half-bar keeps it off the tail of each vocoded line), a riser (a square-wave sweep climbing three octaves, in the arpeggios' reverb), or a dropout (the parts stop for the last beat and their reverb rings on into the gap). The outro keeps its last beat, and without an answer it is a cut.

A little chance. The section is sampled from Jev's probabilities at temperature 0.7 (sample), so two plays of the song can take different paths; the strip shows Jev's top pick beside the one sampled. A close call between sections is where sampling matters most, so there is no confidence threshold: an unsure Jev still picks, and the written order plays only when Jev can't be reached.

Energy is a four-step ladder: held back (0.55), steady (0.7), driving (0.85, a touch under full) and all out (1, as written). It scales every part's velocity together, on top of the part levels, so the mix keeps its balance; the ending is outside it. A master level on the whole song (postgain(.5)) keeps all out, as written, under −1 dBFS: measured at a −3.5 dBFS peak as written (2026-09-25; the page's meter samples peaks, and one run read −0.3 at postgain(.6), so .5 leaves that margin).

  • Bars 1–4 always play as written.
  • Each request tells Jev the song's state (subject, tempo, key, chords, lyrics), everything played so far, how loud each finished section measured in the browser, which sections may come next and how many are left before the cap, and the 🔥/😴 reactions from the listener's tab.
  • A section plays its own bars, so a repeated verse sings the same lines and a repeated drop replays its jingle.
  • This relaxes the constraints below that the song plays once in a fixed order and never varies by chance: the arrangement varies with Jev's choices, which are judgments, with a little sampled chance in the form.

Constraints

  • Plays once from bar 1 and ends; never loops. Sections are absolute-cycle masks, so playback starts from stopped.
  • Structured: patterns vary by section, never by chance. (Random chopping read as noise on the first song.)
  • No sustained background pad; harmony comes from rhythmic parts.
  • Vocals only where the structure table puts them; drops are instrumental.
  • Meme clips are the meme's best-known audio (myinstants, or YouTube via yt-dlp), cut at word timings measured with whisper, and kept only when whisper reads every word back. Where the best-known clip swallows a word (myinstants' "It's dangerous…" is read as "to go, but don't take this"), the clip is re-sourced from one that says it. Vocoder lines are made with speak + vocode on the chord they land on, and checked by transcribing the result with whisper. Everything lands in samples/<sound>/ with a provenance row in samples/README.md.
  • Samples load from samples('jev-samples/strudel.json'); drums from github:tidalcycles/dirt-samples.