cratefox

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.

75.7% of 596 tracks
Key: Camelot-exactOf 596 tracks with independent expert key labels, the CNN's detected key matched exactly.
86.4% the DJ number
Key: safe to mixExact or a non-clashing neighbor; only 13.6% would clash in a harmonic mix, and you can override any key before export.
89.0% of 664 tracks
BPM: tempo accuracyThe on-device tempo CNN reads within the standard 4% tolerance on 664 GiantSteps tracks, up from 80.8% for the old DSP detector. Octave-forgiving it is 97.9%, and it runs on your machine.

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

ExactThe written Camelot key is the track's key. Mix by the wheel and it works.
Safe to mixExact, or off by a neighbor that still blends: the relative major or minor, or one step either way on the Camelot wheel. It is 100% minus clash-risk, and it is not the same as correct.
Clash riskA key that would clash if you trusted it blindly. This is the number we watch, and 13.6% is why the app lets you audition and override any key before export.
BPM, strictlyGiantSteps counts a half-time or double-time reading as fully wrong. A 174 drum-and-bass track heard at 87 counts as a miss even though your pitch fader math still works. We report the strict number anyway.

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

Progressive house88 key-labeled tracks
94.3% safe · 73.9% exact
Tech house80 tracks
75.0% safe · 70.0% exact
Deep house76 tracks
88.2% safe · 81.6% exact
Trance58 tracks
87.9% safe · 63.8% exact
Electro house51 tracks
92.2% safe · 88.2% exact
House46 tracks
87.0% safe · 71.7% exact
Drum and bass36 tracks
80.6% safe · 69.4% exact
Techno33 tracks
72.7% safe · 69.7% exact
Dubstep22 tracks
81.8% safe · 68.2% exact
Electronica20 tracks
85.0% safe · 80.0% exact
Minimal11 tracks
63.6% safe · 63.6% exact
Where exact slips but the mix improvesOn trance and house the CNN gives up some raw exact for fewer clashes. Trance exact went 75.9% to 63.8% while would-clash fell 13.8% to 12.1%; house went 73.9% to 71.7% while clash fell 21.7% to 13.0%. When the network misses in those two, it more often lands on a compatible neighbor that still mixes, so exact drops but fewer of its reads would clash. Safe to mix is the number that decides the blend, and it improved in both, to 87.9% on trance and 87.0% on house.

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.

GenreTracksKey exact (before → after)Would clash (before → after)
Progressive house8871.6% → 73.9%13.6% → 5.7%
Tech house8060.0% → 70.0%26.2% → 25.0%
Deep house7676.3% → 81.6%13.2% → 11.8%
Trance5875.9% → 63.8%13.8% → 12.1%
Electro house5182.4% → 88.2%9.8% → 7.8%
House4673.9% → 71.7%21.7% → 13.0%
Drum and bass3661.1% → 69.4%25.0% → 19.4%
Techno3351.5% → 69.7%36.4% → 27.3%
Dubstep2254.5% → 68.2%22.7% → 18.2%
Electronica2060.0% → 80.0%25.0% → 15.0%
Minimal1163.6% → 63.6%36.4% → 36.4%
All 596 tracks59669.5% → 75.7%18.5% → 13.6%

How the app flags a key it is unsure about

The CNN decides, essentia checks itThe key you see is the CNN's. Underneath, the older essentia detector and a chroma read run as a cross-check: when they agree the key shows plainly, and when they disagree the app marks it "worth a listen", so you know which keys to audition before a blend rides on them.
Whose number 78.4% isThose confidence figures belong to the essentia cross-check, not to the CNN's shown key. On the essentia read, the 82.2% of tracks it did not flag scored 78.4% exact and 11.8% would clash against the expert labels. We have not run a confidence split on the CNN itself, so we will not quote one.
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:

mkdir -p ~/cratefox-reference/giantsteps && cd ~/cratefox-reference/giantsteps git clone --depth 1 https://github.com/GiantSteps/giantsteps-key-dataset.git git clone --depth 1 https://github.com/GiantSteps/giantsteps-tempo-dataset.git bash tests/giantsteps/dl.sh # md5-verified audio from the JKU academic mirror python tests/giantsteps/build_csv.py # independent truth labels -> giantsteps_truth.csv python tests/bench_analyze.py --root audio --truth-csv giantsteps_truth.csv venv/bin/python tests/test_keycnn_parity.py # the shipped CNN reproduces its frozen L6e key score

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:

/Applications/Cratefox.app/Contents/MacOS/Cratefox --selfcheck # Apple Silicon -> SELFCHECK arch=arm64 engine=cnn expected=cnn ... PASS # Intel -> SELFCHECK arch=x86_64 engine=essentia expected=essentia ... PASS

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.

Get your invite →

Keep digging: MP3 320 vs FLAC vs WAV The install script, line by line Guides for DJs