80s Cel Anime — our demo

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

Demo: City Lights, 1987 (59 s) · cel-anime-80s.mp4 · source in demo/

Story & structure

After the rain, a courier nicknamed "Nightbird" rides a white motorbike across a neon city to deliver a pilot's forgotten cassette to the launch pad before a dawn rocket launch. One hero, one goal, one deadline (sunrise).

Arc (59 s): cold open with a deadline → the hero sets off (title hit) → joyful momentum montage → an obstacle (a drawbridge rising) → one decisive move (the jump; the peak freezes) → release into a new light (night becomes dawn) → end card. The song on the tape is the score itself: when the cassette plays aboard, the score becomes diegetic.

The adaptation idea for this story (one example, not a rule): turn a topic into a delivery, a race against a deadline or a launch; plant the goal early (the rocket on the horizon), block it in act two, reveal it in the light at the end. Other adaptations: a product launch as a courier racing the product to the stage; a love story as two lights crossing a sleeping city; a history lesson as a pilot flying through eras painted as backgrounds.

Native powers spent: painted city vs flat cel (neon city, wet asphalt, dawn sky), limited animation (held close-ups, the jump as a painted still), backlit light (signs, tail lights, gauges, title), speed grammar (parallax, speed lines, impact frames), the theme song as a plot object (the cassette).

Shots

Beat Camera
Cold open Multiplane crane-down over a tall painted plate (sky → rooftops → neon → street), foreground layers faster; radio dispatch over rain
The object that matters Tight insert on a gloved hand holding the cassette, soft bokeh behind, a highlight sliding over its plastic
Resolve Extreme close-up on the eyes; they open in three 8 fps drawings on the line "Copy. I'll beat the sun."
Title Backlit title card, letters flicker on at 12 fps, a light bar sweeps across, star glint, on the brass hit
Momentum Side tracking with 4 parallax layers + tail-light trail; rear view into a neon canyon (pseudo-3D); held bust with neon light bands; wheel insert through a puddle; a wide elevated-highway shot that plants the goal (the rocket across the bay)
Obstacle First-person approach to the rising drawbridge; glove twisting the throttle and the rev gauge in extreme close-up, cutting faster
Peak Low front view on radial speed lines → one-beat freeze + white flash → impact frame → painted "harmony" still of the airborne bike with a slow pan → impact frame → landing with sparks and camera shake
Release The same side-tracking composition as the night ride, repainted at dawn by the sea with the sky open
Handover Two hands through a fence pass the tape; a finger presses PLAY on the cockpit cassette deck
Ending The rocket lifts off (tilt up, delayed); warm close-up that answers the opening line ("Told you I'd beat the sun."), then the end card

The rider's front view was tucked behind a tinted windscreen so only goggles and hair show, letting the headlight flare carry the shot. Cuts landed on bars (116 BPM, bar = 2.069 s).

Score structure

Original city-pop / synth-funk "anime opening", synthesized in numpy (demo/music/score.py): 116 BPM, E♭ major, maj7/9 chords, the J-pop "royal road" progression (IVM7–V7–iii7–vi7). FM electric piano (DX7-style 1:1 carriers + a 14:1 bell transient), slap bass (thumb + octave pops), gated-reverb snare, synth brass stabs, chorus-y 16th-note guitar chanks, string pad, a singable lead hook, FM bell sparkle, and a key change up a semitone for the last chorus.

Written to the cut: intro under the cold open, a fill bar with space for engine revs, the title on a brass hit, verse under the montage, a pre-chorus build, one beat of true silence before the jump, the chorus on the painted still, an accent on the landing, and the final chord on the end card. Diegetic twist: when the tape plays in the cockpit, the score is band-passed to a cassette sound for one bar, then opens to full range with the key change as the rocket lifts.

Foley: engine from an RPM curve (harmonic saw stack + firing jitter + band-passed exhaust pulses, low-passed when airborne), rain bed + random drops, tire hiss on wet road, wind, bridge bells, radio squelch clicks, impact boom, metal scrape and sparks, cassette clicks, button + motor, rocket ignition and roar.

