Mikkeli Matlock
|
b400551321
|
Move plotting to pyqtgraph: interactive, overlay-capable render layer
Replace the fire-and-forget matplotlib pipeline (render() -> throwaway Figure ->
canvas teardown) with a three-stage architecture that supports zoom/pan, lin/log
toggling, and multi-file overlay:
compute(audio_file) -> data # heavy, worker thread, backend-neutral
build_spec(data, view) -> PlotSpec # cheap, GUI thread, view-aware
show_specs([(label, spec, color)]) # pyqtgraph, persistent PlotItem, overlay
- plotspec.py: backend-agnostic descriptors (Curve, Band, HLine, Heatmap,
AxisSpec, PlotSpec) + ViewState (recompute-free lin/log)
- audio_visualization_widget.py: persistent pyqtgraph plot, never torn down;
per-dataset colours for overlay; spectrogram log-freq via row resample
(ImageItem is affine-only); ColorBarItem at a fixed cell
- Compare/overlay driven by file-list checkboxes; stable per-song colour by row
- Custom draggable reference lines (add/clear), persist across redraws
- Axis-constrained scroll zoom: Ctrl=time, Shift=value (_AxisZoomViewBox)
- RMS render no longer per-segment fill_between (was the slow path)
Fixes found in review/testing:
- FillBetweenItem needs penned child curves or it fills nothing (RMS/Waveform
were blank); band fill verified by pixel count
- band overlay alpha was a no-op (QBrush.color() returns a copy)
- colorbar could stack across renders; now added/removed at a fixed layout cell
Deferred (per scope): stereo retention, deep perf rewrites (eager beat_track,
true-peak/crest loops, shared LUFS), per-song colour picker UI.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-06-14 00:35:10 +09:00 |
|