v0.1.1 fixes the Detected tempo source. In v0.1.0 it locked to half the real tempo on programme material: it read 62 for the release video's 125 BPM groove (and 100 on a syncopated cut), while its metronome check passed. Nothing else in the plugin changed; the controls, the picture and the other tempo sources are as they were.
What was wrong
v0.1.0 summed every bin's spectral flux into one onset envelope and took the best autocorrelation lag, preferring half of it when it scored 70 % as well. On a real mix the kick's flux dwarfs the clap's, so the envelope repeats at the half note (kick to kick) and the half-lag test never fires; where the hats dominate it repeats at the eighth instead. It read 160 for a backbeat at 80 BPM and 200 for one at 100. The error also depended on the host's frame rate (the video's groove read 124.84 at 60 fps and 62.06 at 30, the video's rate), and every earlier check had run at 60 fps on a metronome, which has no metre to get wrong.
What it does now
- The envelope is kept in three registers — low (below 400 Hz), mid (400 Hz to 5 kHz) and high — each smoothed by 20 ms, standardised so a quiet clap counts as much as a loud kick, and weighted by how periodic it is on its own. The registers are fixed: Channels and Band Split no longer change what the tempo detector hears.
- A period is scored with its grouping and its subdivision,
S(T) = 0.5 R(T/2) + R(T) + R(2T). A prior around 120 BPM picks the family of related periods; within it the beat is the fastest level scoring at least 0.70 of the best, with no prior, so the beat wins over the half note and over the eighths. - A reading is published only when the one before agrees within 2 %: the first tempo appears at 4 s (was 3 s), and a single stray reading can no longer re-anchor the row clock.
What is verified
By tools/verify.sh on an Apple M4 Max, macOS 26.4, 2026-09-25, all green, and CI on the release commit:
pntest --groove(new): drum grooves rendered as audio and read through the harness's FFT — a backbeat (kick on 1 and 3, clap on 2 and 4, hats on the eighths), the same with the clap 12 dB and the hats 20 dB down, a syncopated kick, and a syncopated pluck over a backbeat, each at 80, 90, 100, 110, 125, 140, 150, 160 and 170 BPM; the release video's house groove at 115–135; four frame rates. 45 of 45 within ±1 BPM at the right metrical level by 4.00 s, holding to 16 s, worst error 0.26 BPM. The true beat scores at least 0.737 of its family's best and the double-time impostor at most 0.672, either side of the 0.70 ratio.- Negative control: v0.1.0's detector, kept in the harness, fails 15 of the 45 (160.4 for 80, 180.5 for 90, 200.2 for 100, 62.1 for the video's groove at 30 fps).
- The release video's own soundtrack (48 s, 125 BPM): 44 of 44 readings from 4 s within ±1 BPM, 124.5–125.0, at 30 and 60 fps. v0.1.0 read 62, 100 and 125 by turns at 30 fps.
- The metronome check (
--detected): 120, 100 and 150 BPM at 24–60 fps within ±1 BPM by 4.00 s, holding for twelve; a lag scaled by 1.1 still fails it. - The row clock follows the detected tempo over a host saying 77, and the header reads
BPM 125*. - Every other check as in v0.1.0 (clock, onsets, frame one, pitch, ring, grid at 640×360 and 320×180, 17 live controls, the pipe, oxbow);
--gridnow also runs on Apple's software renderer. - The browser demo's JavaScript port of the detector matches the C++ to six decimals on eight shared fixtures, and the demo is redeployed with it.
What is not
- A breakbeat with ghost snares and sixteenth hats still reads at the wrong level (double at 80, half from 140 to 170), and so does a four-on-the-floor with an off-beat bass at 80 and 90 BPM (its eighths are a real pulse at twice the tempo). The harness prints both and does not assert them. Use Host or Manual for such material.
- No real audio has reached it in a host, and nothing has been measured through Resolume's own FFT: the fixtures are synthesised audio through the harness's FFT. It has still never been loaded into Resolume on macOS.
- Windows: the DLL is built by CI from this source. It was not re-gated in Arena for this release: the change is in the CPU-side tempo detector, and the win-lab box has no sound device to drive it. v0.1.0's build passed the fleet gate 9/9.
- The macOS builds are signed and notarised by the release pipeline after publication.
Full account, with every number and the traps: AGENTS.md · User guide · Browser demo