Voices: an English-dub feel, 8 short lines: the heroine (Kokoro af_bella) and a radio dispatcher (Kokoro am_michael through a band-pass 380–2800 Hz + saturation + squelch). Whisper mishears "Launch is at dawn", so the line is "The launch is at dawn". Mix: voices balanced by RMS ~10 dB above the ducked music, music ducked ~9 dB under lines, engine and ambience ducked 3 dB, chorus 4–6 dB louder than the intro, two-pass loudnorm to −14 LUFS.

Palette & props

End card

Darkened final dawn background, the title, the style name "80s Cel Anime", "LemoLab × Claude Opus 5.5", a one-line originality note and credits. The "LemoLab × Claude Opus 5.5" sign-off belongs to this library's demo only; a user's film carries no LemoLab credit and no copy of this card.

Title card as used: "CITY LIGHTS" in heavy italic chrome with シティ・ライツ above (Dela Gothic One), a red "1987" and a spaced-out tagline. Subtitles: Barlow Semi Condensed 600, 54 px, cream-yellow #fff0a0, 9 px dark outline, 96 px above the bottom; radio lines cyan #8ff4ff with a boxed "● BASE" tag; each line up for max(duration + 0.6 s, 1.9 s).

Rights & credits

Build notes

styles/cel-anime-80s/demo/
  cel.js     path / cel / ribbon / flutter helpers      pal.js   color models (day → night / dawn / backlit)
  rider.js   side-view bike + rider, limbs, wheels      head80.js  80s heroine head: 3 views × expressions, body/collar/scarf
  hands.js   pinch-grip gloves                          bg.js    painted plates (street, skyline, tall crane plates, reflections)
  fx.js      rain, splashes, speed lines, flares, lamps, light trails
  post.js    WebGL videotape + CRT pass (bloom, grade, chroma bleed, subtitles, scanlines, grille, glow, power-on, tracking noise)
  shots.js + scenes1–4.js   one function per shot     story.js  bar-aligned timeline, lines, credits
  hud.js     VHS-style subtitles     main.js  plates, shot dispatch, sound events
  lines.json voices   mix.py   music/score.py (original score)   tools/ (still, sheet, srt, mux)
  1. Treatment → story.js (116 BPM bar grid, shots, lines).
  2. node styles/cel-anime-80s/demo/tools/still.mjs styles/cel-anime-80s/demo --range 0.5:58.5:1 --out /tmp/cs → tools/sheet.py contact sheet → look → fix. ?test=model|close|side renders the model sheet / head close-up / rider; ?raw=1 bypasses the CRT pass; ?nosub=1 hides subtitles.
  3. .venv/bin/python core/tts/tts.py demo/lines.json demo/voices → core/tts/asr_check.py.
  4. .venv/bin/python demo/music/score.py (score + stems + cue times).
  5. node core/render/events.mjs demo → .venv/bin/python demo/mix.py.
  6. node core/render/video.mjs demo --fps 24 --workers 4 --out demo/out/video24.mp4 (1416 frames ≈ 36 s on an M-series Mac).
  7. sh demo/tools/mux.sh demo/out/video24.mp4 demo/mix.wav cel-anime-80s.mp4 24, python demo/tools/srt.py.

Encoding numbers: ffmpeg grain luma 4 + chroma 1 at CRF 22 gives ~32 MB/min; luma 5 + chroma 2 at CRF 18 is 270 MB; with the CRT pass CRF 22 goes over 35 MB/min, CRF 23 with luma-only noise 2 lands at ~31 MB. Single-pass loudnorm lands at −13.5 LUFS; two-pass with linear=true lands at −14.0. A hot limiter squashes the chorus to the intro's loudness: normalize to the 99.99th percentile and let only rare peaks hit the limiter.

Pitfalls tied to this demo's props: - A bloom threshold on the colour canvas turns the white bike and the jacket pink. - The S-curve makes a black hole in the headlight (clamp first). - A rim offset of 6–8 px turns the thin hair ribbons completely pink. - Hair can read as tentacles; keep bang tips off the eyes, where they hide the lash line. - Don't put a flattened front face on a 3/4 body (equal eyes, no cheekbone turn, V chin, long thin neck): it reads as a paper mask. - Night faces go pink from the night tint + magenta rim + pink light sweeps; forehead patches show between bang locks. - In the rear canyon shot, points behind the camera flip up into the sky (cull them). - The rocket leaves the frame unless you follow it with a delayed tilt and a slower (quadratic) climb.