Nobody has watched or listened to any of these captures. Every number is a program comparing two onset lists. The feel is not verified; a human check is still owed (follow-up sync-human-watch-listen-20261110). Overwritten in place at https://minds.gamecult.org/aqua/sync-offgrid-ramp-playground/ . Earlier page: sync-perlines.

aqua-feel sync: off-grid hits, a ramp detector, the Playground

2026-11-11. Follow-up to the Perlines v2 page. Same recorder (rec.cjs), headless Chromium with software GL, 640x360, ten hits per 12 s clip; the Playground recorder is pg-rec.cjs. Default profile (audio may lead 25 ms, lag 100 ms). Code: GameCult/AquaSynth tools/aqua-feel, SYNC.md.

1. Hit times off the 60 Hz frame grid

New WAV clicks-offgrid.wav (hits at 1.013, 2.241, 3.127, 4.389, 5.306, 6.652, 7.519, 8.834, 9.707, 10.943 s; list). The first page's identical -15.9 ms on every hit was the grid, as suspected. Two takes per scene, step detector and ramp detector (section 2) on each:

cliponset shapepaired/audio onsetsmedian lag msspread msverdictsfiles
Aurora disk take astep8/10-5.029.3inside-window 5, borderline 3report json
Aurora disk take aramp10/10+42.526.4borderline 10report json
Aurora disk take bstep8/10+5.426.9inside-window 8report json
Aurora disk take bramp10/10+53.447.7borderline 10report json
Burning water take astep10/10-0.163.5borderline 5, ambiguous-pairing 1, inside-window 4report json
Burning water take aramp10/10+32.876.1borderline 10report json
Burning water take bstep10/10+33.624.6inside-window 10report json
Burning water take bramp10/10+75.329.8borderline 10report json
Vector trails take astep0/10---report json
Vector trails take aramp10/10-7.680.2borderline 10report json
Vector trails take bstep0/10---report json
Vector trails take bramp9/10+15.422.5borderline 8, ambiguous-pairing 1report json

The real spread of the step detector on a software-rendered capture is 25 to 64 ms within one take (per-hit lag, min to max), and the median moves by up to 34 ms between two takes of the same scene (Burning water: -0.1 and +33.6 ms). So these clips cannot support a latency claim tighter than about +/-40 ms for the app, and cannot say which take is typical. Where the spread is small (24 to 29 ms) it is still the capture: frames arrive 17 to 50 ms apart. A real GPU is the missing control. Clips: Aurora take a, Burning water take a, Vector trails take a (other takes' reports are listed; their video is not kept).

2. Ramp detector (--shape ramp, PR #34, open: a third Soul pass has not reported, not merged)

On Vector trails the step detector pairs 0 of 10 hits in both takes; the ramp detector pairs 10 and 9 (see table). That is a recovered detection, not a recovered measurement:

3. AquaSynth Playground UI

The Playground (static page, 808-kick, published build 6080f9b, served locally) answers a sound with one thing that moves: the <meter id="level"> output-peak bar, written by the page's own animation loop from an analyser. It has no video to screen-record in a headless browser, so this is not a picture-and-sound clip. Instead pg-rec.cjs records (a) every write the app makes to the meter value with its timestamp, (b) the app's audio output sample-accurately through an AudioWorklet tap placed at the destination, and (c) the Play-click times; the audio clock and the page clock are bridged with getOutputTimestamp(). Six Play presses 1.5 s apart, four takes. Files: wav, meter track, presses (first take as pg-kick.* and pgk-0), screenshot.

takepaired/audio onsetsmedian lag msspread msverdictsfiles
take 16/6+22.714.3inside-window 6report json
take 26/6+24.515.0inside-window 6report json
take 36/6+39.440.6inside-window 6report json
take 46/6+26.447.0inside-window 6report json

Lag = audio onset minus meter onset; positive means the audio comes after the meter moves. In every take the meter moves 3 to 33 ms after the click and the sound lands 25 to 68 ms after the click, so the meter leads the sound by 4 to 56 ms (median across takes 23 to 39 ms) and all 24 pairs are inside-window by the default profile. That is a statement about the app's own meter and its audio graph, not about anything on screen. Whether a person perceives a meter 25 ms ahead of the sound as in sync is exactly the check that is still owed.

Where the limits show.

Still owed

A person watches and listens to a clip the tool calls inside-window and one it calls late and says whether the verdict matches; the 25/100 ms windows are checked against the standards texts; a capture on a real GPU and display.