Monorepo for Aesthetic.Computer aesthetic.computer
README.md

pop / xpld — "Explody Head" #

The start of a pop lane for xpld — "Explody Head", written and performed by Jeffrey Alan Scudder (Whistlegraph, 2023, 191K views across five tagged posts). A solo sung whistlegraph — one voice, one pen, no accompaniment — an emo self-portrait: hit a hump, gave up, got a new name, and a face full of internet, safe in a bubble with the emo-gee that signifies an identity.

What's here: the measured foundation (tempo, key, the melody per word, a word-level transcript, the per-phrase take comparison, a vocalized click track) and the aesthetivox pass — the note chart (bin/notes.py), the sample bank (vox/), and the WORLD sung-note render (bin/aesthetivox.py → out/xpld-aesthetivox.wav/.mp3 and the -halo variant).

The takes #

All five tagged posts are downloaded (bin/fetch.sh re-pulls them from the assets mirror; source/ stays out of git):

post date length what it is
7275499036398865706 2023-09-06 100 s the spine — 95.4K views: spoken intro (0–4.5 s, "Hey come here, I want to show you a whistlegraph called Explodey Head"), then the whole song clean (6.0–99.2 s)
7257275807209458986 2023-07-18 82 s "a real adventure" — the premiere; sung straight through, quiet room
7257695616694881582 2023-07-20 93 s "thing like a doggy #mood" take — the quietest room of the five (noise floor 0.0028, 20× below the primary)
7258670360357276970 2023-07-22 85 s "no match for my graphic tee ✒️💀" — real dog barks and coughs mid-take; carries the cleanest "do you see"
7278943795482283307 2023-09-15 81 s "whistlegraphing is not lame" — the last take, nine days after the spine; the most-voiced delivery of several phrases

