Silhouette Rhythm — our demo
One example among many. Don't reuse its story, arc, shots, props or timings.
Demo: Half a Beat 《慢半拍》 (49.0 s) · silhouette-rhythm.mp4 · source in demo/
A flock of flamingos moves on every beat, and one young bird is always half a beat late. No narration and no subtitles: the story is told by the poses, and the rhythm of the sound tells who is on the beat. The only words on screen are the end card.
Story & structure
Logline: in a flock that moves on every beat, the youngest is always late; when the flock takes off at sunset it is left behind, falls on its first try, and finds the beat in the ripples the others left on the water.
Arc: the rule (five heads flag on the beat in front of the sun; a small head jumps up a whole beat late, then half a beat late, and bumps its neighbour) → the character (the march; it takes two steps for every one, misses the about-turn and walks into an adult) → the stakes (the flock lines up and takes off one bird every half beat; it is still dancing with its eyes shut) → the failure (its run is off the beat, feet and wings; it trips, a comic freeze, a record stop) → the low point (alone in the glitter, no beat at all) → the turn (a ripple passes under it on the beat, then another; a line of rings leads to the sun and lights one per beat) → the second try (it counts in with the opening's head flags, now on the beat, and runs one step into each ring) → the climax (it leaves the water in front of the sun and everything freezes: its wings and the flock's wings at the same point of the stroke) → the ending (it catches up with the line flying low across the last of the sun and falls into step; the title's last word lands half a beat late).
Native moves spent: the beat in unison as the hook; the cascade for the take-off; the comic freeze on the fall; the beat written on the water as the turn; the freeze with the sky still moving (with an orbit) as the signature shot; the line across the sun as the ending; the black wipe and a whip pan as transitions.
Shots
120 BPM (beat 0.5 s, bar 2 s), 30 fps. Times in seconds.
| # | Time | Shot | Camera | Native move / note |
|---|---|---|---|---|
| 1 | 0.0–4.0 | five long necks in front of a huge sun flag together on 0, 1, 2, 3 and bob between; the young bird is too short to be seen and jumps up to flag: 1.5 (a whole beat late, the wrong way), 2.25 and 3.25 (half a beat late; the last one bumps a neck); 3.5 all five heads look down at it; 3.75 a small sheepish flag | telephoto from low, push 7.2 → 7.8 focal; the adults' bodies sit just under the frame edge | the hook: everyone in step but one |
| 2 | 4.0–10.0 | ten adults march through shallow water on the beat, light shafts between the legs; the young bird at the back takes two steps per beat; 8.0 the flock turns as one, it doesn't, walks into the chest of the adult in front (8.25), bounces, turns at 8.5 and ends up leading | match cut on the head flag → low lateral track at water level, blurred reeds in front; hard stop and reverse at 8.0 | 9.72 a near adult walks across the lens: black wipe |
| 3a | 10.0–12.0 | the sun touches the horizon; the lead looks up, the rest snap into a single file facing right, three per beat; the young bird at the left end, head in the water, then dancing to itself off the beat | side medium, slow push | |
| 3b | 12.0–14.0 | the lead runs: footfalls on eighths, a wingbeat on every beat, bigger each time; leaves the water at 13.42 in front of the sun | medium tracking; crane up and tilt from 13.2 | |
| 3c | 14.0–16.5 | eight more run in from the left and leave the water one every half beat at the centre of the frame; a rising diagonal forms in the sky; a dotted line of rings stays on the water | side wide, slow lateral move; whip pan left from 16.3 with directional blur | the cascade; the rings are planted here |
| 3d | 16.5–18.0 | the young bird, still flagging with its eyes shut; it stops, looks right, looks left: nobody | whip pan lands on a medium close shot (≈ 45 % of the height) | the beat is gone |
| 4 | 18.0–22.5 | its run: feet and wings off the beat; trips at 21.2; head first into the water, freeze 21.5–22.25 (legs up, a crown of water hanging); splash at 22.38 | medium close tracking, slight handheld | comic freeze, record stop |
| 5 | 22.5–27.0 | a small black shape sitting in the sun's glitter, its own rings spreading; the line of rings fading away toward the sun; the flock a row of specks | high wide, slow rise and pull back | no beat at all |
| 6a | 27.0–29.0 | its head comes up out of the water, drips, a shake; 28.0 and 28.5 a ripple passes under it exactly on the beat and flashes | low close shot | the beat written on the water |
| 6b | 29.0–32.0 | the line of rings from its feet to the sun; light runs along it, one pair of rings per beat (29.0–31.5); it nods along | eyeline cut → deep view along the line, slow push | eight drum hits in a row with the rings |
| 7a | 32.0–34.0 | standing in the first ring it flags its head four times, on the beat, the ring under it pulsing each time; crouches at 33.6 | locked side medium | the count-in |
| 7b | 34.0–36.0 | the run: one step into each ring on the eighths, rings lighting under its feet, wings opening wider each beat; leaves the water at 35.86 | low tracking, pushing in and dropping, the sun coming into frame | |
| 8 | 36.0–39.0 | signature: the take-off frozen in front of the sun: droplets hanging from its toes, a crown of water, the flock above with every wing at the top of the stroke, its own too; the sky keeps sinking to violet | cut straight into the freeze; orbit inside the frozen moment (lateral move with counter-yaw) | the freeze with the sky still moving |
| 9a | 39.0–41.0 | unfreeze: one wingbeat and it climbs out of frame past the sun | pull back and tilt up | |
| 9b | 41.0–49.0 | the whole line flies low across the last of the sun, reflections right under it; the young bird comes in from the left at double-time wingbeats and takes the last place at 42.5, in step from then on; the end card lands on the water | long lens, slow lateral move | the line across the sun |
Score structure
- 120 BPM, D minor through the dance and the run, a lift to F major at the freeze and in the chorus.
- 0–4: kick and marimba only; the flags carry the rhythm. Adults are a low log drum on the beat, the young bird a bright woodblock off it. At 3.5 everything stops for half a beat except its 3.75 tick.
- 4–12: full groove (marimba riff, plucked bass, kick, claps on 2 and 4, shaker, hats); tom fill into the about-turn; snaps on the line-up.
- 12–16.3: double time for the take-off (eighth bass, sixteenth shaker, toms); each departing bird a marimba note higher than the last.
- 16.5–18: a held low A, hats ticking, then nothing.
- 18–21.5: the band keeps the beat it can't match (kick and bass on the beat, a frantic marimba slightly off the grid); its steps and wingbeats are audibly off. 21.2 a falling whistle, 21.5 a record stop.
- 21.5–28 (silence 1): only water, wind and distant calls; the splash at 22.38.
- 28–32: the beat comes back one ring at a time: kick + conga + a rising kalimba / marimba note on eight beats; bass at 30, shaker at 31.
- 32–35.5: the count-in (its woodblock now on the beat over a kick), snare roll; then one instrument per step (bass and kick, claps, marimba and hats).
- 35.5–36 (silence 2): half a beat with only its last step and wind.
- 36: the hit (kick, crash, china, bass drum, wings), then a held F chord (strings, vibraphone, harp) under the freeze; a reversed cymbal into 39.
- 39–46: chorus in F (F, C, B♭maj9, C) with a wing push on every beat; the title words use the characters' voices (HALF and A on the log drum, BEAT on the woodblock, late); 46.0 the final chord and one last woodblock half a beat after it; the tail rings to 49.
- Mix: music bus cut dead at the two silences with its reverb tail kept; character hits on their own bus so they survive the cuts; −14 LUFS, true peak −1.0 dB.
Palette & props
- Figure #090307; sun #FFF6DC; the sky from gold #FFB347 and coral #FC4D2B (opening) through magenta #E0245C (alone) to violet #380A52 / #1A083D (after the freeze). The sun sinks from well above the horizon (shot 1) to a sliver (end card).
- Adults: 12 birds, small bodies, long legs, thin necks, smooth contours. Flight pose: neck forward, legs trailing, long narrow wings with separate primaries.
- The young bird: 0.72 × adult, round body with a downy scalloped outline (the only fuzzy contour in the film), shorter thicker neck, short straighter bill. It always stands on the left of the frame and at the back of the line.
- Water props: lingering "runway" rings (grow to ~0.55 m and fade over tens of seconds), fresh splash rings, crowns, falling drops. Reeds in the march, islands on the horizon.
End card
On the dark water at the lower left, word by word on the beat, each with a small ring under it: HALF (42.5) A (43.0) BEAT (43.75, half a beat late), 慢半拍 (44.2), Silhouette Rhythm · 剪影律動 (44.6), LemoLab × Claude Opus 5.5 (45.0); held to 49.0 while the line keeps flying. Anton 136 px, Noto Sans SC Black 64 px, Barlow Condensed 40 / 32 px, cream #FFF3E4. 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.
Build notes
demo/
build.sh one command: fonts (if missing) → events → score + foley → picture → master → readcheck → poster + style frame
index.html two canvases (WebGL sky/water/composite, 2D overlay for the whip blur and the end card), fonts
film.js render(t): camera, the cast and their schedules, runners, water light, every shot, freezes, motion blur, end card, EV (sound cues)
shapes.js parametric silhouettes: flamingo (stand/walk, young), flyer (flight/run/take-off), fluffEdge, palm, reeds, gull, boat
sky.js the fragment shader: sky ramps, clouds, sun, water, reflections, rays, rim, halo
audio.py score (sampled) + synthesised foley → out/mix.wav (49.000 s)
make_fonts.py subsets Anton, Barlow Condensed and Noto Sans SC to the end card's characters
events.json sound cues exported from window.EV
CREDITS, fonts/OFL-*.txt, stills/styleframe.jpg
sh demo/build.shtakes about a minute on Apple silicon (the picture renders 1470 frames in ~40 s with 2 workers; each frame 20–60 ms). In a fresh clone the fonts are not in git: the first run downloads Anton, Barlow Condensed and the Noto Sans SC variable font from github.com/google/fonts. The score needssh tools/fetch.sh instruments vcsl,vsco2ce,freepatsandkaroryfer.readcheck.mjspasses: HALF A BEAT 6.5 s, 慢半拍 4.8 s, the style line 4.4 s (3.5 needed), the sign-off 4.0 s (2.9 needed).- Everything depends on
tonly: walking and running feet are recomputed from the start of each shot, droplets are analytic, a freeze clamps subject time and the shader's noise time. Any second can be rendered on its own:node core/render/still.mjs styles/silhouette-rhythm/demo 37. - Demo-specific pitfalls: the young bird standing among the adults is hidden inside their black bodies (it has to jump to be seen in shot 1); a black figure on dark water vanishes (shot 5 puts it in the glitter column); the line of rings in shot 6b would be lost in the glitter if the sun sat exactly on it, so the sun is a little off the line; the reeds use
ctx.filter = blur(), which a renderer without canvas filters draws hard-edged without an error.