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