mexicat /pdoom-video

Code-rendered music video for "I'm Upping My P(doom)"

★ 3,856⑂ 426👁 11⑃ 8● 2▤ 0◈ 0
TypeScriptMITCreated 2026-09-24
3,856
stars
+13
426
forks
11
watchers
8
prs
2
issues
0
releases
0
discussions

README

I'm Upping My P(doom) — music video

A generative, code-rendered music video with word-synced karaoke typography. Every frame is a deterministic function of song time, so the live preview in the browser and the offline 1080p60 (or 4K60) export are identical.

Watch it in 4K on YouTube: https://www.youtube.com/watch?v=5EoO5413dBY

The YouTube upload is a slightly outdated render. For the latest and best-quality version, render it locally (see Render the video).

The video was made with Claude (Opus 5.5) in Claude Code: the concept and treatment, the lyric alignment and audio analysis, the renderer, every scene and the renders were all worked out in conversation with Claude.

The song is not ours: see Credits for who wrote and made it.

The concept, style bible and plate-by-plate treatment are in docs/TREATMENT.md. The engine and scene API are documented in docs/ENGINE.md.

 Layout

- audio/pdoom.mp3 — the song (the Claude-Pop version, see Credits).
- lyrics/lyrics.src.js — the original line-level lyrics (approximate timings).
- analysis/ — Python (uv) tools that produced the timing data: Demucs stem separation, CTC forced alignment cross-checked with Whisper, beat/downbeat/onset analysis. See analysis/align.py and analysis/analyze.py.
- data/lyrics.json — word-level (and some syllable-level) lyric timings.
- data/audio.json — tempo (132.007 BPM), beats, downbeats, sections, drum/vocal onsets and loudness envelopes.
- app/ — the renderer: TypeScript + three.js, bun + Vite.
  - src/engine/ — renderer core: timeline playback, post-processing (bloom, halation, grain), typography (Archivo, IBM Plex Mono, Cormorant Garamond, single-stroke plotter fonts), GPU line batches, HUD.
  - src/scenes/ — one module per plate (open, loss, prompt, hook, room, shoggoth, spacetime, ascent, bureau, leftturn, paperclips, fuse, stack, dense, loom, ilya, outro) plus shared motifs.
  - src/timeline.ts — the edit: scene windows anchored to lyric lines and snapped to the beat grid.
  - scripts/render.ts — offline renderer (headless Chrome → raw frames over WebSocket → ffmpeg).
- out/ — renders (not in the repo).

 Requirements

bun, Google Chrome (the offline renderer drives it headless through playwright-core) and ffmpeg with libx264. The analysis tools need uv; the renderer doesn't.

 Preview

sh
cd app
bun install
bunx vite


Open http://localhost:5173 and use the keys below. ?t=23 starts at a given time.

| Key | Action |
|---|---|
| space | play / pause |
| ← / → | seek ±1 s (±5 s with shift) |
| , / . | step one frame |
| [ / ] | previous / next scene |
| l | loop the current scene |
| h | hide the UI |

The preview renders in real time on a recent Mac. The export is not real time and is heavier.

 Render the video

sh
cd app
bun scripts/render.ts video --samples auto --shutter 0.2 --out ../out/pdoom.mp4


- Output: 1920×1080 at 60 fps, x264 CRF 16, AAC audio.
- Motion blur: every frame is the average of many sub-frames spread over a short shutter (--shutter 0.2, a fi

Snapshot: 2026-11-10T09:35:25Z · Data license Apache-2.0 · JSON