Nobody has watched or listened to these clips. Everything below is two onset lists compared by a program. A person looking and listening is still owed (follow-up sync-human-watch-listen-20261110). The feel is not verified. This page is overwritten in place at https://minds.gamecult.org/aqua/sync-perlines/ .

aqua-feel sync on Perlines v2

2026-11-11. Three real clips of the Perlines v2 browser visualizer (perlines-v2/web, software-rendered headless Chromium via SwiftShader, 640x360) playing clicks.wav: ten decaying 110 Hz + 2.2 kHz hits at known file times (list), one clip per scene. The app's own audio output and its canvas are recorded together with MediaRecorder (vp8 + opus; recorder rec.cjs, wav maker mkwav.mjs). The app detected all ten hits in every take (HUD: onsets 10). Default profile (audio may lead 25 ms, lag 100 ms), no event log, --allow-unpaired. The tool is tools/aqua-feel in GameCult/AquaSynth, SYNC.md.

What it measures

Lag = audio onset minus visual onset, from the recording. It is the app's analysis-to-picture delay plus the capture's frame delivery. It is not a display, speaker or Bluetooth chain, and the headless software renderer is slower and stallier than a GPU.

sceneluma resultflux result
Aurora disk9 of 10 hits paired; median lag -20.6 ms (audio early), range -39.7..+8.0; 0 outside the window, 7 borderline (intervals straddle the edge), 1 hit with no visual onsetno visual onset found
Burning water10 of 10 paired; median +0.6 ms, range -38.6..+39.8; 0 outside, 8 borderline3 of 10 paired (lags +32..+40 ms)
Vector trailsno visual onset foundno visual onset found

Exit codes: 0 for the first two luma runs and burning-water flux; 1 for Aurora flux and Vector trails (nothing paired).

Where the limits show

Sync bug found and fixed

A browser webm declares no frame rate (1k tbr); readVideo silently fell back to 30 fps, and its uncertainty interval used the resampled period rather than the capture's real frame gaps, so a capture stalling to 34-50 ms looked as tight as a 60 fps one. Fix with tests and a Perlines fixture: GameCult/AquaSynth PR #33 (merged to main as 84aa12d after a Soul pass, whose two findings are fixed in it). The numbers here are from the fixed tool.

Clips and reports

1. Aurora disk

still · luma json · flux json

