🎹 PIANO ROLL · SCALE + CHORD DETECTOR
Tap notes. See the chord and every scale that fits.
Click any keys to "press" them. Press 3-7 notes and the chord name pops up (Cmaj7, Dm9, F sus4, …). The list below ranks every scale that contains your notes by fit percentage. Browser-only, no signup.
Saved:
Look up:
Try
C · Am · G7 · F#m7b5
Diatonic in:
Scales:
No notes pressed yet — try tapping a few keys.
Matching scales
Press at least 2 notes
The detector ranks scales by how many of your notes they contain.
How it works. Each scale is a set of 12-tone
pitch classes (C=0, C#=1, …). The detector treats your pressed
notes as a set, and for every (root × scale-formula) combination
it asks: what fraction of your notes does this scale contain?
Scales that contain all your notes (a "perfect"
fit) bubble to the top. Tie-breakers: smaller scale wins (so
pentatonic beats major when both fit), then alphabetical.
Chord detection kicks in at 3-7 notes. For each candidate root we rotate your pressed pitch classes so the root lands at 0 and compare against 21 chord shapes (triads, 7ths, sus, 6ths, add9, 9ths) by Jaccard similarity. The best fit wins; ties go to simpler chords. So C-E-G prints C major, C-E-G-B♭ prints C7, C-E♭-G-B♭-D prints Cm9.
Progressions auto-play through the same Web Audio look-ahead scheduler the metronome uses — a 25 ms tick checks whether the next chord falls in a 100 ms scheduling window and, if so, queues all the chord's oscillators on the audio thread at a precise
Key matcher handles the reverse — find beats in a given key.
Chord detection kicks in at 3-7 notes. For each candidate root we rotate your pressed pitch classes so the root lands at 0 and compare against 21 chord shapes (triads, 7ths, sus, 6ths, add9, 9ths) by Jaccard similarity. The best fit wins; ties go to simpler chords. So C-E-G prints C major, C-E-G-B♭ prints C7, C-E♭-G-B♭-D prints Cm9.
Progressions auto-play through the same Web Audio look-ahead scheduler the metronome uses — a 25 ms tick checks whether the next chord falls in a 100 ms scheduling window and, if so, queues all the chord's oscillators on the audio thread at a precise
audioCtx.currentTime.
The audio thread does the timing; JS just stays ahead. Result:
rock-solid chord cycle at 60-180 BPM that doesn't drift even
when the tab is busy.
Key matcher handles the reverse — find beats in a given key.