Let scenes layer on each other, and give the camera somewhere to look
Two devices that were built, wired up, and doing nothing. OVERLAYS. buildStack gated layering on `surfaceOf(m) === 'composable'`, and no scene in the library declared `surface` — so the only thing that could ever sit on top was the one scene declaring `role: 'accent'`, and the overlay roster excluded accents by construction. Empty intersection, every time: 0/144 stacks carried an overlay. Every layered frame in every song was the same particle field. Labelled the library from the phase 12 coverage gate rather than by eye: the 37 scenes painting under 30% of the frame are composable. Particle Field loses its privileged slot and becomes one of them, keeping only `background: false`, which is the honest part — points in empty space cannot carry a section alone. The reserved accent slot is gone; one roster, two passes at it. 1 distinct overlay scene becomes 27, and the rate lands at 34% of stacks after trimming a base chance that had been tuned while the branch was dead. THE CAMERA. framing.shift moved the frame by a median of 0.029 of a half-frame at a fresh random angle every shot, so successive offsets cancelled and the median jump at a cut was 0.014. Present in every frame, visible in none. look/Camera.js is the director's camera department: the story says tension, order and which act a section is in, and this turns that into where the frame looks and how it travels there. Each director names a camera. Jump distance follows tension and act, speed follows energy, and the curve is one of four. Cuts choose between reframing and matching, so two scenes can still read as one place. Median offset 0.190, median reframe 0.135, and 94% of shots now move during the shot rather than only at the cut. Four new gates, each with a FLOOR — the device this replaces passed every existing check while doing nothing, because the only bound was a ceiling. Also lands the in-progress Epic 4 story layer it builds on: Story.js, phase 13, and the direction statistic. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+30
-2
@@ -26,6 +26,25 @@ Analysing the whole track up front also buys the thing a causal analyser cannot
|
||||
a build can *anticipate* its drop and arrive at the transition already at full
|
||||
tension, instead of reacting once the drop has landed.
|
||||
|
||||
## The story
|
||||
|
||||
Everything above happens at a moment. On top of it the track gets a **story**: a
|
||||
plot chosen per song, four **moments** found in the audio (arrival, turn, climax,
|
||||
resolution), and a position for every section — *which* of the four drops this
|
||||
is, not just that it is a drop.
|
||||
|
||||
That position moves what the video does. The kind's anchor scene is reserved for
|
||||
the climax rather than opening every section of its kind; the dials ratchet with
|
||||
each recurrence; the cutting rate follows tension and the resolution holds; the
|
||||
song's cast arrives over the video instead of being fully stated in the first
|
||||
shot; and under a *return* plot the outro re-casts what the intro opened on.
|
||||
|
||||
The story never overrides the song. Its moments are read off the section
|
||||
energies, and its effect on parameter bias is bounded so it can decide which
|
||||
drop this is and never whether a breakdown is one. `D` shows the current plot,
|
||||
act and journey; the timeline marks the moments. `EPIC-4.md` has the design.
|
||||
|
||||
|
||||
## Working with it
|
||||
|
||||
| | |
|
||||
@@ -56,7 +75,10 @@ npm test # audio pipeline against synthetic ground truth
|
||||
npm run lint:scenes # determinism grep + scene schema/shader agreement
|
||||
```
|
||||
|
||||
`http://localhost:5180/checks.html` runs the GPU gates for every phase. Add
|
||||
`http://localhost:5180/filmstrip.html` renders every song in the bank as one frame
|
||||
every 30 seconds, so a video that is busy and going nowhere is visible as a row of
|
||||
interchangeable stills. `http://localhost:5180/checks.html` runs the GPU gates for
|
||||
every phase. Add
|
||||
`?slow=1` for the full suite, `?phase=5` for one phase.
|
||||
|
||||
### Seed variety test
|
||||
@@ -79,6 +101,12 @@ across its own sections, the **ceiling** is the same pipeline with every layer
|
||||
recast at random. Two checks gate the instrument itself before any number from
|
||||
it is trusted.
|
||||
|
||||
The report also prints **direction**: the rank correlation between how far apart two
|
||||
probes are in time and how far apart they look. `drift` cannot tell a video that
|
||||
travels from one that merely keeps changing, and a video with a story raises it on
|
||||
purpose — so read the two together. A floor that rises *with* direction is an arc; a
|
||||
floor that rises without one is a shuffle.
|
||||
|
||||
The report also sweeps **all** visualizations in the library, every pair, and
|
||||
names the structural twins — different scenes that are the same look in
|
||||
different colours, which the per-scene `distinct` gate cannot catch because it
|
||||
@@ -135,7 +163,7 @@ Scenes that composite over a background rather than being one declare
|
||||
src/
|
||||
audio/ decode, STFT analysis, tempo, segmentation, FeatureTrack, metronome
|
||||
engine/ Timeline, Renderer, Layer, Compositor, passes, seeded rng, flash safety
|
||||
look/ palette (OKLCH), LookGenerator, ArcDriver
|
||||
look/ palette (OKLCH), LookGenerator, ArcDriver, Story
|
||||
params/ declarative schema, validation, serialisation
|
||||
scenes/ the library — shader/ and layers3d/
|
||||
export/ WebCodecs exporter
|
||||
|
||||
Reference in New Issue
Block a user