aqua-feel sync --kind luma
profile default: audio may lead by 25 ms, lag by 100 ms (conservative; between ATSC IS-191 and ITU-R BT.1359-1)
lag = audio - visual (+ = audio late). The visual onset is quantised up to the next frame (period 52.0 ms: the capture's source frames are up to that far apart), so the true lag lies in [lag - 27.3, lag + 79.3] ms (video resampled to constant frame rate)

label        event s   audio s  visual s  a-ev ms  v-ev ms   lag ms  verdict
a0            -      1.051    1.071     -       -      -20.6  borderline
a1            -      2.251    2.286     -       -      -34.9  borderline
a2            -      3.151    3.190     -       -      -39.7  borderline
a3            -      4.451    4.476     -       -      -25.4  borderline
a4            -      5.351    5.357     -       -       -6.3  borderline
a5            -      6.651    6.643     -       -        8.0  inside-window
a6            -      7.551    7.548     -       -        3.2  inside-window
a7            -      8.851    8.881     -       -      -30.1  borderline
a9            -     10.951   10.952     -       -       -1.6  borderline

9 paired, 1 audio and 0 visual onsets unpaired (allowed); median lag -20.6 ms, range -39.7..8.0 ms (spread 47.6 ms)
0 outside the window, 7 borderline, 0 ambiguous (neighbouring onset closer than 400 ms), 0 without both onsets. NOT DETECTABLY OUTSIDE THE WINDOW (7 borderline: the interval straddles the edge) by this metric.
A metric over two onset lists, not a verdict: a person still has to watch and listen (SYNC.md).
aqua-feel sync --kind flux
profile default: audio may lead by 25 ms, lag by 100 ms (conservative; between ATSC IS-191 and ITU-R BT.1359-1)
lag = audio - visual (+ = audio late). The visual onset is quantised up to the next frame (period 52.0 ms: the capture's source frames are up to that far apart), so the true lag lies in [lag - 27.3, lag + 79.3] ms (video resampled to constant frame rate)

label        event s   audio s  visual s  a-ev ms  v-ev ms   lag ms  verdict

0 paired, 10 audio and 0 visual onsets unpaired (allowed); median lag - ms, range - ms (spread - ms)
0 outside the window, 0 borderline, 0 ambiguous (neighbouring onset closer than 400 ms), 0 without both onsets. NOT WITHIN WINDOW by this metric.
A metric over two onset lists, not a verdict: a person still has to watch and listen (SYNC.md).

2. Burning water

still · luma json · flux json

aqua-feel sync --kind luma
profile default: audio may lead by 25 ms, lag by 100 ms (conservative; between ATSC IS-191 and ITU-R BT.1359-1)
lag = audio - visual (+ = audio late). The visual onset is quantised up to the next frame (period 46.0 ms: the capture's source frames are up to that far apart), so the true lag lies in [lag - 24.3, lag + 70.3] ms (video resampled to constant frame rate)

label        event s   audio s  visual s  a-ev ms  v-ev ms   lag ms  verdict
a0            -      1.040    1.000     -       -       39.8  borderline
a1            -      2.240    2.243     -       -       -3.4  borderline
a2            -      3.140    3.108     -       -       31.7  borderline
a3            -      4.440    4.405     -       -       34.4  borderline
a4            -      5.340    5.378     -       -      -38.6  borderline
a5            -      6.640    6.649     -       -       -8.8  borderline
a6            -      7.540    7.541     -       -       -0.7  borderline
a7            -      8.840    8.838     -       -        2.0  inside-window
a8            -      9.740    9.730     -       -       10.1  inside-window
a9            -     10.940   10.946     -       -       -6.1  borderline

10 paired, 0 audio and 0 visual onsets unpaired (allowed); median lag 0.6 ms, range -38.6..39.8 ms (spread 78.4 ms)
0 outside the window, 8 borderline, 0 ambiguous (neighbouring onset closer than 400 ms), 0 without both onsets. NOT DETECTABLY OUTSIDE THE WINDOW (8 borderline: the interval straddles the edge) by this metric.
A metric over two onset lists, not a verdict: a person still has to watch and listen (SYNC.md).
aqua-feel sync --kind flux
profile default: audio may lead by 25 ms, lag by 100 ms (conservative; between ATSC IS-191 and ITU-R BT.1359-1)
lag = audio - visual (+ = audio late). The visual onset is quantised up to the next frame (period 46.0 ms: the capture's source frames are up to that far apart), so the true lag lies in [lag - 24.3, lag + 70.3] ms (video resampled to constant frame rate)

label        event s   audio s  visual s  a-ev ms  v-ev ms   lag ms  verdict
a0            -      1.040    1.000     -       -       39.8  borderline
a2            -      3.140    3.108     -       -       31.7  borderline
a3            -      4.440    4.405     -       -       34.4  borderline

3 paired, 7 audio and 0 visual onsets unpaired (allowed); median lag 34.4 ms, range 31.7..39.8 ms (spread 8.1 ms)
0 outside the window, 3 borderline, 0 ambiguous (neighbouring onset closer than 400 ms), 0 without both onsets. NOT DETECTABLY OUTSIDE THE WINDOW (3 borderline: the interval straddles the edge) by this metric.
A metric over two onset lists, not a verdict: a person still has to watch and listen (SYNC.md).

3. Vector trails

still · luma json · flux json

aqua-feel sync --kind luma
profile default: audio may lead by 25 ms, lag by 100 ms (conservative; between ATSC IS-191 and ITU-R BT.1359-1)
lag = audio - visual (+ = audio late). The visual onset is quantised up to the next frame (period 36.0 ms: the capture's source frames are up to that far apart), so the true lag lies in [lag - 19.3, lag + 55.3] ms (video resampled to constant frame rate)

label        event s   audio s  visual s  a-ev ms  v-ev ms   lag ms  verdict

0 paired, 10 audio and 0 visual onsets unpaired (allowed); median lag - ms, range - ms (spread - ms)
0 outside the window, 0 borderline, 0 ambiguous (neighbouring onset closer than 400 ms), 0 without both onsets. NOT WITHIN WINDOW by this metric.
A metric over two onset lists, not a verdict: a person still has to watch and listen (SYNC.md).
aqua-feel sync --kind flux
profile default: audio may lead by 25 ms, lag by 100 ms (conservative; between ATSC IS-191 and ITU-R BT.1359-1)
lag = audio - visual (+ = audio late). The visual onset is quantised up to the next frame (period 36.0 ms: the capture's source frames are up to that far apart), so the true lag lies in [lag - 19.3, lag + 55.3] ms (video resampled to constant frame rate)

label        event s   audio s  visual s  a-ev ms  v-ev ms   lag ms  verdict

0 paired, 10 audio and 0 visual onsets unpaired (allowed); median lag - ms, range - ms (spread - ms)
0 outside the window, 0 borderline, 0 ambiguous (neighbouring onset closer than 400 ms), 0 without both onsets. NOT WITHIN WINDOW by this metric.
A metric over two onset lists, not a verdict: a person still has to watch and listen (SYNC.md).

Still owed

A person watches and listens to a clip the tool calls inside-window and one it calls outside-window and says whether the verdict matches; and the 25/100 ms windows are checked against the standards texts (EBU R37, ATSC IS-191 came from secondary summaries). Neither has happened.