Speed up analysis: drop BPM, vectorise loudness/true-peak, share short-term
Profiled hot spots on a 4-min track and cut the worst offenders: - Remove BPM: librosa.beat.beat_track ran on every load (~3.7s) for a number no better than tapping by hand. Dropped from AudioFile + the metadata panel. - LUFS short-term: replace 474 per-window pyloudnorm.integrated_loudness calls with one K-weighting pass (reusing pyloudnorm's own filter coefficients) + a vectorised sliding mean-square. This is true *ungated* EBU R128 short-term (the old loop wrongly gated each 3s window). Integrated + LRA still use pyloudnorm's gated calls. ~3.8s -> ~1.9s. - PSR: reuse LUFS's short-term series (memoised on the AudioFile) + vectorised sample-peak. ~3.0s -> ~0.2s. - True Peak: oversample the whole signal once, then an O(N) running max over windows instead of per-window resample_poly. Bit-identical to the old loop (max|diff| 0.0000 dB). ~2.1s -> ~1.1s. - Crest Factor: peaks via the same O(N) running max (last per-window loop gone). lufs+psr+true_peak: ~9.2s -> ~3.2s, plus ~3.7s of BPM removed from every load. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -82,10 +82,16 @@ A custom mastering toolkit that provides metrics to evaluate audio masterings th
|
||||
- Current registry:
|
||||
- `RMSPowerMetric` — 10 s rolling RMS with adaptive colour scale
|
||||
- `WaveformMetric` — min/max envelope, fixed ±1.1 y-range
|
||||
- `LUFSMetric` — BS.1770 short-term (3 s) + integrated + LRA, via pyloudnorm
|
||||
- `CrestFactorMetric` — 20·log10(peak/RMS) per 1 s window
|
||||
- `PSRMetric` — sample-peak minus short-term LUFS (3 s window)
|
||||
- `TruePeakMetric` — 4× oversampled dBTP via `scipy.signal.resample_poly`
|
||||
- `LUFSMetric` — true (ungated) EBU R128 short-term (3 s) computed via a single
|
||||
K-weighting pass (`_short_term_lufs`, reusing pyloudnorm's filter
|
||||
coefficients) + a vectorised sliding mean-square; integrated + LRA still come
|
||||
from pyloudnorm (one gated call each). ~2× faster than the old per-window loop
|
||||
- `CrestFactorMetric` — 20·log10(peak/RMS) per 1 s window; peaks via O(N) running max
|
||||
- `PSRMetric` — sample-peak minus short-term LUFS (3 s window); reuses
|
||||
`LUFSMetric`'s short-term series (memoised on the `AudioFile`), so PSR is
|
||||
near-free once LUFS is computed
|
||||
- `TruePeakMetric` — 4× oversampled dBTP; the whole signal is oversampled once
|
||||
(`scipy.signal.resample_poly`) then an O(N) running max over windows
|
||||
- `SpectrogramMetric` — log-frequency STFT heatmap; adaptive hop caps time
|
||||
bins at ~4000, `N_FFT=4096`. Log/linear frequency is a view toggle
|
||||
- Drop in new ones (DR, spectral balance) by appending an instance to `METRICS`;
|
||||
@@ -96,7 +102,9 @@ A custom mastering toolkit that provides metrics to evaluate audio masterings th
|
||||
renderer, applied uniformly to every metric — not per-metric
|
||||
|
||||
#### `master_core.py`
|
||||
- Defines the `AudioFile` class: librosa loading, rolling RMS power, BPM detection
|
||||
- Defines the `AudioFile` class: librosa loading, rolling RMS power. BPM detection
|
||||
was **removed** — `librosa.beat.beat_track` cost ~3.7 s on every load for a
|
||||
number no better than tapping by hand
|
||||
- Loads at **native sample rate** (`librosa.load(..., sr=None)`) so the full
|
||||
band is preserved — analysis runs ~2× heavier on 44.1/48 kHz files than the
|
||||
old 22050 Hz default, by design
|
||||
@@ -108,11 +116,9 @@ A custom mastering toolkit that provides metrics to evaluate audio masterings th
|
||||
- **Adaptive colour mapping**: Automatically adjusts scale based on detected headroom
|
||||
- High dynamic range: 0-0.6 scale for loud masters
|
||||
- Conservative mastering: 0-0.3 scale for quiet masters
|
||||
- **Loudness metrics**: LUFS (short-term + integrated + LRA), PSR, Crest Factor
|
||||
- **Loudness metrics**: LUFS (ungated short-term + gated integrated + LRA), PSR, Crest Factor
|
||||
- **Peak analysis**: True Peak (4× oversampled dBTP)
|
||||
- **Spectral view**: log-frequency spectrogram heatmap over time
|
||||
- **Readable axes**: exact min/max of every axis is always labelled, even on log scale
|
||||
- **BPM detection**: Automatic tempo analysis
|
||||
- **Metadata display**: Artist and title from audio tags
|
||||
- **Real-time visualization**: Embedded matplotlib plots with font-aware rendering
|
||||
|
||||
@@ -203,8 +209,8 @@ A custom mastering toolkit that provides metrics to evaluate audio masterings th
|
||||
### Dependencies
|
||||
- librosa: Audio analysis and feature extraction
|
||||
- numpy: Numerical computations
|
||||
- scipy: Signal processing (true-peak polyphase oversampling, spectrogram
|
||||
log-frequency resample)
|
||||
- scipy: Signal processing (true-peak polyphase oversampling, K-weighting
|
||||
filters, spectrogram log-frequency resample, O(N) running-max via ndimage)
|
||||
- pyloudnorm: BS.1770 loudness (LUFS, LRA)
|
||||
- pyqtgraph: Interactive plotting (zoom/pan, overlay, lin/log)
|
||||
- matplotlib: Colormaps only (consumed by pyqtgraph) + librosa dependency
|
||||
|
||||
Reference in New Issue
Block a user