SPEC.mdpreviewSPEC.mdsource274 lines · 19.0 KB · raw

title: TYPESAFE JUNGLE theme: jev status: made song: song.js measured: {"date":"2026-09-26","song":"3607af93754b","total":{"loudnessDbfs":-21.5,"peakDbfs":-2.5},"parts":{"bass":{"loudnessDbfs":-29,"peakDbfs":-14.2},"drums":{"loudnessDbfs":-22.7,"peakDbfs":-3.7},"lead":{"loudnessDbfs":-42,"peakDbfs":-28},"other":{"loudnessDbfs":-42.8,"peakDbfs":-4},"stabs":{"loudnessDbfs":-39.6,"peakDbfs":-21.6},"vocals":{"loudnessDbfs":-36.2,"peakDbfs":-7.9}},"sections":{"1-4":{"total":{"loudnessDbfs":-40.2,"peakDbfs":-28},"parts":{"lead":{"loudnessDbfs":-40.2,"peakDbfs":-28}}},"5-8":{"total":{"loudnessDbfs":-35.1,"peakDbfs":-16.5},"parts":{"drums":{"loudnessDbfs":-36.8,"peakDbfs":-17.2},"lead":{"loudnessDbfs":-39.9,"peakDbfs":-28}}},"9-12":{"total":{"loudnessDbfs":-24,"peakDbfs":-6.7},"parts":{"bass":{"loudnessDbfs":-25.7,"peakDbfs":-19.6},"drums":{"loudnessDbfs":-36.9,"peakDbfs":-16.8},"lead":{"loudnessDbfs":-39.9,"peakDbfs":-28},"vocals":{"loudnessDbfs":-30.1,"peakDbfs":-8.4}}},"13-16":{"total":{"loudnessDbfs":-23.3,"peakDbfs":-6.8},"parts":{"bass":{"loudnessDbfs":-25.5,"peakDbfs":-19.6},"drums":{"loudnessDbfs":-32.2,"peakDbfs":-11.6},"lead":{"loudnessDbfs":-40.2,"peakDbfs":-28},"vocals":{"loudnessDbfs":-29.3,"peakDbfs":-8.3}}},"17-20":{"total":{"loudnessDbfs":-19.1,"peakDbfs":-3},"parts":{"bass":{"loudnessDbfs":-29,"peakDbfs":-15.1},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.7},"lead":{"loudnessDbfs":-43.5,"peakDbfs":-31},"vocals":{"loudnessDbfs":-41.1,"peakDbfs":-8.8}}},"21-24":{"total":{"loudnessDbfs":-19.1,"peakDbfs":-2.7},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-16.3},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.7},"lead":{"loudnessDbfs":-43.4,"peakDbfs":-31.5},"vocals":{"loudnessDbfs":-200.5,"peakDbfs":-168.3}}},"25-28":{"total":{"loudnessDbfs":-19,"peakDbfs":-3.1},"parts":{"bass":{"loudnessDbfs":-28.7,"peakDbfs":-15.6},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.8},"lead":{"loudnessDbfs":-43.5,"peakDbfs":-31.5},"stabs":{"loudnessDbfs":-35.3,"peakDbfs":-21.7},"vocals":{"loudnessDbfs":-354.6,"peakDbfs":-324.6}}},"29-32":{"total":{"loudnessDbfs":-19.1,"peakDbfs":-2.5},"parts":{"bass":{"loudnessDbfs":-29.3,"peakDbfs":-15.8},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.8},"lead":{"loudnessDbfs":-43.4,"peakDbfs":-31.5},"stabs":{"loudnessDbfs":-35.2,"peakDbfs":-21.8},"vocals":{"loudnessDbfs":-513.4,"peakDbfs":-482.2}}},"33-36":{"total":{"loudnessDbfs":-25.2,"peakDbfs":-10.8},"parts":{"bass":{"loudnessDbfs":-25.7,"peakDbfs":-19.6},"drums":{"loudnessDbfs":-36,"peakDbfs":-11.7},"lead":{"loudnessDbfs":-40,"peakDbfs":-28},"stabs":{"loudnessDbfs":-66.1,"peakDbfs":-39.5},"vocals":{"loudnessDbfs":-667.6,"peakDbfs":-639.1}}},"37-40":{"total":{"loudnessDbfs":-23.2,"peakDbfs":-6.6},"parts":{"bass":{"loudnessDbfs":-25.5,"peakDbfs":-19.6},"drums":{"loudnessDbfs":-36.4,"peakDbfs":-15.4},"lead":{"loudnessDbfs":-39.9,"peakDbfs":-28},"stabs":{"loudnessDbfs":-220.9,"peakDbfs":-183.2},"vocals":{"loudnessDbfs":-27.7,"peakDbfs":-7.9}}},"41-44":{"total":{"loudnessDbfs":-19.1,"peakDbfs":-2.5},"parts":{"bass":{"loudnessDbfs":-29,"peakDbfs":-14.2},"drums":{"loudnessDbfs":-19.6,"peakDbfs":-3.7},"lead":{"loudnessDbfs":-43.4,"peakDbfs":-31},"stabs":{"loudnessDbfs":-35.3,"peakDbfs":-21.6},"vocals":{"loudnessDbfs":-42.2,"peakDbfs":-10.1}}},"45-48":{"total":{"loudnessDbfs":-19,"peakDbfs":-2.5},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-16.9},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.7},"lead":{"loudnessDbfs":-43.5,"peakDbfs":-31.5},"stabs":{"loudnessDbfs":-35.3,"peakDbfs":-21.7},"vocals":{"loudnessDbfs":-200.6,"peakDbfs":-168.3}}},"49-52":{"total":{"loudnessDbfs":-19.2,"peakDbfs":-2.5},"parts":{"bass":{"loudnessDbfs":-29.7,"peakDbfs":-16.7},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.7},"lead":{"loudnessDbfs":-43.4,"peakDbfs":-31.5},"stabs":{"loudnessDbfs":-35.2,"peakDbfs":-21.6},"vocals":{"loudnessDbfs":-358.8,"peakDbfs":-325.8}}},"53-56":{"total":{"loudnessDbfs":-19.1,"peakDbfs":-2.5},"parts":{"bass":{"loudnessDbfs":-29,"peakDbfs":-16.4},"drums":{"loudnessDbfs":-19.7,"peakDbfs":-3.8},"lead":{"loudnessDbfs":-43.4,"peakDbfs":-31.5},"stabs":{"loudnessDbfs":-35.2,"peakDbfs":-21.7},"vocals":{"loudnessDbfs":-515.2,"peakDbfs":-483}}},"57-60":{"total":{"loudnessDbfs":-32.4,"peakDbfs":-11.7},"parts":{"bass":{"loudnessDbfs":-46.6,"peakDbfs":-21.1},"drums":{"loudnessDbfs":-33.5,"peakDbfs":-11.8},"lead":{"loudnessDbfs":-40.5,"peakDbfs":-28.6},"stabs":{"loudnessDbfs":-67.9,"peakDbfs":-42},"vocals":{"loudnessDbfs":-670,"peakDbfs":-639.3}}},"61-64":{"total":{"loudnessDbfs":-30.5,"peakDbfs":-4.3},"parts":{"drums":{"loudnessDbfs":-47.2,"peakDbfs":-19.8},"lead":{"loudnessDbfs":-47.2,"peakDbfs":-31.2},"other":{"loudnessDbfs":-30.6,"peakDbfs":-4},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}}}} brief: "Make a song about TypeSafe's Jev in the style of Aphex Twin, built on real meme samples like "My name is Jeff"." critic: date: 2026-09-26 model: jev-1.13.0 method: rubric-1 art: 0.6 artRuns: [0.6, 0.59, 0.6] criteria: hook: 2.8 development: 3.1 structure: 3.2 concept: 3.2 originality: 3 craft: 2.6 revisions:

  • rev: 1 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Make a song about TypeSafe's Jev in the style of Aphex Twin, built on real meme samples like "My name is Jeff"." output: glitch.js art: 0.33 artRuns: [0.33, 0.33, 0.33]
  • rev: 2 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "It reads as random noise. Make it more mainstream, driven by jungle kicks." output: null # overwritten by rev 3; predates this repo art: null # not scored: predates this repo: no song.js before the next revision was recorded
  • rev: 3 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Improve it." output: null # overwritten by rev 4; predates this repo art: null # not scored: predates this repo: no song.js before the next revision was recorded
  • rev: 4 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Remove the background pad. Give the song a real start and ending instead of a loop, keep the vocals out of the instrumental sections except the hook and after the drop, and arrange it like a real song." output: null # overwritten by rev 5 art: 0.5 artRuns: [0.5, 0.5, 0.49]
  • rev: 5 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Let Jev arrange the song as it plays. Split it into named parts and cut it into 4-bar sections, each listing the sections allowed to follow it; at every section Jev picks the next section, the move to play it with (as written, no drums, amen and bass, or the lead over the amen), and how intense it is, and ends the song by choosing the last hit, with a cap of 28 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 6 art: 0.6 artRuns: [0.6, 0.6, 0.59]
  • rev: 6 date: 2026-09-25 model: claude-opus-5-5 harness: claude-code prompt: "Fix what a listener hears first. Bring the mix out of clipping with a master level. Make every Jev heard as Jev: spell it out in the swap line ("My name is Jev. J, E, V."), give build 2 the swap too, and leave a gap between "type safe" and "Jev" in the pickup. Tune the rave stabs to the chords, move the bass up an octave so small speakers carry it, make the crash a crash, keep the lead on its chords, open the amen filter in one sweep and choke its slices. Let the snare roll duck under the words, keep the vocals through a dropout, and let Jev set each part only where it plays, as out, back or full." output: null # overwritten by rev 7 art: 0.6 artRuns: [0.6, 0.6, 0.59]
  • rev: 7 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 (drop1c and drop2 play at most twice), so no run of drop sections passes 32 bars. Every detour still plays." output: song.js art: 0.6 artRuns: [0.6, 0.59, 0.6]

