From 0a89676cc8797320a3005c19040760cc7cde83f3 Mon Sep 17 00:00:00 2001 From: Dejvino Date: Wed, 19 Aug 2026 17:16:15 +0200 Subject: [PATCH] One scene, wide: songs against seeds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six thumbnails is enough to rank sixty-eight scenes and far too few to study one. Worse, six songs at one seed each confounds the two inputs: a scene whose frames are interchangeable might be ignoring the identity or ignoring the music, and the library gallery cannot say which. So a scene's name in the gallery now opens it on a grid — songs down, seeds across, up to every song in the bank by ten draws. Buttons pick the size and walk onto a fresh block of seeds, which is a much better answer to "is it flat or was that ten unlucky rolls" than staring at the same ten. The state lives in the URL, so every button is also a back button. Three scores rather than one, and the two new ones are the diagnosis: ACROSS SEEDS is the same song with a different draw, so low means the scene ignores the identity; ACROSS SONGS is the same draw against different music, so low means it ignores the song. They point at different fixes. The closest pair is outlined, because at 170 cells no eye is finding it. The first version hashed the song name into the seed so a column would not be one roll repeated down the grid. It reads better and measures nothing: with the seed varying on both axes the two scores are the same comparison, and they came back within 0.001 of each other for every scene tried. A column holds its seed fixed now, which is what makes it attributable to the music — and the scores separate, with the seed moving every scene tried more than the song does. 170 cells in 9s. The songs are the slow part and are analysed one at a time so the count moves, then cached for the session. Co-Authored-By: Claude Opus 5 --- flow-state/debug.html | 13 ++ flow-state/gallery.html | 266 ++++++++++++++++++++++++++- flow-state/src/checks/scene-sweep.js | 241 ++++++++++++++++++++++++ 3 files changed, 511 insertions(+), 9 deletions(-) create mode 100644 flow-state/src/checks/scene-sweep.js diff --git a/flow-state/debug.html b/flow-state/debug.html index 3e79a24..b0835c1 100644 --- a/flow-state/debug.html +++ b/flow-state/debug.html @@ -53,6 +53,19 @@
~3 min · the one to open when a scene feels familiar · HOWTO-variety.md for how to fix what it finds
+
+

one scene, wide

+

The gallery for a single visualizer, on a grid of songs (rows) against + seeds (columns) — up to every song in the bank by ten draws. Six + thumbnails ranks a library; it is far too few to study one scene. + Scores the two axes separately, which is the thing the library + gallery cannot tell you: across seeds low means the + scene ignores the identity, across songs low means it + ignores the music. The closest pair in the grid is outlined.

+
seconds, after the songs are analysed once · + click any scene name in the gallery to open it here · + the buttons change grid size and walk onto fresh seeds
+

filmstrip

Every song in the bank, one frame every 30 seconds, left to right. diff --git a/flow-state/gallery.html b/flow-state/gallery.html index 0c2437c..aefb33d 100644 --- a/flow-state/gallery.html +++ b/flow-state/gallery.html @@ -72,6 +72,35 @@ padding: 0 8px; color: #ef4444; font-size: 11px; letter-spacing: .04em; } @media (max-width: 1100px) { .thumbs { grid-template-columns: repeat(3, 1fr); } } + + /* ---- single-scene sweep --------------------------------------------- */ + .name a { color: inherit; text-decoration: none; border-bottom: 1px dotted #3a4256; } + .name a:hover { color: #7dd3fc; } + .btns { display: inline-flex; gap: 4px; margin-left: 4px; } + .btns button.on { border-color: #7dd3fc; color: #7dd3fc; } + .sweep { display: grid; gap: 5px; align-items: center; margin-top: 8px; } + .sweep .colhead { font-size: 10px; color: #565f70; text-align: center; } + .sweep .rowlabel { + font-size: 11px; color: #8b94a7; text-align: right; + padding-right: 8px; white-space: nowrap; + } + .sweep .cell { position: relative; line-height: 0; } + .sweep canvas { + width: 100%; display: block; background: #05070a; + border-radius: 2px; aspect-ratio: 16 / 9; + } + /* The two cells that measured closest — on a grid this wide they are the + only pair an eye has no chance of finding on its own. */ + .sweep .cell.twin canvas { outline: 2px solid #ef4444; outline-offset: 1px; } + .sweep .cell.twin::after { + content: 'twin'; position: absolute; top: 2px; left: 3px; + font-size: 9px; color: #ef4444; line-height: 1; + } + .axes { display: flex; gap: 18px; flex-wrap: wrap; margin: 10px 0 2px; } + .axes div { font-size: 12px; } + .axes b { color: #e6eaf2; font-weight: normal; } + .axes .weak b { color: #ef4444; } + .axes small { color: #6b7280; display: block; font-size: 11px; } @@ -87,31 +116,50 @@ each other: the highest-scoring scenes are often a few bright elements on black, which is varied and thin to watch on its own. Those are composable — they are meant to sit on top of a canvas. + Click a scene's name to open it on its own, across a much + wider grid of songs and seeds — six frames ranks a library and is far too + few to study one scene. ← all debug tools

- - + + + + + checking cache…
+