SPEC.mdpreviewSPEC.mdsource245 lines · 17.3 KB · raw
1---
2title: YOU'VE GOT JEV
3theme: jev
4status: made
5song: song.js
6measured: {"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}}}}}
7critic:
8  date: 2026-09-26
9  model: jev-1.13.0
10  method: rubric-1
11  art: 0.64
12  artRuns: [0.64, 0.64, 0.64]
13  criteria:
14    hook: 2.8
15    development: 3.2
16    structure: 3.1
17    concept: 4
18    originality: 3.6
19    craft: 2.4
20ideas:
21  - date: 2026-09-24
22    model: claude-opus-5-5
23    harness: claude-code
24    prompt: "Give me some song ideas as prompts, in the same Jev theme: perhaps with actual memes in the vocals, or a vocoder sound."
25    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."
26revisions:
27  - rev: 1
28    date: 2026-09-24
29    model: claude-opus-5-5
30    harness: claude-code
31    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."
32    output: null  # overwritten by rev 2
33    art: 0.57
34    artRuns: [0.57, 0.57, 0.57]
35  - rev: 2
36    date: 2026-09-24
37    model: claude-opus-5-5
38    harness: claude-code
39    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."
40    output: null  # overwritten by rev 3
41    art: 0.64
42    artRuns: [0.64, 0.64, 0.64]
43  - rev: 3
44    date: 2026-09-25
45    model: claude-opus-5-5
46    harness: claude-code
47    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."
48    output: null  # overwritten by rev 4
49    art: 0.64
50    artRuns: [0.64, 0.64, 0.65]
51  - rev: 4
52    date: 2026-09-26
53    model: claude-opus-5-5
54    harness: claude-code
55    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."
56    output: song.js
57    art: 0.64
58    artRuns: [0.64, 0.64, 0.64]
59---
60
61# YOU'VE GOT JEV — spec
62
63`song.js` is generated from this spec. Change the spec first, then the song.
64
65## Intent
66
67Jev doing its day job: routing the mail. Facts: classification and routing
68are TypeSafe's first named use case (`~/brains/personal/technology/artificial-intelligence/jev/jev.md`); a Choice
69question returns one of the caller's labels, and a Choice answer carries a
70confidence between 0 and 1 (`choice.md`), hence "Point nine three";
71JevTicktRouter is a real .NET ticket-triage app on Jev.
72
73## Style
74
75- 2-step UK garage, 132 bpm, C minor: Cm9 – Fm9 – Bbmaj7 – Abmaj7, two bars
76  per chord, as short organ-style stabs (not a pad).
77- Swung 2-step kick and snare, the ghost snares swung with the hats;
78  shuffled hats; a warbly sub bass (slow pitch LFO); the 56k modem
79  handshake chopped into a fixed rhythm part.
80- The stabs are voiced close so they move by step: Cm9 c3 eb3 g3 bb3 d4,
81  Fm9 f3 g3 ab3 c4 eb4, Bbmaj7 bb2 f3 a3 d4, Abmaj7 ab2 eb3 g3 c4 (the
82  pitch classes each vocoded line was rendered on).
83- Crash = `hh27:1` (Dirt-Samples' `cr` is a ride).
84- Mix: the total peaks at −1 dBFS at most; the vocals sit within about 4 dB
85  of the drums; the stabs are heard as the harmony, about 8 dB under the
86  drums.
87
88## Structure
89
9064 bars (~1:56).
91
92| Bars | Section | Contents |
93|---|---|---|
94| 1–4 | Intro | A dial-up modem alone: dial tone, dialing, answer tone |
95| 5–8 | Intro | The handshake screech chopped into a fixed rhythm; hats; filtered stabs from bar 7 |
96| 9–16 | Verse 1 | 2-step groove; vocoder lines 1–4 |
97| 17–20 | Hook | "You've got mail" / "you've got Jev" ×2 |
98| 21–32 | Drop 1 | Instrumental 2-step, organ stabs with their filter opened, warbly sub, open hats on the off-beats; crash on 21 |
99| 33–40 | Verse 2 | Vocoder lines 5–8 |
100| 41–44 | Hook | As before |
101| 45–60 | Drop 2 | Instrumental; 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 |
102| 61–64 | Outro | Last hit and a ringing Cm9 over a C2 sub on 61; "Goodbye" on 62; silence |
103
104Verse 2 starts on bar 33 so each vocoded line lands on the first bar of its
105chord (the harmony cycles every 8 bars); so drop 1 is 12 bars and drop 2 is 16.
106
107## Vocals
108
109- Vocoder, one line per 2 bars:
110  1. "New ticket in" — Cm9
111  2. "Billing, bug, or refund" — Fm9
112  3. "Choice: billing" — Bbmaj7
113  4. "Point nine three" — Abmaj7
114  5. "No human in the loop" — Cm9
115  6. "Routed in a blink" — Fm9
116  7. "Nobody had to read it" — Bbmaj7
117  8. "You've got Jev" — Abmaj7
118- Hook: AOL's "You've got mail", answered by the vocoder "You've got Jev",
119  rendered on the hook's own chords (Cm9, then Fm9).
120- Memes: AOL "You've got mail"; AOL's own "Goodbye" for the disconnect, in
121  the same voice (Elwood Edwards); a real dial-up modem dialing in (dial
122  tone, the number, the answer tone), and the handshake screech from AOL's
123  dial-up sound.
124
125## Jev in the booth
126
127Jev arranges the song as it plays, as two jevs declared at the top in
128TypeSafe's own shape (`jev({ state, questions })`, `website/src/jev/`), both
129given the song as state (subject, tempo, key, chords, lyrics):
130
131- **`formJev`** asks one choice: which **section** plays next, among the
132  song's sixteen 4-bar sections (the intro halves, the hooks and the outro
133  are 4 bars, so 4 is the length that divides every section).
134- **`djJev`** asks, once that is decided, a level per part (modem, drums,
135  stabs, sub, vocals: out, back or full in this section), how the song
136  moves **into** it (a choice) and a score for the section's **energy**.
137  Questions in one request cannot see each other's answers, so it is a
138  second request, told the section just chosen (`after: { section }`).
139
140Both are asked every 4 bars (`.every(4, …)`), and the answers are composed
141in ordinary Strudel at the bottom: `walk` holds the form's rules, each
142part plays at its level, the transition plays over the last bar before
143the section, and the energy's most probable step scales the velocity.
144
145**The form.** A section may be followed only by these:
146
147| Section | Bars as written | May be followed by | Plays at most |
148|---|---|---|---|
149| `modem` | 1–4 | handshake |  |
150| `handshake` | 5–8 | verse1a |  |
151| `verse1a` | 9–12 | verse1b |  |
152| `verse1b` | 13–16 | hook1 |  |
153| `hook1` | 17–20 | drop1a, drop1c |  |
154| `drop1a` | 21–24 | drop1b |  |
155| `drop1b` | 25–28 | drop1c | twice |
156| `drop1c` | 29–32 | verse2a, drop1b |  |
157| `verse2a` | 33–36 | verse2b |  |
158| `verse2b` | 37–40 | hook2 |  |
159| `hook2` | 41–44 | drop2a |  |
160| `drop2a` | 45–48 | drop2b | twice |
161| `drop2b` | 49–52 | drop2c, outro | twice |
162| `drop2c` | 53–56 | drop2d, drop2b |  |
163| `drop2d` | 57–60 | outro, drop2a |  |
164| `outro` | 61–64 | (the end) |  |
165
166**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.
167
168Each hook plays at most once: nothing leads back into one, so the one
169gag, "You've got mail" / "You've got Jev", is heard twice and no more, and
170the only loops extend a drop. A section may be followed only by one whose
171start differs by 4 bars mod 8, so the two halves of the chord cycle
172(Cm9–Fm9, then Bbmaj7–Abmaj7) always alternate.
173
174These rules are code (`walk`), not Jev: each request offers Jev only the
175sections allowed next. The written order is always allowed, and it is what
176plays when Jev can't be reached. The song ends when Jev picks the outro, whose last hit, chord and
177"Goodbye" always play; at 24 sections (96 bars, about 3 minutes) the outro
178is forced. A section plays its own bars, so each vocoded line still lands
179on its chord.
180
181**The parts.** Each question says what the part is and where it plays as
182written, and Jev sets each one **out** (silent for the section), **back**
183(under the rest of the mix) or **full** (as written): the sub alone under a
184hook, the stabs pulled back under a verse, the modem chops dropped from
185drop 2. The level is a Score, which comes with a probability for each
186level: a part is silent when "out" is Jev's most probable level; otherwise
187its velocity is Jev's probability-weighted mix of back (0.5) and full (1),
188so "between back and full" sounds between them. A fallback, which carries
189no probabilities, plays full. A part that plays
190keeps its own masks, so vocals still appear only where the structure table
191puts them. Each part plays on its own orbit named for its question
192(`modem`, `drums`, `stabs`, `sub`, `vocals`), so the browser's meter hears
193each one alone. The last hit, the ringing chord and "Goodbye" are not a
194part: they always play. When Jev can't be reached, every part plays full.
195
196**Into the next section.** Jev also picks how the song moves into the
197section it is deciding, and it plays over the last bar of the section
198before it: **cut** (straight in), **fill** (a snare and clap roll in
199sixteenths, swelling into the downbeat), **riser** (the modem's handshake
200screech chopped into sixteenths, its high-pass sweeping up) or **dropout**
201(every part stops for the last beat, a gap before the section hits; the
202sub's last note is cut short so it does not ring through it). The fill and
203the riser build over the second half of the bar, clear of the line on its
204downbeat, so they never play over "You've got Jev". The move into the
205handshake is always a cut, since the intro builds from the modem alone.
206When Jev can't be reached, it is a cut.
207
208**A little chance.** The section is sampled from Jev's
209probabilities at temperature 0.7 (`sample`), so two plays of the song can
210take different paths; the strip shows Jev's top pick beside the one
211sampled. A close call between
212sections is where sampling matters most, so there is no confidence
213threshold: an unsure Jev still picks, and the written order plays only
214when Jev can't be reached.
215
216**Energy** is a four-step ladder: held back (quieter), steady (under
217full), driving (nearly full), all out (full volume). The step played is
218Jev's most probable one, and it scales every part's velocity together
219(0.55, 0.7, 0.85, 1), so the mix keeps its balance.
220
221- Bars 1–4 always play as written.
222- Each request tells Jev the song's subject, tempo, key, chords and lyrics
223  (its state), what every section holds (the section choice's options),
224  where the song is in the form and the sections left before the cap,
225  everything played so far, how loud each finished section measured in the
226  browser, and the 🔥/😴 reactions from the listener's tab.
227- This relaxes the constraint below that the song plays once in a fixed
228  order: the arrangement varies with Jev's choices, which are judgments,
229  with a little sampled chance in the form.
230
231## Constraints
232
233- Plays once from bar 1 and ends; never loops. Sections are absolute-cycle
234  masks, so playback starts from stopped.
235- Structured: patterns vary by section, never by chance. (Random chopping
236  read as noise on the first song.)
237- No sustained background pad; harmony comes from rhythmic parts.
238- Vocals only where the structure table puts them; drops are instrumental.
239- Meme clips are the real audio (myinstants, or YouTube via yt-dlp), cut at
240  word timings measured with whisper.cpp. Vocoder lines are made with
241  `speak` + `vocode` on the chord they land on, and checked by transcribing
242  the result with whisper.cpp. Everything lands in `samples/<sound>/` with
243  a provenance row in `samples/README.md`.
244- Samples load from `samples('jev-samples/strudel.json')`; drums from
245  `github:tidalcycles/dirt-samples`.