SPEC.mdpreviewSPEC.mdsource245 lines · 17.3 KB · raw

title: YOU'VE GOT JEV theme: jev status: made song: song.js measured: {"date":"2026-09-26","song":"44aa1cb2c38a","total":{"loudnessDbfs":-19.5,"peakDbfs":-1.6},"parts":{"drums":{"loudnessDbfs":-24.8,"peakDbfs":-6.5},"modem":{"loudnessDbfs":-33.3,"peakDbfs":-9},"other":{"loudnessDbfs":-36.6,"peakDbfs":-4.9},"stabs":{"loudnessDbfs":-33.2,"peakDbfs":-13.3},"sub":{"loudnessDbfs":-23.1,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-28.3,"peakDbfs":-3.5}},"sections":{"1-4":{"total":{"loudnessDbfs":-24.7,"peakDbfs":-9},"parts":{"modem":{"loudnessDbfs":-24.7,"peakDbfs":-9}}},"5-8":{"total":{"loudnessDbfs":-28.9,"peakDbfs":-13.5},"parts":{"drums":{"loudnessDbfs":-50.4,"peakDbfs":-30.9},"modem":{"loudnessDbfs":-29,"peakDbfs":-13.8},"stabs":{"loudnessDbfs":-47.2,"peakDbfs":-28}}},"9-12":{"total":{"loudnessDbfs":-18.5,"peakDbfs":-2.4},"parts":{"drums":{"loudnessDbfs":-24.1,"peakDbfs":-8.7},"modem":{"loudnessDbfs":-43.1,"peakDbfs":-16.8},"stabs":{"loudnessDbfs":-31.9,"peakDbfs":-13.4},"sub":{"loudnessDbfs":-22.2,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-24.6,"peakDbfs":-5}}},"13-16":{"total":{"loudnessDbfs":-18.5,"peakDbfs":-2.5},"parts":{"drums":{"loudnessDbfs":-24,"peakDbfs":-8.8},"stabs":{"loudnessDbfs":-33.1,"peakDbfs":-15.9},"sub":{"loudnessDbfs":-22.2,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-26,"peakDbfs":-5}}},"17-20":{"total":{"loudnessDbfs":-18.1,"peakDbfs":-2.9},"parts":{"drums":{"loudnessDbfs":-24.4,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-32.1,"peakDbfs":-13.4},"sub":{"loudnessDbfs":-22.8,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-22.1,"peakDbfs":-4.9}}},"21-24":{"total":{"loudnessDbfs":-19.4,"peakDbfs":-6.2},"parts":{"drums":{"loudnessDbfs":-23.9,"peakDbfs":-6.8},"stabs":{"loudnessDbfs":-33,"peakDbfs":-15.8},"sub":{"loudnessDbfs":-22.4,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-83.1,"peakDbfs":-56.3}}},"25-28":{"total":{"loudnessDbfs":-19.6,"peakDbfs":-6.4},"parts":{"drums":{"loudnessDbfs":-23.9,"peakDbfs":-8.6},"stabs":{"loudnessDbfs":-31.9,"peakDbfs":-13.3},"sub":{"loudnessDbfs":-22.1,"peakDbfs":-14.2}}},"29-32":{"total":{"loudnessDbfs":-20,"peakDbfs":-6.7},"parts":{"drums":{"loudnessDbfs":-24.4,"peakDbfs":-8.6},"stabs":{"loudnessDbfs":-33.4,"peakDbfs":-15.8},"sub":{"loudnessDbfs":-22.6,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"33-36":{"total":{"loudnessDbfs":-18.8,"peakDbfs":-3.4},"parts":{"drums":{"loudnessDbfs":-23.9,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-31.9,"peakDbfs":-13.4},"sub":{"loudnessDbfs":-22.1,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-26.1,"peakDbfs":-5}}},"37-40":{"total":{"loudnessDbfs":-18.5,"peakDbfs":-1.6},"parts":{"drums":{"loudnessDbfs":-23.9,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-32.8,"peakDbfs":-15.9},"sub":{"loudnessDbfs":-22.2,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-26.3,"peakDbfs":-3.5}}},"41-44":{"total":{"loudnessDbfs":-17.8,"peakDbfs":-2.9},"parts":{"drums":{"loudnessDbfs":-24,"peakDbfs":-8.7},"modem":{"loudnessDbfs":-187.8,"peakDbfs":-146.3},"stabs":{"loudnessDbfs":-32.4,"peakDbfs":-13.4},"sub":{"loudnessDbfs":-22.3,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-22.1,"peakDbfs":-4.9}}},"45-48":{"total":{"loudnessDbfs":-19.1,"peakDbfs":-6},"parts":{"drums":{"loudnessDbfs":-23.9,"peakDbfs":-6.5},"modem":{"loudnessDbfs":-31.8,"peakDbfs":-14.8},"stabs":{"loudnessDbfs":-32.8,"peakDbfs":-15.7},"sub":{"loudnessDbfs":-22.2,"peakDbfs":-14.2},"vocals":{"loudnessDbfs":-82.2,"peakDbfs":-56.2}}},"49-52":{"total":{"loudnessDbfs":-19.3,"peakDbfs":-5.7},"parts":{"drums":{"loudnessDbfs":-23.8,"peakDbfs":-8.7},"modem":{"loudnessDbfs":-31.7,"peakDbfs":-14.8},"stabs":{"loudnessDbfs":-31.8,"peakDbfs":-13.3},"sub":{"loudnessDbfs":-22.1,"peakDbfs":-14.2}}},"53-56":{"total":{"loudnessDbfs":-20,"peakDbfs":-6},"parts":{"drums":{"loudnessDbfs":-24.6,"peakDbfs":-8.5},"modem":{"loudnessDbfs":-32.5,"peakDbfs":-14.8},"stabs":{"loudnessDbfs":-33.7,"peakDbfs":-15.7},"sub":{"loudnessDbfs":-22.6,"peakDbfs":-14.2}}},"57-60":{"total":{"loudnessDbfs":-19.8,"peakDbfs":-5.8},"parts":{"drums":{"loudnessDbfs":-24.5,"peakDbfs":-8.4},"modem":{"loudnessDbfs":-31.7,"peakDbfs":-14.8},"stabs":{"loudnessDbfs":-32,"peakDbfs":-13.3},"sub":{"loudnessDbfs":-22.5,"peakDbfs":-14.2}}},"61-64":{"total":{"loudnessDbfs":-21.3,"peakDbfs":-2.8},"parts":{"drums":{"loudnessDbfs":-41.9,"peakDbfs":-20.6},"modem":{"loudnessDbfs":-44,"peakDbfs":-17.7},"other":{"loudnessDbfs":-21.7,"peakDbfs":-4.9},"stabs":{"loudnessDbfs":-64.7,"peakDbfs":-42.3},"sub":{"loudnessDbfs":-38,"peakDbfs":-19.2}}}}} critic: date: 2026-09-26 model: jev-1.13.0 method: rubric-1 art: 0.64 artRuns: [0.64, 0.64, 0.64] criteria: hook: 2.8 development: 3.2 structure: 3.1 concept: 4 originality: 3.6 craft: 2.4 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: "2-step UK garage at 132 bpm. Chop the 56k dial-up modem handshake into a rhythm part. The hook is AOL's "You've got mail", with a vocoder answering "you've got Jev". Swung hi-hats and a warbly sub bass. The intro builds from the modem sound alone." revisions:
  • rev: 1 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "2-step UK garage at 132 bpm. Chop the 56k dial-up modem handshake into a rhythm part. The hook is AOL's "You've got mail", with a vocoder answering "you've got Jev". Swung hi-hats and a warbly sub bass. The intro builds from the modem sound alone." output: null # overwritten by rev 2 art: 0.57 artRuns: [0.57, 0.57, 0.57]
  • rev: 2 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Let Jev arrange the song as it plays. Cut it into named 4-bar sections, each with the sections allowed to follow it; at every section Jev picks the next section, the move to play it with (as written, no drums, drums and sub, no vocals) and how intense it is, and ends the song by choosing the outro, with a cap of 24 sections. Tell Jev the tempo, key, chords, lyrics and everything played so far. Without Jev it plays as written." output: null # overwritten by rev 3 art: 0.64 artRuns: [0.64, 0.64, 0.64]
  • rev: 3 date: 2026-09-25 model: claude-opus-5-5 harness: claude-code prompt: "Give every part a level instead of on or off: out, back or full, so Jev can pull a part back without muting it. Give each section a way in: a straight cut, a fill, a riser or a dropout. Fix the mix: nothing clips, the vocals sit within a few dB of the drums and the stabs are heard as the harmony. Make the intro really dial in, with a dial tone and the number dialed before the answer tone. Play each hook once and keep the chord cycle's two halves alternating through the form. Let a part drop out when out is Jev's most likely answer. Make the drops lift: open the stabs' filter, put open hats on the off-beats and bring drop 2's screech back at full level. Use a real crash, give the sub its warble, and end on a ringing Cm9 over a C2. Make the goodbye AOL's own. Keep the fill and riser off the hook's punchline, always cut into the handshake, stop the sub for a dropout, swing the ghost snares and the handshake stabs, and voice the stabs close so they move by step." output: null # overwritten by rev 4 art: 0.64 artRuns: [0.64, 0.64, 0.65]
  • 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, drop2a and drop2b play at most twice), so no run of drop sections passes 32 bars. Every detour still plays." output: song.js art: 0.64 artRuns: [0.64, 0.64, 0.64]