bin/takes.py → analysis/takes.json is the per-phrase comparison (loner's take-rotation move): every canonical phrase of the primary matched into every other take by fuzzy transcript, measured for voiced coverage, cents to the derived grid (in each take's own fitted tonic — all five cluster 187.3–190.6 Hz, F♯3 +22 to +52¢ — two months apart and the pitch memory holds), and HF noise floor. Verdict: the render stays on the primary for every phrase (the unbroken-take philosophy — one warp, no seams); better_elsewhere marks where a future dub pass should look first: Blocking the doorway little doggy, Safely in a bubble that surrounds me and Gee defends me in my bubble (7278943…, more voiced, no further off-grid — but mind its high HF floor) and do you see (7258670…, ten times quieter than the primary's room). Caveat: three of the four alternates were transcribed by whisper as long run-on segments, so several canonical phrases fuzzy-match in only one or two other takes — the comparison is honest about that in matches.

What the source gave us #

Tempo — rubato, median ≈ 131 BPM. Onset autocorrelation over the sung region gives 133.9 global, but 10-second windows (octave-folded) drift 99 → 148 BPM around a median of 130.8. A hand-and-voice performance that breathes phrase by phrase. Verdict in analysis/tempo.json: "rubato".

Key — F♯, about +31 cents sharp, major/mixolydian-leaning and hand-drawn. F♯ is by far the most-sung pitch class (466 voiced frames vs 371 for the runner-up), and "this emo-Gee defends me in my bubble" cadences square onto F♯3. The scale the histogram keeps is 1 2 3 5 6 ♭7 — F♯ G♯ A♯ C♯ D♯ E — mixolydian with the 4th (B) nearly absent; A♯ (major third) clearly outweighs A. The ♭7 carries the closing question: "star oh yeah" and the final "do you see" both land on E3, unresolved; "signifying my identity" holds B3, the missing 4th making its one appearance as the high note. The voice sits ~+31 cents sharp of equal temperament — tune any accompaniment to TONIC ≈ 188 Hz (94.2 Hz an octave down), not concert F♯. Receipt: analysis/key.json.

The melody, per phrase (per-word pyin receipts in analysis/melody.json; times are the primary take's):

t phrase contour
6.2 Hit a hump and plateaued A2 B2 → D♯3 (the climb out of the hump)
10.4 then I gave up F3 C3 → C♯3
13.4 now they call me Explodey Head F♯2 C3 A♯2 → F♯2 (the low tonic octave — the name lands on 1)
19.0 Got my arm out waving anticipating F♯2 A2 B2 D♯3 → G♯3 (rising the whole way)
25.5 nothing special D♯3 → B2
29.1 Blocking the doorway little doggy A♯2 G2 F2 E2 → C♯3
34.0 thing like a doggy D♯3 A♯3 A♯3 → F♯3
37.3 will you shut the fuck up C3 E3 B3 A♯3 G♯3 → E3 (the outburst, stepping down)
43.0 This house that I built's got cracks at the sides D2 fry → A2 F3 · C♯3 E3 C3 D3
48.4 brittle like life and smoothing out A♯2 G2 G♯2 B2 → D♯3
54.2 Air pockets — you're no match for my graphic tee G4 F4 F4 (the peak of the take) then the drop: C3 A♯2 G♯2 A2 A♯2
59.0 my face is full of internet D♯3 → D♯4 E4 F4 D4 D4 (the second summit)
62.0 Safely in a bubble that surrounds me F♯3 G3 E3 F♯3 E3 B3 → G3
68.0 I don't think I want you back in here F♯3 D♯3 G3 F♯3 D♯3 G3 → E3
72.0 oh no · this emo G3 F3 · A♯3 G3
76.2 Gee defends me in my bubble E3 A♯3 F♯3 D3 C♯3 → F♯3 (the tonic cadence)
81.5 signifying my identity my identity F♯3 F♯3 → A♯3 A♯3 A♯3
90.0 It flickers like a shooting star C2 fry → C3 D3 G3 E3
95.6 oh yeah · do you see E3 · D3 E3 → E3 (♭7 — the question left open)

The words (whisper.cpp ggml-small.en, -ml 1 word-level; full timestamps in analysis/transcript.json, raw JSON in analysis/whisper-raw/):

Hit a hump and plateaued, then I gave up — now they call me Explodey Head. Got my arm out, waving, anticipating... nothing special. Blocking the doorway, little doggy, thing like a doggy — will you shut the fuck up. This house that I built's got cracks at the sides, brittle like life, and smoothing out air pockets. You're no match for my graphic tee — my face is full of internet. Safely in a bubble that surrounds me, I don't think I want you back in here, oh no. This emo-gee defends me in my bubble, signifying my identity, my identity. It flickers like a shooting star, oh yeah — do you see?

Cross-take notes: four of five takes hear "blocking the doorway" (the primary's "Locking" is delivery); 7278943… hears "built**'s got** cracks", confirming the primary's "built Scott" as 's got; the post caption on 7258670… confirms "graphic tee" (whisper variously hears teeth/tea/team); three takes hear "this emoji defends me" — the emo-gee/emoji pun is the lyric doing its job. One line to confirm with @jeffrey before words get re-sung: the syllable after "air pockets" (primary hears "dream", others "true"/"ew" — possibly just the vowel of the melisma).

The click track #

out/xpld-clickvox.wav / .mp3 — the vocalized click study (the kickvox move from cult/loner): a steady click marks the measured grid — soft kick on downbeats, 1.8 kHz tick on beats, 130.8 BPM, 4/4, two-bar count-in — and the primary take's own phrases sit on it dry, each phrase start snapped to the nearest beat (all shifts ≤ ±0.22 s; receipt with measured-vs-snapped beats in analysis/clickvox.json) with the internal rubato left intact. The point: hear where Jeffrey's phrasing agrees with a grid and where the arrangement will have to bend instead.

The notes and the chart #

bin/notes.py → analysis/notes.json + analysis/melody-chart.json — every sung word's target note, quantized to the derived 1 2 3 5 6 ♭7 set in the take's own 188.3 Hz (F♯3 +31¢) frame. The scale of record is key.json's frame-level derivation; notes.py re-probes it as a cross-check (the top four ranked degrees must be the 1 6 3 ♭7 spine — they are). Per word the pitch is re-measured as the sustain median (the last 60% of confidently-voiced pyin frames — the flwe fix: a whole-word median blurs a scooped onset into the note). The landmarks hold: "now they call me Explodey Head" lands in the low tonic octave (F♯2 → E2), "Airpockets" is the summit (sustain 408 Hz — G4+68¢ concert, which the +31¢ grid keeps as degree 2, G♯4), and the final "do you see" ends on the ♭7 (E3), unresolved — one pin holds it there against a 30¢ coin-flip toward D♯3; nothing is allowed to resolve it to the tonic. The chart puts each phrase on its clickvox beat with word onsets on-grid by construction (8th-note quantize, min half a beat) — the score any future arrangement reads.

The dubs, measured honestly: the four better_elsewhere phrases were checked for renderability and all four alternates sing them in a different register/contour (7278943…'s "Safely in a bubble" orbits 270–380 Hz where the spine sings ~165–250) — regulating that onto the spine's chart would mean 500–1600-cent pulls, no longer intonation repair. So the render never dubs (unbroken-take philosophy) and each chart phrase instead carries a dub block — the alternate's span, DP-aligned words, and hz_dub receipts — which the sample bank carves: Locking the doorway from 7258670… (the quiet July room beats the flagged 7278943… on every column), Safely in a bubble and Gee defends me from 7278943…, do you see from 7258670….

The sample bank #

vox/ — carves with natural onsets, everything indexed in vox/.manifest.json (source take, time range, f0/note, word):

  • NN-slug.wav — the 22 rendered sung phrases (dry, lead-in noted so beat 0 is placeable)
  • words/NN-MM-word.wav — 111 raw per-word carves from the primary (post boundary-repair/trim/attack-runway, nothing synthesized)
  • dubs/NN-slug--TAKE.wav — the four flagged phrases carved raw from their better takes, in their own register

The aesthetivox #

bin/aesthetivox.py → out/xpld-aesthetivox.wav/.mp3 (+ -halo) — the flwe/halo3 WORLD chain on the 130.8 grid: fitted-floor analysis, boundary repair, energy trim, 30 ms attack runway, consonants 1:1 (stretch weight 0.18) / voiced nuclei on the note at snap 0.92 with 45 ms smoothing, vowel-onset-on-the-beat with the consonant runway leaning in ahead, holds >1.8× flattening to target with 0.4 s vibrato fade-in, sibilant restore (+8 dB), tail capped at the next phrase's opening, synthetic WORLD release where the source hard-stops. The halo variant adds the octave halo (vowels-only, dark, ±6¢ pair) and low self-backup at −2/−4 scale degrees.

Two xpld-specific lessons: the primary's noisy room still gates (~19% of 5 ms frames under −36 dB, so trim/runway hold), and whisper crams fry clusters ("This house that I…", "Hit a…", "It flickers…") into 10 ms slivers — a redistribution pass (spread_crammed) spreads any run of sub-60 ms words over the room up to the next repaired boundary before warping, or a half-beat slot becomes a 23× frozen loop.

QC (in analysis/aesthetivox.json): the render re-measured against the chart with a target-bracketed harvest — median 6¢, p90 45¢ over 106 words. The residual outliers are the genuine fights: the "my"→"face" octave-leap pickup (+516¢ mid-glide — the glide release correctly lets the slide live), the C♯2 fry words (pitch ill-defined), and "smoothing"'s scooped onset.

Re-running #

bin/fetch.sh                                  # pull + decode all 5 takes
../../.venv/bin/python3 bin/analyze.py        # tempo.json, melody.json, transcript.json
../../.venv/bin/python3 bin/clickvox.py       # out/xpld-clickvox.wav+.mp3, clickvox.json
bin/transcribe.sh                             # whisper-raw/ for every take (needs whisper-cli
                                              #   + ~/Models/ggml-small.en.bin, or WHISPER_MODEL=…)
../../.venv/bin/python3 bin/takes.py          # takes.json (per-phrase take comparison)
../../.venv/bin/python3 bin/notes.py          # notes.json + melody-chart.json (the score)
../../.venv/bin/python3 bin/aesthetivox.py    # out/xpld-aesthetivox(+-halo).wav+.mp3,
                                              #   vox/ bank, analysis/aesthetivox.json

Whisper raw JSONs come from whisper-cli -m ggml-small.en.bin -f <16k wav> -ml 1 -oj (whisper.cpp). Everything python runs on pop/.venv (librosa + soundfile + pyworld); the key receipt (analysis/key.json) is derived from melody.json plus a frame-level voiced-pyin probe, and carries tonic_hz + scale_semitones for takes.py and the note chart.