1--- 2title: FORTY-FIVE PERCENT 3theme: jev 4status: made 5song: song.js 6measured: {"date":"2026-09-26","song":"8369b5c95fe7","total":{"loudnessDbfs":-22.7,"peakDbfs":-2.4},"parts":{"bass":{"loudnessDbfs":-28.4,"peakDbfs":-12.7},"drums":{"loudnessDbfs":-28.7,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30.9,"peakDbfs":-14.5},"loop":{"loudnessDbfs":-32.1,"peakDbfs":-11.7},"other":{"loudnessDbfs":-38.4,"peakDbfs":-3.7},"vocals":{"loudnessDbfs":-28.8,"peakDbfs":-3.8}},"sections":{"1-4":{"total":{"loudnessDbfs":-28,"peakDbfs":-12.5},"parts":{"keys":{"loudnessDbfs":-30.6,"peakDbfs":-14.5},"loop":{"loudnessDbfs":-31.2,"peakDbfs":-12.5}}},"5-8":{"total":{"loudnessDbfs":-20.3,"peakDbfs":-2.8},"parts":{"bass":{"loudnessDbfs":-27.4,"peakDbfs":-12.7},"drums":{"loudnessDbfs":-27.6,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30,"peakDbfs":-14.6},"loop":{"loudnessDbfs":-34.4,"peakDbfs":-15.9},"vocals":{"loudnessDbfs":-23,"peakDbfs":-3.8}}},"9-12":{"total":{"loudnessDbfs":-20.8,"peakDbfs":-3.3},"parts":{"bass":{"loudnessDbfs":-27.3,"peakDbfs":-12.8},"drums":{"loudnessDbfs":-27.7,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30.3,"peakDbfs":-14.5},"loop":{"loudnessDbfs":-34.4,"peakDbfs":-15.9},"vocals":{"loudnessDbfs":-24.4,"peakDbfs":-4.2}}},"13-16":{"total":{"loudnessDbfs":-23.1,"peakDbfs":-5.9},"parts":{"bass":{"loudnessDbfs":-27.4,"peakDbfs":-12.7},"drums":{"loudnessDbfs":-27.7,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30.1,"peakDbfs":-14.6},"loop":{"loudnessDbfs":-30.3,"peakDbfs":-12.5},"vocals":{"loudnessDbfs":-133.2,"peakDbfs":-105.5}}},"17-20":{"total":{"loudnessDbfs":-22.9,"peakDbfs":-6.2},"parts":{"bass":{"loudnessDbfs":-27.3,"peakDbfs":-12.8},"drums":{"loudnessDbfs":-27.7,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30.3,"peakDbfs":-14.5},"loop":{"loudnessDbfs":-30.1,"peakDbfs":-12.5},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"21-24":{"total":{"loudnessDbfs":-20.7,"peakDbfs":-3.2},"parts":{"bass":{"loudnessDbfs":-27.4,"peakDbfs":-12.7},"drums":{"loudnessDbfs":-27.7,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30.1,"peakDbfs":-14.6},"loop":{"loudnessDbfs":-34.4,"peakDbfs":-15.9},"vocals":{"loudnessDbfs":-23.5,"peakDbfs":-4.3}}},"25-28":{"total":{"loudnessDbfs":-21.2,"peakDbfs":-2.4},"parts":{"bass":{"loudnessDbfs":-27.3,"peakDbfs":-12.8},"drums":{"loudnessDbfs":-27.6,"peakDbfs":-9.4},"keys":{"loudnessDbfs":-30.2,"peakDbfs":-14.5},"loop":{"loudnessDbfs":-34.4,"peakDbfs":-15.9},"vocals":{"loudnessDbfs":-25.2,"peakDbfs":-4}}},"29-32":{"total":{"loudnessDbfs":-22.7,"peakDbfs":-5.8},"parts":{"bass":{"loudnessDbfs":-27,"peakDbfs":-12.7},"drums":{"loudnessDbfs":-27.4,"peakDbfs":-9.5},"keys":{"loudnessDbfs":-30.1,"peakDbfs":-14.6},"loop":{"loudnessDbfs":-29.6,"peakDbfs":-11.7},"vocals":{"loudnessDbfs":-170.1,"peakDbfs":-136.8}}},"33-36":{"total":{"loudnessDbfs":-22.6,"peakDbfs":-6.2},"parts":{"bass":{"loudnessDbfs":-27,"peakDbfs":-12.8},"drums":{"loudnessDbfs":-27.3,"peakDbfs":-9.5},"keys":{"loudnessDbfs":-30.3,"peakDbfs":-14.5},"loop":{"loudnessDbfs":-29.4,"peakDbfs":-11.7}}},"37-40":{"total":{"loudnessDbfs":-22.7,"peakDbfs":-5.8},"parts":{"bass":{"loudnessDbfs":-26.9,"peakDbfs":-12.7},"drums":{"loudnessDbfs":-27.4,"peakDbfs":-9.5},"keys":{"loudnessDbfs":-30.1,"peakDbfs":-14.6},"loop":{"loudnessDbfs":-29.5,"peakDbfs":-11.7}}},"41-44":{"total":{"loudnessDbfs":-26.6,"peakDbfs":-8.6},"parts":{"bass":{"loudnessDbfs":-30.5,"peakDbfs":-15},"drums":{"loudnessDbfs":-31,"peakDbfs":-10.9},"keys":{"loudnessDbfs":-33.6,"peakDbfs":-17.2},"loop":{"loudnessDbfs":-36.6,"peakDbfs":-16.2}}},"45-48":{"total":{"loudnessDbfs":-27.3,"peakDbfs":-3.7},"parts":{"bass":{"loudnessDbfs":-53,"peakDbfs":-27.5},"drums":{"loudnessDbfs":null,"peakDbfs":null},"keys":{"loudnessDbfs":-41.3,"peakDbfs":-22.5},"loop":{"loudnessDbfs":-70.3,"peakDbfs":-29.3},"other":{"loudnessDbfs":-27.5,"peakDbfs":-3.7}}}}} 7critic: 8 date: 2026-09-26 9 model: jev-1.13.0 10 method: rubric-1 11 art: 0.59 12 artRuns: [0.59, 0.6, 0.59] 13 criteria: 14 hook: 2.2 15 development: 3.1 16 structure: 3 17 concept: 3.7 18 originality: 3.3 19 craft: 2.5 20ideas: 21 - date: 2026-09-24 22 model: claude-opus-5-5 23 harness: claude-code 24 prompt: "Research Jev's real use cases; jab at people using Jev where deterministic code would do better, such as game bots." 25 brief: "Lo-fi hip hop about the stock-picking bot. Chopped \"Stonks\" and the Wolf of Wall Street chest-thump hum as a percussion loop. Vocoder lyrics: \"better than a coin, worse than an index fund\", \"don't trust the word probability\" (the bot's own author says this). Tape wobble, vinyl crackle, and it fades out on \"This is fine\"." 26revisions: 27 - rev: 1 28 date: 2026-09-24 29 model: claude-opus-5-5 30 harness: claude-code 31 prompt: "Lo-fi hip hop about the stock-picking bot. Chopped \"Stonks\" and the Wolf of Wall Street chest-thump hum as a percussion loop. Vocoder lyrics: \"better than a coin, worse than an index fund\", \"don't trust the word probability\" (the bot's own author says this). Tape wobble, vinyl crackle, and it fades out on \"This is fine\"." 32 output: null # overwritten by rev 2 33 art: 0.55 34 artRuns: [0.55, 0.55, 0.56] 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. Name each 4-bar section and the sections allowed to follow it; at each section Jev picks the next section, the move to play it with (as written, no drums, keys and vocals, the beat tape), and how intense it is, and ends the song by choosing the outro, whose fade and \"This is fine\" always close it, with a hard cap of 16 sections. Tell Jev the tempo, key, chords, lyrics and everything played so far, and how the listener reacted. Without Jev it plays as written." 40 output: null # overwritten by rev 3 41 art: 0.6 42 artRuns: [0.6, 0.6, 0.6] 43 - rev: 3 44 date: 2026-09-24 45 model: claude-opus-5-5 46 harness: claude-code 47 prompt: "Instead of one move for the whole section, let Jev set a level for each part (the keys, the hum loop, the drums, the bass and the vocals: out, back or full) and choose how the song moves into each section: a cut, a swung boom-bap fill, a crackle riser or a one-beat dropout, played over the last bar of the section before it and faded with it." 48 output: null # overwritten by rev 4 49 art: null # not scored: the song.js before rev 4 was recorded is rev 2's, not rev 3's 50 - rev: 4 51 date: 2026-09-25 52 model: claude-opus-5-5 53 harness: claude-code 54 prompt: "Make the lyrics understandable: each line dry, its echo a throw that lands after the line ends. Sing every line on every path: verse 2 always comes before the outro. Make the coin line true: a new line, \"Up, flat, or down\", sung before it, so the listener hears a three-way guess. In the verses Jev sets the vocals back or full, never out, and is not asked about them elsewhere. Make the chopped Stonks and the chest-thump hum a real percussion loop: the hum's thumps on the grid and in tune, Stonks chopped into stutters inside it, the whole word once per section. Stop the mix clipping: as written is the fallback energy, and up front peaks under -1 dBFS. The bed fades only to about -12 dB, the crackle stays, and the song stops about a beat after \"This is fine\". One swing for the whole band, 16ths swung by a third. An audible bass locked to the kick. The fuller beat adds an open hat on the and of 4, a two-bar kick variation and the bass up to the fifth. The tape wobble a slow vibrato on the keys and bass. Stonks never in a section's last bar. A fill replaces the drums for its bar, at their level." 55 output: null # overwritten by rev 5 56 art: 0.59 57 artRuns: [0.59, 0.59, 0.59] 58 - rev: 5 59 date: 2026-09-26 60 model: claude-opus-5-5 61 harness: claude-code 62 prompt: "Drop the detour from the fuller beat's last section back to the beat, which could never end within the cap." 63 output: song.js 64 art: 0.59 65 artRuns: [0.59, 0.6, 0.59] 66--- 67 68# FORTY-FIVE PERCENT — spec 69 70`song.js` is generated from this spec. Change the spec first, then the song. 71 72## Intent 73 74A gentle roast of using Jev as a stock predictor. Facts (`~/brains/personal/technology/artificial-intelligence/jev/ecosystem/jev-stock-hk.md`): 75a 3-class (up / flat / down) next-day backtest over 120 cases across four 76Hong Kong stocks scored 45.0% against a 33% random baseline. The author's own 77conclusion: Jev is "a disciplined reasoning layer", not "a proven quantitative 78trading model", and they distrust the word "probability" in its output. 79 80"Worse than an index fund" is the joke's claim, not a measurement; the lyric 81stays because it is framed as a jab. 82 83**A correction to the brief: "better than a coin".** A coin guesses a 84two-way question and scores 50%, so heard alone, 45% "better than a coin" 85sounds false. The backtest's question has three outcomes, and on a three-way 86question a blind guess scores 33%, so 45% does beat chance, though it is 87below a coin's 50%. The lyric is the user's and stays; the verse makes the 88frame audible instead, with "Up, flat, or down" sung before the coin line. 89It replaces "One hundred twenty cases", which was ours, not the brief's. 90 91## Style 92 93- Lo-fi hip hop, 80 bpm, in D dorian (C major) with diatonic 7ths: 94 Dm7 – Cmaj7 – Fmaj7 – Em7 from bar 1, two bars per chord, so each vocoded 95 line sits on one chord. 96- The intro plays Dm7 – Cmaj7 as a turnaround, and both verses (bars 5 and 97 21) open on Fmaj7. 98- Dusty boom-bap drums; Rhodes-like chords (short, not a pad); vinyl 99 crackle as sparse high-passed noise. 100- **One swing for the whole band:** 16ths swung by a third, on the kick, 101 snare, hats, keys, bass, hum loop and the fill alike, so nothing sits 102 off the hats. The 8th hats of the verses are written as 16ths with the 103 off-16ths silent, so they swing on the same grid. 104- **Tape wobble** is a slow vibrato, about 0.7 Hz and ±10 cents, on the 105 keys and the bass together, so the whole bed wows as one. 106- **Bass:** round and audible, a filtered sawtooth that locks to the kick 107 (the downbeat, the 16th before beat 3, and the "and" of 3), root, root 108 and the 5th on the last hit; it sits within 6 dB of the drums. 109- **The percussion loop** is the Wolf of Wall Street chest-thump hum's 110 thumps, cut on their transients and placed on the 8th grid, each tuned 111 to a note of the key (A, E, D), about 4 dB under the snare in the beat 112 sections (lower in the verses, under the vocals), with "Stonks" chopped 113 into stutters inside it in the beat sections. The dirt kit supports the 114 loop and does not replace it. The whole word "Stonks" plays once per 115 beat section, as the payoff. 116- **Level.** Nothing in the browser limits the master, so the mix is set 117 by its peaks: up front (the loudest energy) peaks at or under −1 dBFS, 118 measured on a capture of the output. 119 120## Structure 121 12248 bars (~2:24) as written; the ending is a fade. 123 124| Bars | Section | Contents | 125|---|---|---| 126| 1–4 | Intro | Crackle, chords, the hum loop | 127| 5–12 | Verse 1 | Boom-bap and bass enter; vocoder lines 1–4 | 128| 13–20 | Beat | Instrumental; "Stonks" chopped into stutters in each section's first two bars, the whole word on the last 8th of its third | 129| 21–28 | Verse 2 | Vocoder lines 5–8 | 130| 29–40 | Beat, fuller | Beat adds 16th hats, an open hat on the "and" of 4, a two-bar kick variation (a pickup kick in every second bar), and the bass up to the 5th on the "and" of 4; "Stonks" as in the beat | 131| 41–48 | Outro | Snare out at 43, kick out at 45; the bed fades over 41–47 to about −12 dB and never to nothing; the crackle stays unfaded; "This is fine" on bar 47, and the song stops about one beat after it | 132 133"Stonks" never plays in a section's last bar: that bar belongs to the 134transition into the next section. 135 136## Vocals 137 138- Vocoder, one line per 2 bars, each rendered on the chord it lands on: 139 1. "Forty-five percent" — Fmaj7 140 2. "Up, flat, or down" — Em7, a beat after the bar: on the bar its "Up" 141 was lost under the downbeat's kick and chord, and an 8th late its 142 "flat" was lost under the beat-2 snare 143 3. "Better than a coin" — Dm7 144 4. "Worse than an index fund" — Cmaj7 145 5. "A disciplined reasoning layer" — Fmaj7 146 6. "Not a trading model" — Em7 147 7. "Don't trust the word" — Dm7 148 8. "Probability" — Cmaj7 149- Each line is dry on the word; its echo is a quiet copy of the line (about 150 −13 dB, band-limited) a dotted half note (2.25 s) after it starts, so it 151 lands after the line ends: the longest line is 2.0 s. The echo is written 152 out as a second, later copy, not superdough's `delay`, whose delay line 153 tops out at one second: asked for 1.5 s it plays at 1 s, on top of the 154 line's end, and "index fund" and "trading model" transcribed wrong under 155 it. 156- The lines are all at −17.3 LUFS with their peaks limited to −4.5 dBFS, 157 so they sit up front without the mix clipping. 158- Memes: "Stonks"; the Wolf of Wall Street chest-thump hum (its thumps, 159 cut and tuned into a one-bar loop); "This is fine" (the dog, after its 160 crickets). 161 162## Jev in the booth 163 164Jev arranges the song as it plays, as two jevs declared at the top in 165TypeSafe's own shape (`jev({ state, questions })`, `website/src/jev/`), both 166given the song as state (subject, tempo, key, chords, lyrics): 167 168- **`formJev`** asks one choice: which **section** plays next, among the 169 song's twelve 4-bar sections. 170- **`djJev`** asks, once that is decided, a **level** for each 171 instrumental part (keys, hum loop, drums, bass: out, back or full in 172 this section), how far forward the **vocals** sit in a verse, how the 173 song moves **into** it, and a score for the section's **energy**. 174 Questions in one request cannot see each other's answers, so it is a 175 second request, told the section just chosen (`after: { section }`). 176 177In rev 3 the single "move" for the whole section (as written, no drums, 178keys and vocals, the beat tape) became a level for each part, so Jev 179shapes the mix one part at a time. 180 181Both are asked every 4 bars (`.every(4, …)`), and the answers are composed 182in ordinary Strudel at the bottom: `walk` holds the form's rules, each 183part plays at its level, the transition plays over the last bar before the 184section, and `energy.score` sets the postgain. 185 186**The form.** A section may be followed only by these: 187 188| Section | Bars as written | May be followed by | 189|---|---|---| 190| `intro` | 1–4 | verse1 | 191| `verse1` | 5–8 | verse1b | 192| `verse1b` | 9–12 | beat | 193| `beat` | 13–16 | beatB | 194| `beatB` | 17–20 | verse2, verse1 | 195| `verse2` | 21–24 | verse2b | 196| `verse2b` | 25–28 | beatFull, beat | 197| `beatFull` | 29–32 | beatFullB | 198| `beatFullB` | 33–36 | beatFullC, verse2, outro | 199| `beatFullC` | 37–40 | outro, verse2 | 200| `outro` | 41–44 | outroEnd | 201| `outroEnd` | 45–48 | (the end) | 202 203The detour from beatFullC back to the beat is gone: beatFullC is the tenth 204section at the earliest, and the way on through the beat (the beat, verse 2 205and the fuller beat again, then the outro) could never end within the cap of 20616 sections, so Jev was never offered it. `walk` now refuses a way on that 207can never be taken. 208 209**Every path to the outro passes through verse 2**, so every line is sung: 210the beat is the only way out of verse 1, and the beat leads only to a 211verse. The shortest path is 11 sections (intro, verse 1, the beat, 212verse 2, the fuller beat, the outro), under the cap. Sections are 4 bars 213because the intro is. A verse's two halves always play together, as do 214the beat's, so a line is never cut off mid-verse. These rules are code 215(`walk`), not Jev: each request offers Jev only the sections allowed next. 216The written order is always allowed, and it is what plays when Jev can't 217be reached. The song ends when Jev picks the outro: its fade and "This is 218fine" always close it. At 16 sections (about 3:12) the outro is forced. 219The option texts Jev reads describe what plays, not where it belongs in 220the arrangement: that is Jev's to decide. 221 222**The parts.** Each question says what the part is and where it plays as 223written: the keys (the Rhodes with the vinyl crackle), the hum loop (with 224the Stonks chops and stab), the boom-bap drums, the bass, and the vocoded 225vocals. 226 227- The keys, hum loop, drums and bass each get a level: **out** (silent 228 for the section), **back** (under the rest of the mix) or **full** (as 229 written), so Jev can drop parts to build tension, pull them back to make 230 space, and bring them in full for the payoff. The answer is Jev's 231 probability-weighted score: under 0.5 the part is silent, and above it 232 the part plays at its nearest step (half velocity at back, whole at 233 full). 234- The vocals are a choice of **back** or **full**, offered only when the 235 next section is a verse; they can never be out, so the words are always 236 sung. Outside the verses there are no vocals and Jev is not asked 237 (`allow` forces full). Back plays them at 0.65 velocity, full at 1. 238 239A part keeps its own masks, so vocals still appear only in the verses. 240Each part plays on its own orbit, named for its question (`orbit('keys')`, 241…), so the meter hears it alone. "This is fine" always plays. When Jev 242can't be reached, every part plays in full. 243 244**The transitions.** Jev also picks how the song moves into each section, 245played over the last bar of the section before it, with the next 246section's answer (`.early(1)`): a **cut** (straight in), a **fill** (a 247kick on the bar's downbeat, then swung snare hits tumbling into the first 248beat), a **riser** (the vinyl 249crackle thickening into a swelling hiss), or a **dropout** (every part 250stops for the last beat). A fill replaces the drums for its bar: the 251groove's kick, snare and hats stop in that bar, and the fill plays at the 252drums' level in the section it plays in (silent when the drums are out). 253The riser follows the keys' level the same way. A transition fades with 254the section it plays in. Without an answer it is a cut. 255 256**A little chance.** The section is sampled from Jev's 257probabilities at temperature 0.7 (`sample`), so two plays of the song can 258take different paths; the strip shows Jev's top pick beside the one 259sampled. A close call between 260sections is where sampling matters most, so there is no confidence 261threshold: an unsure Jev still picks, and the written order plays only 262when Jev can't be reached. 263 264**Energy** is a four-step ladder: hushed, laid back, **as written** (the 265fallback), and up front (louder than written). The fade and the part 266levels multiply velocity, so energy sets `postgain` instead (0.6, 0.8, 2671 and 1.1), which no part sets: the mix and the fade keep their shape. As 268written is postgain 1, so the fallback plays the mix as measured; at up 269front the song peaks at or under −1 dBFS. 270 271- Bars 1–4 always play as written. 272- Each request tells Jev the song's state (subject, tempo, key, chords, 273 lyrics), everything played so far, how loud each finished section 274 measured in the browser, which sections may come next and how many are 275 left before the cap, and the 🔥/😴 reactions from the listener's tab. 276- The vocal lines index by absolute cycle, and a section plays its own 277 bars, so a repeated verse sings the same lines. 278- This relaxes the constraints below that the song plays once in a fixed 279 order and never varies by chance: the arrangement varies with Jev's 280 choices, which are judgments, with a little sampled chance in the form. 281 282## Constraints 283 284- Plays once from bar 1 and ends; never loops. Sections are absolute-cycle 285 masks, so playback starts from stopped. 286- Structured: patterns vary by section, never by chance. (Random chopping 287 read as noise on the first song.) 288- No sustained background pad; harmony comes from rhythmic parts. 289- Vocals only where the structure table puts them; drops are instrumental. 290- Meme clips are the real audio (myinstants, or YouTube via yt-dlp), cut at 291 word timings measured with whisper.cpp. Vocoder lines are made with 292 `speak` + `vocode` on the chord they land on, and checked by transcribing 293 the result with whisper.cpp. Everything lands in `samples/<sound>/` with 294 a provenance row in `samples/README.md`. 295- Samples load from `samples('jev-samples/strudel.json')`; drums from 296 `github:tidalcycles/dirt-samples`.