Manga Panels — our demo

One example among many. Don't reuse its story, arc, shots, props or timings.

Demo: KOMA ONE: Thirty Frames a Second (KOMA ONE · 一秒三十格, 48.0 s) · manga-panels.mp4 · source in demo/

The picture is cut to a score synthesized in code (demo/mix.py, 160 BPM). To cut it to a sung version, re-measure demo/beats.json (bpm, offset, cuts, lyric lines); every time below follows from that file.

A music video for a fictional pocket camera. A street photographer chases a running light across a dusk crossing, waits, focuses in 0.02 s and presses the shutter as the pigeons rise; the camera splits that one second into thirty panels; she lowers the camera and smiles, then turns the lens on the viewer: "把你留在 這一頁" (I'll keep you on this page). The camera is drawn in the design language of a classic rangefinder-style retro digital camera, the type people recognise at a glance: a slim flat-topped body, a brushed-silver top and bottom plate, a vermilion leatherette wrap (the film's one spot colour), a short prime lens on one side, a viewfinder window in the opposite top corner, a knurled speed dial with the shutter button in its centre, an exposure dial and strap lugs. It is an original design: no real brand, model, logo, badge, lettering or numbers. The brand KOMA, the KOMA ONE camera, its specs and the photographer are all fictional; コマ (koma) is Japanese for both a manga panel and a film frame, and that pun is the film's spine: every shutter press adds a panel.

Story & structure

Shape: one second, told in eleven different ways of drawing panels. Every lyric line brings a new panel grammar instead of a new idea, and the lyric lettering itself changes register: narration boxes (verse, her inner voice) → hand-lettered shouts (chorus) → speech balloons (the last line, said to the viewer).

Native moves spent: panel = cut, panel ink-in in reading order, the shutter iris, chapter title page, break the frame (×4), same-composition panels, anticipation triptych, the empty panel, the quiet panel (間), time stop, the burst split (signature), panels merging into a spread, gutter travel, emotion tone, flip book, impact frames, colophon, narration box → shout → balloon.

Shots (grid: 160 BPM, 1 beat = 0.375 s, 1 bar = 1.5 s)

# Time Lyric Shot Camera Move
1 0.0–1.5 — inside the viewfinder: heptagonal shutter opens on the crossing, brackets hunt slow push shutter iris; blinks on beat 2, closes on beat 3.3
2 1.5–3.0 — one page, four panels on four beats: street / splash / grip / eye drift, push into the eye panel = cut
3 3.0–6.34 — chapter title page, key art over the border slow push, then the page splits along a gutter 扉頁, break the frame
4 6.0–9.0 街角 光在跑 street panel with a white light wedge running → her sprint panel pan right → left (reading direction) light by removing tone; break the frame
5 9.0–12.0 人群 一秒就變了 the same overhead crowd three times tilt down, push into her same composition; white-out (シーン)
6 12.0–15.0 舉起來 別眨眼 ready / raise / eye push into the pupil, impact cut anticipation triptych
7 15.0–18.0 下一格 就是現在 over the shoulder + dashed empty panel pan to the empty panel the empty panel filled on beat 6
8 18.0–21.0 對焦 零點零二秒 pigeons, frozen very slow push (the breath) time stop, bracket locks at 18.94
9 21.0–22.5 — finger on the shutter + heartbeat panel heartbeat pulses, push into the button concentric effect lines
10 22.5–24.0 (咔嚓!) パシャッ on focus lines → hard cut to one wide quiet panel (間): the camera at rest, one glint on the lens shake → the camera settles 18 px, slow push silence 23.25–24.0, no lettering
11 24.0–27.0 一秒三十格 the burst grid locked signature: 1→2→4→8→16→30
12 27.0–30.0 把風停在 我手裡 the merged spread, her leap above the border slow pan right → left freeze at 27.75; insert at 28.875
13 30.0–33.0 每一格 每一格 a page of nine numbered panels one gutter per beat, then pull back gutter travel
14 33.0–36.0 都是決定性瞬間 her smile on emotion tone slow push the slowest three seconds
15 36.0–39.0 一秒三十格 flip book locked thirty pages in 1.0 s
16 39.0–42.0 把你留在 這一頁 she aims at the viewer medium, then push into the lens brackets on the screen corners (39.75)
17 42.0–48.0 KOMA ONE / (咔嚓!) the last spread: brand + colophon very slow push end card, held 4.5–6 s

Score structure

Palette & props

End card

The colophon (奧付) on the last page, inked on the last shutter: 《KOMA ONE》一秒三十格 / KOMA ONE · Thirty Frames a Second / rule / 黑白漫畫分格 Manga Panels / LemoLab × Claude Opus 5.5 / credits ("畫面 Codex 生圖 · 音樂 代碼合成", "Images: Codex · Music: made in code") / "Fictional brand, product and character." The "LemoLab × Claude Opus 5.5" line exists only in this library demo.

Images

All drawings come from an image generator (OpenAI image generation through the Codex CLI, core/image/gen_image.py), re-printed as screentone by demo/tools/prep.py; none is a photo or an existing artwork. They belong to this demo only: a film in this style generates its own characters, products and panels for its own topic (STYLE.md §9), and never reuses, recolours or edits these. The images are not in git (demo/gen/, demo/img/ stay local); the prompts are. Fifteen images in demo/gen/, prompts in demo/prompts/:

Build notes

demo/
  build.sh       one command: screentone (gen/ → img/) → fonts (if missing) → events → score + foley → picture 30 fps → master −14 LUFS → readcheck → poster, styleframe
  index.html     one canvas, the five font subsets
  kit.js         the manga engine: panel, tone, lineTone, focus, speed, rings, star, sfx, narration, shout, balloon, afBox, halo, put, cover, cam, flash, text registry for readcheck
  film.js        render(t): one function per section (S_intro … S_end), lyrics, buildEvents() for the foley
  beats.json     the whole cut grid: bpm, offset, cuts (bars), lines (seconds), silence, fade_out, colophon
  mix.py         score and foley in numpy (uses core/audio/sfx.py)
  tools/         prep.py + prep_all.sh (screentone at display size), fonts.sh (Google Fonts subsets),
                 gen_all.sh, gen_camswap.sh (both through core/image/gen_image.py), style_suffix.txt
  prompts/       one text file per generated image, and the camera-change edit (README.md)

sh demo/build.sh from the style folder (or with LIB=<library root>) rebuilds the film from the generated images, with no new generation: tools/prep_all.sh, tools/fonts.sh, core/render/events.mjs → events.json, mix.py, core/render/video.mjs at 30 fps (WORKERS, default 2), core/render/mux.sh → manga-panels.mp4, then core/render/readcheck.mjs, poster.jpg and demo/stills/styleframe.jpg at 40.2 s. SKIP_PREP=1 keeps the screened images already in img/. Everything about timing is in demo/beats.json; to cut the picture to another song, re-measure only that file. A fresh clone needs only the core tier (Node, ffmpeg, the Python venv with numpy and soundfile); no tools/fetch.sh pack. The fonts are downloaded by tools/fonts.sh. The fifteen generated images are not in git, so a clone cannot rebuild this film as it is; build.sh stops and says so. demo/tools/gen_all.sh, then demo/tools/gen_camswap.sh (after moving the first drawings that show the camera into demo/gen/before/) draw a new set through core/image/gen_image.py, which needs the Codex CLI; new drawings mean re-measuring the anchors and crops in film.js and tools/prep_all.sh.