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'cris 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.
| Bars | Section | Contents |
|---|---|---|
| 1–8 | Intro | Music-box lead alone; high-passed amen from bar 5, its filter opening until the drop |
| 9–16 | Build | Hook vocals; amen filter keeps opening; low sub; snare roll + noise riser in 15–16, the roll ducking under the words |
| 17–32 | Drop 1 | Full drums, reese + sine bassline, 8th hats; rave stabs from bar 25; crash on 17 |
| 33–36 | Breakdown | Drums out; lead + low sub |
| 37–40 | Build | Hook vocals return, the whole swap in 4 bars; amen filter opens again; riser into the drop |
| 41–56 | Drop 2 | Everything, 16th hats, stabs; crash on 41 |
| 57–64 | Outro | Kick 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.enandmedium.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):mnjevpasses both models, but fortsjevand the pickup'sjevno SAPI render tried is read as Jev by both.medium.enhears a bare "Jev" as "Jeb" or "Jeff" in every spelling tried; the transcripts are insamples/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 insamples/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):
formJevasks one choice: which section plays next, among the song's sixteen 4-bar sections.djJevasks, 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:
| Section | Bars as written | May be followed by | Plays at most |
|---|---|---|---|
intro | 1–4 | tease | |
tease | 5–8 | build1 | |
build1 | 9–12 | build1b | |
build1b | 13–16 | drop1 | |
drop1 | 17–20 | drop1b | |
drop1b | 21–24 | drop1c | |
drop1c | 25–28 | drop1d | twice |
drop1d | 29–32 | breakdown, drop1c | |
breakdown | 33–36 | build2 | |
build2 | 37–40 | drop2 | |
drop2 | 41–44 | drop2b | twice |
drop2b | 45–48 | drop2c | |
drop2c | 49–52 | drop2d, drop2 | |
drop2d | 53–56 | outro, breakdown, drop2 | |
outro | 57–60 | final | |
final | 61–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/viasamples('jev-samples/strudel.json'); drums, stabs and noise fromgithub:tidalcycles/dirt-samplesand built-in synths. - Sections are absolute-cycle masks, so playback must start from stopped.