SPEC.mdpreviewSPEC.mdsource296 lines · 19.7 KB · raw
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`.