bookends, words and the score: the title plays, the card faces the camera, the film sounds
The opening title sequence reaches the screen. `installScanlines` called the pp
tool with a named-argument table where it takes its arguments positionally, and
that raised one line above `Intro.start()`, so for twenty-five seconds the film
showed an empty sky. The call is positional now, the sequence starts first so
nothing below it can take the sequence with it, and the removal of a "tonemap"
pass that does not exist is gone. The sequence is DRIVEN from the part clock
rather than integrated from dt, so a seek lands on the right frame and a
dropped frame cannot walk the title out of step with the music. SPEED is
DURATION / RUNTIME with RUNTIME 25 s, so the part is exactly twenty-five
seconds and the mark holds the last second. `strobe` was written and never
called: the greeting card now breaks into hard white frames before the sign-off.
The end card faces the camera. Text3D fronts its own local -Z and the shot
stands at +Z, so the type read as its own mirror image; it is turned to meet
the lens. The void is the camera's rather than the scene's: the sky comes off
THIS camera for the card's ten seconds and goes back in `exit`, which no other
part's sky can notice. The sky and light setup moved out of `build` into
`enter` under the director's prebuild rule, and `exit` puts back what `enter`
took. Bloom is off on this one: over white type on black it draws a mirrored
copy of the type (#12893).
The film sounds. `Music.sync(t)` now owns the audible playhead as well as the
analysis clock — a source that ended, never started, or walked a quarter second
off the clock is re-armed, and a stray source this module lost track of is
cleared before a new one is armed. The engine's Audio source can be started but
not positioned, so the correction is "start it again from its own zero", which
is exact for a film played from the top and offset after an authoring seek;
`Music.offset()` reads that. A thirty-second take from the top records
mean_volume -25.8 dB against a baseline of -91.0.
The score is re-gridded onto the film's cuts. Twelve sections over 220 bars =
275 s, each named for the part it plays under, each taking its length from the
table rather than hard-coding it. The cue track lands on the contract: sechit
on all twelve cuts, the wrecking ball's one impact at 126.25, the creature's
five booms, the rider's six rings, the two storm bolts, the tesla stab grid
from 210 to 228.75 and riseend at 262.5. The master renders in 0.6 s of CPU,
so re-cutting the film and re-baking the score to the new cuts is one pass.
`Bake.installClip` authors the master through `asset.create` instead of writing
data.zaud by hand; the engine keeps a clip it has already loaded resident
either way (#8904), so the new score is heard on the next boot.
Captions are keyed by part NAME and part-local time, resolved through
`Director.timeline()`, and anchored to the LIVE camera rather than to a shot
table — so a part that restages its camera, or drives it itself from update,
cannot leave a card off frame. Each card is sized against the lens and held
inside the letterbox. Nine cards, one per part, none over the title sequence
and none over the end card. The module-scope require table went with them,
which takes p1_lumen, p5_tides, ferry and tides/* off the scene's load path.
MUSIC.md is the 220-bar grid, the cue table as times, and how playback works.
---
no em dashes in the score doc or the lines this slice wrote