1# songs 2 3One folder per song, grouped by theme: `songs/<theme>/<song>/`. 4 5Each song folder holds: 6 7- `SPEC.md` — the spec the song is generated from. Its frontmatter carries: 8 - `status` — `planned` (spec only) or `made` (`song.js` exists). 9 - `ideas` — where the idea came from, if it started as a pitch: date, 10 model, harness, the user's prompt verbatim, and the pitch verbatim. 11 - `pitch` — if a listener's pitch on the site (the jev panel's pitches) 12 gave the song its idea, that pitch's id (22 characters): the pitch then 13 shows "became" and this song. The song's maker says so, never the 14 pitch's author (`website/src/jev/pitches.mjs`); a malformed id fails 15 the build. 16 - `critic` — Jev's verdict on the song as it stands: the date, the 17 model, the `method` (the rubric's version), each criterion's score out 18 of 5, and `art`, their mean out of 5. Each is the mean of several 19 runs (three by default), and `artRuns` lists each run's own `art`: one 20 run moves by up to 0.06 on unchanged code. The rubric 21 (`website/src/jev/critic.mjs`) scores hook, development, structure, 22 concept, originality and craft like a harsh critic: 0 is not a song, 3 23 is good, 5 the best ever made in its genre. So 60% means good, 90% takes 24 peak work, and 100% is out of reach. The state is the title, the spec 25 body, the code and facts measured from it. Three notes scored 2% and a 26 one-bar loop 11%; the songs 57-66% (2026-09-24). The card shows "N% 27 art", and hovering its cover shows the criteria. `tools/critic/` 28 records it. (Until 2026-09-24 it was one yes/no question, "is this art?", 29 which every song passed at 93-96%.) 30 - `revisions` — every prompt that changed the music: date, model, 31 harness, the prompt, the file it produced, and `art`, Jev's score for 32 that revision's code, a mean over the runs listed in `artRuns` 33 (`null`, with a comment, where the code could not be recovered). A song made from a pitch has the pitch as its first 34 prompt; later prompts are the user's requests, written up as 35 instructions about the music. The spec view shows the scores and how 36 they changed. 37- `song.js` — the track, once made. Alternate takes sit beside it under their 38 own names. 39- `cover.webp` — the song's card image in the song browser, 512×512. 40- `README.md` — its first paragraph is the card's description. 41 42A song lets Jev arrange it live by declaring it at the top in TypeSafe's 43own shape, `jev({ state, questions })` with the SDK's `choice`, `score` 44and `noul` (`website/src/jev/jevCore.mjs`), and composing the answers in 45Strudel. Songs use two: `formJev` picks the next section, and `walk(section, 46…)` holds the form's rules in code; `djJev`, asked after it (`after: { 47section }`), sets a level per part (out, back or full; a `score`, or a `choice` 48narrowed per section with `allow`) for that 49section, how the song moves into it, and its energy; each part plays at 50its level. 51The site's Worker relays the calls with the site's own TypeSafe key 52(`worker/`), so visitors need none. 53 54Levels: each song sets its own master with `.mul(postgain(x))` so its 55peaks sit under -1 dBFS. superdough's master limiter 56(`packages/superdough/superdoughoutput.mjs`) holds everything that reaches 57the speakers to -1 dBTP, so a hot mix cannot clip, but it is a safety net, 58not the mix: a song whose measured peak is -1.0 is being limited, and 59should be turned down until it is not. 60 61The card's duration is read from `song.js` itself: the tempo from 62`setcps(bpm/60/4)` and the bar count from the play-once mask 63(`.mask("<1!bars 0!…>")`). 64 65Themes: 66 67- `jev/` — songs about Jev, TypeSafe AI's typed-decision model.