Cartonic
Absolute-pitch identification trainer: it plays a note, you name it, and your misses accumulate into a map of how you hear.
Problem
- An accuracy percentage tells you how often you miss, not how you miss.
- The misses carry the information: which notes you confuse, in which direction, how fast, and whether that changes over time.
Approach
- A Tone.js synth plays a pitch; you tap the note you think it was. Nothing you do is ever recorded through a microphone.
- The twelve pitch classes sit on a logarithmic spiral; each node's halo scales with your accuracy on that note, and a thread is drawn between any pair you confuse often enough.
- A 12×12 confusion matrix is the base.
- Tips are generated from those detectors once you have 15 trials, and they typically quote the specific note and figure that triggered them.
Outcome
- Everything is a single triangle-wave synth, so the ear you are training is an ear for one timbre.
- The app never hears you, so it says nothing about whether you can produce a pitch, only whether you can name one.
- The citations are the framing behind the detectors, not evidence that the app works.
Try it — this is the real thing
Open full ↗Cartonic is an absolute-pitch trainer, live at cartonic.vercel.app, and the sound only goes one way. A Tone.js synth plays a pitch; you tap the note you think it was. Nothing you do is ever recorded through a microphone.
A session is that trial repeated ten, twenty, fifty times, or until you stop. You pick naturals or all twelve notes, an octave range, and whether an A4 reference sounds first, plus scale and interval modes. The picker is weighted toward notes you’ve seen less and refuses immediate repeats, and a script audits its distribution over a thousand draws. Each guess logs note, guess, signed semitone error and response time to IndexedDB. An Oops button voids a slip of the finger without deleting the row.
The home screen is the tonic map, the chroma spiral the visual on this page reproduces. The twelve pitch classes sit on a logarithmic spiral; each node’s halo scales with your accuracy on that note, and a thread is drawn between any pair you confuse often enough. Tap a node to hear it. “Hear your cartonic” plays the map back as an arpeggio with velocity set by accuracy, so weak notes whisper. Other lenses reuse the spiral for response time, for perceptual gravity (which notes pull your guesses), and for a Journey scrubber that replays how the map formed.
An accuracy percentage tells you how often you miss, not how you miss. The misses carry the information: which notes you confuse, in which direction, how fast, and whether that changes over time. A 12×12 confusion matrix is the base. From it the engine reads sharp-versus-flat bias, one-way confusions and perceptual magnets (notes you over-guess when unsure, after Kuhl), whether errors drift toward the tonic and dominant, how closely they track Krumhansl’s tonal hierarchy, whether a note’s confusions follow its overtone series (Terhardt’s virtual pitch), speed-versus-accuracy quadrants split at data-driven medians, and per-note trajectories: improving, plateaued, regressing, mastered. Tips are generated from those detectors once you have 15 trials, and they typically quote the specific note and figure that triggered them.
The limits are worth saying plainly. Everything is a single triangle-wave synth, so the ear you are training is an ear for one timbre. The app never hears you, so it says nothing about whether you can produce a pitch, only whether you can name one. Data stays in your browser unless you sign in to sync. The citations are the framing behind the detectors, not evidence that the app works. The repo holds no study and no test suite, and a trial-level Data Explorer panel is written but not yet mounted. I’d rather say so here than let the spiral imply more than the data does.