YOU'VE GOT JEV — spec

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

Intent

Jev doing its day job: routing the mail. Facts: classification and routing are TypeSafe's first named use case (~/brains/personal/technology/artificial-intelligence/jev/jev.md); a Choice question returns one of the caller's labels, and a Choice answer carries a confidence between 0 and 1 (choice.md), hence "Point nine three"; JevTicktRouter is a real .NET ticket-triage app on Jev.

Style

  • 2-step UK garage, 132 bpm, C minor: Cm9 – Fm9 – Bbmaj7 – Abmaj7, two bars per chord, as short organ-style stabs (not a pad).
  • Swung 2-step kick and snare, the ghost snares swung with the hats; shuffled hats; a warbly sub bass (slow pitch LFO); the 56k modem handshake chopped into a fixed rhythm part.
  • The stabs are voiced close so they move by step: Cm9 c3 eb3 g3 bb3 d4, Fm9 f3 g3 ab3 c4 eb4, Bbmaj7 bb2 f3 a3 d4, Abmaj7 ab2 eb3 g3 c4 (the pitch classes each vocoded line was rendered on).
  • Crash = hh27:1 (Dirt-Samples' cr is a ride).
  • Mix: the total peaks at −1 dBFS at most; the vocals sit within about 4 dB of the drums; the stabs are heard as the harmony, about 8 dB under the drums.

Structure

64 bars (~1:56).

BarsSectionContents
1–4IntroA dial-up modem alone: dial tone, dialing, answer tone
5–8IntroThe handshake screech chopped into a fixed rhythm; hats; filtered stabs from bar 7
9–16Verse 12-step groove; vocoder lines 1–4
17–20Hook"You've got mail" / "you've got Jev" ×2
21–32Drop 1Instrumental 2-step, organ stabs with their filter opened, warbly sub, open hats on the off-beats; crash on 21
33–40Verse 2Vocoder lines 5–8
41–44HookAs before
45–60Drop 2Instrumental; the stabs' filter opens further; open hats on the off-beats; the screech chops return over the groove at the intro's level; crash on 45
61–64OutroLast hit and a ringing Cm9 over a C2 sub on 61; "Goodbye" on 62; silence

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. "New ticket in" — Cm9
    2. "Billing, bug, or refund" — Fm9
    3. "Choice: billing" — Bbmaj7
    4. "Point nine three" — Abmaj7
    5. "No human in the loop" — Cm9
    6. "Routed in a blink" — Fm9
    7. "Nobody had to read it" — Bbmaj7
    8. "You've got Jev" — Abmaj7
  • Hook: AOL's "You've got mail", answered by the vocoder "You've got Jev", rendered on the hook's own chords (Cm9, then Fm9).
  • Memes: AOL "You've got mail"; AOL's own "Goodbye" for the disconnect, in the same voice (Elwood Edwards); a real dial-up modem dialing in (dial tone, the number, the answer tone), and the handshake screech from AOL's dial-up sound.

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):

  • formJev asks one choice: which section plays next, among the song's sixteen 4-bar sections (the intro halves, the hooks and the outro are 4 bars, so 4 is the length that divides every section).
  • djJev asks, once that is decided, a level per part (modem, drums, stabs, sub, vocals: out, back or full in this section), how the song moves into it (a choice) 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 the energy's most probable step scales the velocity.

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

