Most BPM detection errors are octave errors
Every track you split on StemX comes back with a BPM, and our free BPM finder gives one for any file. We measured how often it is right on 998 tracks it had never seen, and the more useful finding was not the headline number but the shape of the mistakes.
The headline, with its interval
Tempo detection is Beat This!, a pre-trained beat tracker from CPJKU. Scored on GTZAN by the MIREX convention, it lands within 4% of the annotated tempo on 81.9% of tracks (95% CI 79.4–84.1%). The hand-rolled librosa tracker it replaced scored 54.4% — measured on GiantSteps rather than GTZAN, for the reason below, so read the gap as a direction rather than an exact delta.
We set ourselves an 80% bar. The point estimate clears it; the lower end of the interval does not. Both facts travel together, and we would rather you read the interval than a rounded-up claim.
Why GTZAN, and not the obvious benchmark
GiantSteps is the benchmark we use for key detection and the one our old tempo detector was scored on — and the model we ship was trained on it. Scoring a model on its own training data measures memory, not accuracy. GTZAN is the dataset every released Beat This! checkpoint holds out, including the exact one in our production image, so this is a direct held-out measurement of what actually runs. No substitute checkpoint, no asterisk.
Most misses are the right pulse at the wrong level
| Outcome | Tracks | Share |
|---|---|---|
| Correct (within 4%) | 817 | 82% |
| Half the true tempo | 53 | 5% |
| Double the true tempo | 50 | 5% |
| Triple the true tempo | 11 | 1% |
| Genuinely wrong | 67 | 7% |
Of the 181 tracks it missed, 114 came back at half, double or triple the true tempo. Only 67 were genuinely wrong. Forgive octave errors and accuracy rises to 93.3%.
That distinction matters in practice. A 174 BPM drum-and-bass track reported as 87 still sits next to its real neighbours in a sorted library, and anyone who has heard it can fix it in a second. A track reported at an unrelated tempo cannot be recovered from context at all. Lumping both into one 18.1% error rate hides which failure you are actually getting.
The old detector failed differently: its most common error was two-thirds of the true tempo, a triplet confusion that standard scoring does not forgive. It usually found a real pulse and then reported the wrong one.
A confidence score that finally means something
We also return bpm_confidence. With the old tracker it was decorative: 0.966 on right answers, 0.934 on wrong ones — too close to separate anything. It measured how even the pulse was, not whether it was the right pulse.
With Beat This!, right answers average 0.9575 and wrong ones 0.8379, a gap about four times larger. That makes it usable as a filter, trading a little coverage for precision:
| Filter at | Tracks kept | Right when kept |
|---|---|---|
| 0.50 | 99.1% | 82.4% |
| 0.70 | 94.2% | 85.1% |
| 0.80 | 90.6% | 86.4% |
| 0.90 | 85.1% | 88.6% |
Limits
GTZAN spans ten genres in 30-second clips; it is a well-worn dataset with known quirks, and one dataset is not agreement across several. Treat the BPM as a strong hint for sorting and filtering, not a value to drive an automated beat-match.
Try the vocal remover
Upload a song and hear a free 60-second preview of all six stems. No account needed.
Remove vocals free