ROOM ONE — TIMELINE & STAGGER
CHOREOGRAPHY
Two hundred eighty-nine performers, one score. Every entrance in this room is written on an anime.js timeline — placed by count, by offset, by label — and every rhythm is a stagger. Nothing here is triggered; everything is scheduled.
createTimeline · label() · seek() · stagger( grid · axis · value · position )
EXHIBIT 01·A — THE ENSEMBLE
Four movements for 289 dots
One createTimeline, four labelled movements — ripple, traverse,
breath, collapse. The score beneath the stage is not decoration: playhead,
readout and markers are read from the same timeline that drives the company.
Drag it, and the dots follow.
tl.label('movement-n') · delay: stagger(ms, { grid, from, axis }) · scale: stagger([a, b]) · tl.seek(ms)
0000 / 0000 MS MOVEMENT 1 — RIPPLE
DRAG TO SCRUB · ←/→ SEEK · SPACE PLAY/PAUSE · 1–4 MOVEMENTS
EXHIBIT 01·B — CANON
Three entrances, one motif
The amber voice states the phrase; the outlined voice answers. Between the
three rows only the position argument of .add() changes — the
count-in that decides when the second voice comes in.
tl.add(target, params, '<' | '<<' | '-=260')
'<' enters at the previous animation's end
'<<' enters with the previous animation's start
'-=260' enters 260 ms before the previous end
EXHIBIT 01·C — ROLL CALL
The same rhythm, written two ways
Both rows rise on an 80-millisecond count. Row A is one child animation with staggered delays — the timeline hears a single completion. Row B staggers the timeline position itself: twelve separate children, twelve completions. The lamps report what the timeline actually knows.
tl.add(bars, params, stagger(80, { start: 0 })) vs delay: stagger(80)
ROW A — delay: stagger(80) · one child animation
One onComplete
ROW B — position: stagger(80) · twelve child animations
Twelve onCompletes