SectionBars as writtenMay be followed byPlays at most
modem1–4handshake
handshake5–8verse1a
verse1a9–12verse1b
verse1b13–16hook1
hook117–20drop1a, drop1c
drop1a21–24drop1b
drop1b25–28drop1ctwice
drop1c29–32verse2a, drop1b
verse2a33–36verse2b
verse2b37–40hook2
hook241–44drop2a
drop2a45–48drop2btwice
drop2b49–52drop2c, outrotwice
drop2c53–56drop2d, drop2b
drop2d57–60outro, drop2a
outro61–64(the end)

Loops end. Uncapped, the ways back let Jev repeat a drop until the cap: up to 56 bars of it in a row. So drop1b, drop2a and drop2b, 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 32 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.

Each hook plays at most once: nothing leads back into one, so the one gag, "You've got mail" / "You've got Jev", is heard twice and no more, and the only loops extend a drop. A section may be followed only by one whose start differs by 4 bars mod 8, so the two halves of the chord cycle (Cm9–Fm9, then Bbmaj7–Abmaj7) always alternate.

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, chord and "Goodbye" always play; at 24 sections (96 bars, about 3 minutes) the outro is forced. A section plays its own bars, so each vocoded line still lands on its chord.

The parts. Each question says what the part is and where it plays as written, and Jev sets each one out (silent for the section), back (under the rest of the mix) or full (as written): the sub alone under a hook, the stabs pulled back under a verse, the modem chops dropped from drop 2. The level is a Score, which comes with a probability for each level: a part is silent when "out" is Jev's most probable level; otherwise its velocity is Jev's probability-weighted mix of back (0.5) and full (1), so "between back and full" sounds between them. A fallback, which carries no probabilities, plays full. A part that plays keeps its own masks, so vocals still appear only where the structure table puts them. Each part plays on its own orbit named for its question (modem, drums, stabs, sub, vocals), so the browser's meter hears each one alone. The last hit, the ringing chord and "Goodbye" are not a part: they always play. When Jev can't be reached, every part plays full.