TYPESAFE JUNGLE — spec

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

Intent

A jungle track about Jev (TypeSafe AI's typed-decision model), built on the "My name is Jeff" meme: the hook swaps Jeff for Jev.

The pitch asks for real meme samples "like 'My name is Jeff'", and names no other, so the one real meme is the 22 Jump Street clip; everything else the hook says is the Jev voice answering it, because the joke is that one swap.

Style

  • Jungle / drum & bass, 170 bpm, C minor (Cm – A♭ – Fm – G, one chord per bar).
  • Structured and repeatable: patterns may vary by section, not by chance.
  • Rolling amen break played in order, with a fill every 4th bar. Each amen slice cuts the one before, so slices never smear into each other.
  • Classic two-step kick (beat 1 and the "and" of 3) with an 808 underneath; snare on 2 and 4.
  • The music-box lead outlines each bar's chord; the dominant (G) bar uses B natural, as the bass does.
  • The rave stabs follow the roots C, A♭, F, G. The sample (stab:3) is pitched at C♯, so its speed is set to land on each root.
  • The bass sits in F1–C2 (44–65 Hz): low enough to be a sub, high enough for small speakers to carry. The low sub under the builds and the breakdown gets a little saturation, so its second harmonic carries too.
  • The crash is a crash (hh27:1, Dirt-Samples' crash); Dirt-Samples' cr is a ride.
  • The amen's filter opens in one continuous sweep from the tease into the first drop, and in its own 4-bar sweep over build 2.
  • No sustained background pad.

Mix

  • Peaks at or under −1 dBFS as measured (superdough has no limiter), with the kick layer trimmed and a master level on the whole song. At a master level of 0.36, two runs measured −2.6 and −1.8 dBFS peak (−21.5 and −22.1 dBFS loudness; the second is measured: above). Two runs at 0.6 read +2.7 and +1.6, so the margin covers the meter's run-to-run spread.

Structure

Plays once from bar 1 and ends; it must not loop.

BarsSectionContents
1–8IntroMusic-box lead alone; high-passed amen from bar 5, its filter opening until the drop
9–16BuildHook vocals; amen filter keeps opening; low sub; snare roll + noise riser in 15–16, the roll ducking under the words
17–32Drop 1Full drums, reese + sine bassline, 8th hats; rave stabs from bar 25; crash on 17
33–36BreakdownDrums out; lead + low sub
37–40BuildHook vocals return, the whole swap in 4 bars; amen filter opens again; riser into the drop
41–56Drop 2Everything, 16th hats, stabs; crash on 41
57–64OutroKick and bass out, the amen alone thins over 57–60 and is gone for the final hit; lead fades; final kick + crash on 61, left to ring

Vocals

  • Only in the two builds, as the hook leading into each drop — never in the intro, drops, breakdown or outro.
  • Each build states the swap. Build 1, one line every other bar: "my name is Jeff" → "my name is Jev. J, E, V." → "my name is Jeff" → "type safe Jev", then "type safe… Jev" as the pickup into the drop. Build 2 packs the same lines into its 4 bars: "my name is Jeff", "my name is Jev. J, E, V." (which runs into bar 39, so "type safe Jev" comes in on its beat 3), then the pickup.
  • The swap line spells the name, because a listener (and a speech recogniser) hears a bare "Jev" as "Jeff": the spelling is the correction.
  • The pickup has an audible gap between "type safe" and "Jev": "type safe" on beat 2, "Jev" on beat 4.
  • The build's snare roll ducks out under every spoken word, so the punchline is never under it. In build 2 the words fill bars 39–40, so the noise riser carries that build alone.
  • Every Jev line is heard as Jev by unprimed whisper small.en and medium.en. Every vocal sample ends in natural decay, at or below −40 dB over its last 20 ms, with at least 150 ms of tail and a fade of at least 20 ms, and peaks under −1 dBTP. Not yet met for two samples (2026-09-25): mnjev passes both models, but for tsjev and the pickup's jev no SAPI render tried is read as Jev by both. medium.en hears a bare "Jev" as "Jeb" or "Jeff" in every spelling tried; the transcripts are in samples/README.md.
  • Real samples: the 22 Jump Street clip (jeff); Windows speech-synth for the Jev lines (mnjev, tsjev, ts, jev). Their sources and transcripts are in samples/README.md.

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.
  • djJev asks, once that is decided, a level per part (the music-box lead, the jungle drums, the rave stabs, the bass, the hook vocals: out, back or full), a choice of how the song moves into the section, 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 }).

