How accurate is it, really?
Most tools quote accuracy measured on their own libraries. We used to as well: our old number was 69%, graded partly against tags the detector itself had written. That is circular, so we retired it. These numbers come from GiantSteps, the public academic dataset of real Beatport tracks with independent key, tempo, and genre labels. 1225 tracks, no cherry-picking, weak spots included.
In short: an on-device neural network reads key and tempo, graded on independent GiantSteps expert labels, and it beats the old essentia detector on all 596 tracks. The full history, the platform notes, and every caveat are here in one place, opened when you want them.
The full methodology, limits included
Key: a convolutional neural network now decides the key, with essentia and a chroma read running underneath as a cross-check. Graded on the GiantSteps+ expert re-annotation (596 tracks, one answer key for every detector), the progression is essentia 69.5% exact / 18.5% would-clash, then the first CNN 72.8% / 14.8%, then the model shipping today at 75.7% exact / 13.6% would-clash. The gain came from training data, not a bigger model: the current CNN also learns from full-length DJ library tracks, which is the domain customers actually have. The old 64.9% gauge was graded against the original GiantSteps labels, a different and older answer key the expert re-annotation was made to correct, so it is not comparable to this and we retired it. The shipped model (models/key_cnn.onnx) is held to this frozen score by a ship-blocking parity test (tests/test_keycnn_parity.py). One platform note: these are the CNN's numbers, and on Mac the CNN runs on Apple Silicon. An Intel Mac uses the essentia engine underneath instead, the 69.5% exact shown as the starting point above, because the key model has no Intel build; nothing else about the app differs. BPM: a convolutional neural network now reads the tempo from the audio, the same on-device approach as the key. Graded on the GiantSteps tempo benchmark (664 tracks, Schreiber and Muller's canonical labels), it reads the tempo correctly on 89.0% of tracks at the standard 4% tolerance (the MIREX Acc1 metric), up from 80.8% for the previous DSP detector on the identical set and metric. Both numbers sit on the same ruler, so the gain is the engine, not a looser tolerance. Octave-forgiving (Acc2, counting a half or double reading as right) it is 97.9%, up from 86.2%. These are measured through the shipped path, the app's own decode into a pure-numpy mel into the ONNX model, so the page reports what the app actually does, and the model (models/tempo_cnn.onnx) is held to the score by a ship-blocking parity test (tests/test_tempocnn_parity.py). Two honest limits: the benchmark is 2-minute previews, its own domain, so full-length tempo accuracy is unproven and we do not claim it; and detection runs on your machine, nothing is uploaded. GiantSteps still counts a half-time or double-time reading as fully wrong at this tolerance, a 174 track heard at 87 is a miss even though your pitch-fader math still works, and we report the strict number anyway. One caveat on the truth itself: GiantSteps' tempo labels come in two academic rounds, the 2015 set we grade against and a 2018 crowdsourced re-annotation, and the two disagree on about a third of tracks (68.1% agree within 1 BPM, 9.1% differ by an octave or level, 22.8% by more), so the 664-track ground truth is not fully settled and we grade against the 2015 canonical labels. Same harness, reproducible from the repo.
What those words mean at the decks
By genre, including where we are weak
Publishing the buckets where the read is weakest is the point, not a hedge. A number you only saw when it flattered us would not be a measurement. Every genre is here, strong and weak, with its sample size so you can judge for yourself.
See the full per-genre breakdown, weak genres included (Techno and Minimal)
The core dance genres, largest sample first (the full frozen run covers more). Each bar leads with safe to mix, the number that governs a blend; exact sits beneath it.safe to mixexact
Small buckets are noisy; n is shown so you can judge. Techno improved the most, from 51.5% to 69.7% exact, and its would-clash fell from 36.4% to 27.3%, still the highest clash rate among the well-sampled genres, so audition it before you trust the tag. Minimal is the smallest bucket at n=11: an earlier CNN had dipped it to 45.5% exact, and the shipped model is back to essentia's 63.6%, so on minimal the network matches the old detector rather than beating it. Its clash stays at 36.4%, and because exact and clash add to 100 there is no safe-neighbor cushion: on minimal every miss is a clash. At n=11 one track moves the rate about nine points, too small a sample to rank, so techno's 27.3% at n=33 is the clash figure to trust. If you play either, audition the keys before you trust the blend.
The full before and after, essentia to the model shipping today, as a plain table
Before is the old essentia key detector, after is the model shipping today (ladder level L6e), both scored on the same 596 GiantSteps+ expert-labeled tracks. The intermediate first CNN, which the progression note above puts at 72.8% overall, sat between these two; this table skips it to show the full move from essentia to the shipped model. The eleven rows are the core dance genres, largest sample first; the final line is all 596.
| Genre | Tracks | Key exact (before → after) | Would clash (before → after) |
|---|---|---|---|
| Progressive house | 88 | 71.6% → 73.9% | 13.6% → 5.7% |
| Tech house | 80 | 60.0% → 70.0% | 26.2% → 25.0% |
| Deep house | 76 | 76.3% → 81.6% | 13.2% → 11.8% |
| Trance | 58 | 75.9% → 63.8% | 13.8% → 12.1% |
| Electro house | 51 | 82.4% → 88.2% | 9.8% → 7.8% |
| House | 46 | 73.9% → 71.7% | 21.7% → 13.0% |
| Drum and bass | 36 | 61.1% → 69.4% | 25.0% → 19.4% |
| Techno | 33 | 51.5% → 69.7% | 36.4% → 27.3% |
| Dubstep | 22 | 54.5% → 68.2% | 22.7% → 18.2% |
| Electronica | 20 | 60.0% → 80.0% | 25.0% → 15.0% |
| Minimal | 11 | 63.6% → 63.6% | 36.4% → 36.4% |
| All 596 tracks | 596 | 69.5% → 75.7% | 18.5% → 13.6% |
How the app flags a key it is unsure about
Provenance of the cross-check figures
Essentia cross-check run measured 2026-07-15, frozen in the repo (tests/giantsteps/RESULTS_2026-07-15_gsplus.txt); high confidence means an internal essentia score of 0.7 or above. Truth is the GiantSteps+ expert re-annotation, scored on 596 tracks (8 of the 604-track key set have no mappable expert key). These 78.4% / 82.2% / 11.8% figures describe the essentia cross-check, not the key the CNN shows; for the shown key the numbers to hold are the CNN's own, 75.7% exact and 13.6% would clash in the gauges above.
Reproduce it yourself
The audio is not ours to redistribute, but the dataset is public and the whole pipeline is in the repo. Any Cratefox install can re-run the ruler:
Same data, same pipeline. The key gauge is the CNN graded on the GiantSteps+ expert re-annotation (Faraldo, Zenodo 4153506); the shipped model reproduces that frozen score under the parity test above. If yours differ, write hey@cratefox.app and we will publish the correction.
Rather browse than run it? The method and the per-genre results also live in a public benchmark repo you can read without installing anything: the GiantSteps key benchmark on GitHub →
On a Mac you can also confirm which key engine your own copy runs, in one command, no dataset needed:
The Mac build ships this check, and it will not release unless the signed app passes it, so an Apple Silicon build that quietly fell back to essentia never gets out. It is the platform note above made checkable: the CNN on Apple Silicon, essentia on Intel.
The demo is simulated. These numbers are not.
The animated crate on the homepage is an illustration with fictional tracks (so no real record gets mis-keyed in marketing). This page is the opposite: real tracks, independent labels, misses counted. That split is deliberate.