Into the next section. Jev also picks how the song moves into the section it is deciding, and it plays over the last bar of the section before it: cut (straight in), fill (a snare and clap roll in sixteenths, swelling into the downbeat), riser (the modem's handshake screech chopped into sixteenths, its high-pass sweeping up) or dropout (every part stops for the last beat, a gap before the section hits; the sub's last note is cut short so it does not ring through it). The fill and the riser build over the second half of the bar, clear of the line on its downbeat, so they never play over "You've got Jev". The move into the handshake is always a cut, since the intro builds from the modem alone. When Jev can't be reached, 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 (quieter), steady (under full), driving (nearly full), all out (full volume). The step played is Jev's most probable one, and it scales every part's velocity together (0.55, 0.7, 0.85, 1), so the mix keeps its balance.

  • Bars 1–4 always play as written.
  • Each request tells Jev the song's subject, tempo, key, chords and lyrics (its state), what every section holds (the section choice's options), where the song is in the form and the sections left before the cap, everything played so far, how loud each finished section measured in the browser, and the 🔥/😴 reactions from the listener's tab.
  • This relaxes the constraint below that the song plays once in a fixed order: 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 real audio (myinstants, or YouTube via yt-dlp), cut at word timings measured with whisper.cpp. Vocoder lines are made with speak + vocode on the chord they land on, and checked by transcribing the result with whisper.cpp. 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.