v0.54.0: Kaleidostrobe at 60 fps, its big window on the GPU, two-tone gray mode, sync can go sooner

The plugin still steps at its own 25 fps, frame for frame; between frames
the turn continues, textures crossfade, and the cone follows a preview of
the newest audio, so beats land a refresh sooner. The big window replays
the original's GL calls through OpenGL (QPainter took ~40 ms a frame at
1080p); without GL it falls back. Gray mode is only the gray-mode colour on
the panel background. The sync slider goes to -50 ms (sooner).
This commit is contained in:
2026-10-14 12:26:38 -07:00
parent e38c751e39
commit 7ae55e757a
11 changed files with 514 additions and 121 deletions
+18 -4
View File
@@ -279,10 +279,24 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal
were Apple SDK leftovers its code never read, so the style has none. It
reads only iTunes' **spectrum** bytes (never the waveform); iTunes' byte
scale was never published, so `itunes_spectrum` (√magnitude, 43 Hz bins)
is the one calibrated stand-in. Painting: each GL triangle is planar, so
it is drawn in texture space through a projective **world** transform
(Qt mis-draws a strongly projective *brush* transform); the top cone is
always nearer, so painter's order is the depth test.
is the one calibrated stand-in. **On screen it is 60 fps anyway**
(Round 85): between the 25 Hz frames `_compose` turns the cones by a
fraction of a frame, crossfades the textures, and takes height/depth from
`engine.preview` — the plugin's analysis run on a throwaway copy with the
newest audio, so a beat pumps the cone one refresh later, not one 40 ms
tick later. `preview` must never touch real state (a golden test
interleaves it). Painting: the panel uses QPainter — each GL triangle is
planar, drawn in texture space through a projective **world** transform
(Qt mis-draws a strongly projective *brush* transform). The **big window
replays the original's GL calls** (`paint_gl` in a `gui/kaleido_gl.py`
QOpenGLWidget, GL 2.1 fixed-function via QOpenGLVersionFunctionsFactory):
QPainter cost ~40 ms a frame at 1920×1080, which is what stuttered. No GL
→ `unavailable` → the window paints with QPainter again. Gray mode is
strictly two-tone (gray-mode colour on the panel background, by HSV
value — luma calls the saturated palettes dark). The sync slider now goes
below 0 ("sooner"), borrowing audio decoded but not yet heard — only
~0–30 ms of it exists, hence the −50 ms floor. The top cone is always
nearer, so painter's order is the depth test.
`tests/kaleidostrobe_golden.npz` was recorded from the emulated original
and `test_round84` holds the port to it byte for byte.