A computer tried to guess the musical key of each song by looking at all the instrument tracks at once. But it used a lazy method that gets fooled: it kept guessing the song's cousin key instead of the real one. So 22 songs got the wrong key stamped on them, and every music file we built from those got the wrong "home note."
The fix: listen to the singing track to find the true home note, or just look up the real key that music books already printed. Then rebuild those 22 songs' files with the right key. The other songs are fine.
Why the keys on stems-key-validation are so far off, and exactly which songs need a redo. Built 2026-07-05.
The keys came from Krumhansl-Schmuckler correlation run on the stems (a static pitch-class histogram), written raw into ~/Projects/_outputs/_evidence/<artist>/<song>/*_theory.json. On flat-side / modal rock that detector biases toward the relative major/minor or the subdominant (IV) instead of the true tonic, and it does so with high self-correlation, so a confident number is not a trust signal.
The gate that fixes this already exists — _shared/key_confidence.py — and its own docstring records the exact miss: "music21/chroma key detection on stems is only ~28% exact vs web ground truth, 39% incl. relative." That matches this page's numbers exactly. The problem: the gate was never called at transcription time. The theory.json files carry a bare key with no override, no alternates, no caveat.
Important scope note: the per-stem note transcription (crepe / basic-pitch) is pitch-tracked and does not depend on the key, so the raw MIDI notes are not wrong. What's wrong is the key label and everything derived from it — chord-degree analysis, in-key filtering, archetype-book scale highlighting, and the midi-16-runs-* generators that key off these files. Those are what get redone.
vocals stem's resolved melody + a cadence check, not the summed pitch-class histogram of every stem (bass + pads are what drag it to IV / relative)./song-key-sourcing for anything with a web consensus, and pass it as gate_key(key, corr, overridden=True).gate_key() before it's written, so flat-side catalogs (Radiohead, Mars Volta, Life and Times, APC) auto-get the relative/subdominant caveat + alternates.midi-16-runs-* output built in the wrong key.| Song | Wrong key (detected) | True key (web) | Error |
|---|---|---|---|
| Coat Of Arms | F major | G minor | mismatch |
| Confetti | e minor | C major | mismatch |
| Dull Knives | d minor | Bb minor | mismatch |
| Old Souls | f# minor | D major | mismatch |
| Running Redlights | e minor | C major | mismatch |
| Shift Your Gaze | c minor | Ab major | mismatch |
| Song | Wrong key (detected) | True key (web) | Error |
|---|---|---|---|
| Inertiatic ESP | b minor | F# minor | off by a fifth |
| Son Et Lumiere | d minor | B minor | mismatch |
| Song | Wrong key (detected) | True key (web) | Error |
|---|---|---|---|
| Bodysnatchers | F major | D major | mismatch |
| Faust Arp | f# minor | B minor | off by a fifth |
| House Of Cards | a minor | F major | mismatch |
| Burn The Witch | f# minor | B major | off by a fifth |
| Decks Dark | D major | D minor | parallel |
| Desert Island Disk | C major | G major | off by a fifth |
| Ful Stop | f# minor | C major | mismatch |
| Identikit | F# major | B minor | off by a fifth |
| Present Tense | g# minor | C# minor | off by a fifth |
| The Numbers | C major | F major | off by a fifth |
| Tinker Tailor | c# minor | Db major | parallel |
| Song | Wrong key (detected) | True key (web) | Error |
|---|---|---|---|
| Disarm | D major | E minor | mismatch |
| Rocket | G major | C major | off by a fifth |
| Today | g minor | Eb major | mismatch |
Sources: stems-key-validation · stems-to-midi-coverage · gate: _shared/key_confidence.py. Part of drwu-htmls.vercel.app.