djJev is asked every section; formJev only where the form branches (where one section can follow, walk plays it without asking). Both run on a 4-bar cadence (.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 sections are 4 bars: the breakdown and second build are 4 bars, so 8 would not divide them.

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

SectionBars as writtenMay be followed byPlays at most
intro1–4tease
tease5–8build1
build19–12build1b
build1b13–16drop1
drop117–20drop1b
drop1b21–24drop1c
drop1c25–28drop1dtwice
drop1d29–32breakdown, drop1c
breakdown33–36build2
build237–40drop2
drop241–44drop2btwice
drop2b45–48drop2c
drop2c49–52drop2d, drop2
drop2d53–56outro, breakdown, drop2
outro57–60final
final61–64(the end)

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

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. Jev ends the song by choosing the outro, which always leads into final, whose last kick and crash always ring out; at 28 sections (about 2½ minutes) the ending is forced. Builds lead only into their drop, and a section plays its own bars, so a repeated drop is that drop, with its own hats and stabs.

The parts. Each part's level is a choice of three: out (silent for the section), back (half velocity, under the rest of the mix) or full (as written), and each part plays at Jev's most likely level. Each question says what the part is and where it plays as written, so Jev can drop parts to build tension or make space, pull them back to let others speak, and bring them in full for the payoff. Jev is asked only about the parts that play in the section: the lead everywhere; the drums from the tease to the outro, except the breakdown and the final hit; the stabs in drop1c, drop1d and drop 2; the bass everywhere but the intro, tease, outro and final hit; the vocals in the three build sections. A part that cannot sound in a section is not asked about (it stays full, and adds nothing to the history). In the outro the drums are the amen alone, so there they may be only back or full. A part 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 (lead, drums, stabs, bass, vocals; the lead and the hook each get their own delay line there, where before they shared one), so the browser's meter hears each one alone. The last hit always plays, so the song still ends on it. When Jev can't be reached, every part plays in full.

Into the next section. Over the last bar of each section, the song plays how Jev chose to move into the next one: a straight cut, a fill (the song's snare roll, rising in pitch), a riser (white noise sweeping up), or a dropout (everything except the vocals stops for the last beat). The last bar reads the next section's answer, so the transition fits where the song is going. Out of build1b and build2 the move is a cut or a dropout only: those bars already play the written roll and riser, so a fill or riser would double them, and a dropout lands the pickup's "Jev" alone into the drop. No transition doubles a written roll. The final section has no next section, so nothing plays over its last bar and its last beat is never cut. 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, and stays a score, since a continuous intensity is what the question means: held back is about −5 dB, steady about −3 dB, driving about −1.5 dB, all out as written. It scales every part's velocity together (0.56 to 1), except the last hit, so the mix keeps its balance. No filter is added: the amen, the reese and the risers already set theirs.

  • Bars 1–4 always play as written.
  • Each request tells Jev the song's state (subject, tempo, key, chords, lyrics), every answer so far, where the song is in its form (the sections allowed next, and those left before the cap), how loud each finished section measured in the browser, and the 🔥/😴 reactions from the listener's tab.
  • This relaxes the constraints below that the song plays once in a fixed order and is repeatable: the arrangement varies with Jev's choices, which are judgments, with a little sampled chance in the form.

Constraints

  • Samples from samples/ via samples('jev-samples/strudel.json'); drums, stabs and noise from github:tidalcycles/dirt-samples and built-in synths.
  • Sections are absolute-cycle masks, so playback must start from stopped.