An instrument for the tuning of drums: point a microphone at the drum, strike it, and the app reads each stroke’s pitch — the head’s fundamental at the center, the lug’s voice at the edge — walks you around the head in star order, and learns the overtone signature of the particular drum in front of it. A second movement is a practice trainer that scores your sticking against the book that every drummer owns and few finish.
A drum is not a harmonic instrument. Where a string’s overtones stack at neat integer multiples, a struck membrane’s modes fall at awkward ratios — 1.00, 1.59, 2.14, 2.30 — which is why pitch trackers built for voice and guitar refuse to hear a tom correctly. The founding spec made this a first principle and declared no machine-learning pitch engine: the commercial hardware tuners this app set out to match are classical signal processing under the hood, and the neural pitch trackers are trained on exactly the harmonic audio a drum is not.
The genuine difficulty is resolution. Clearing a drumhead — bringing every tension lug to the same pitch — means hearing differences of about one hertz in the 150–300 Hz range, against a raw FFT whose bins are roughly ten hertz wide. Sub-hertz refinement is the whole game.
The engine landed in one long evening session: a Blackman–Harris window over a plain FFT with four-times zero-padding; peak-picking by true topographic prominence; log-domain parabolic interpolation; then a two-frame phase-vocoder refinement that pulls each estimate to within a tenth of a hertz. Onsets are detected by spectral flux, and capture runs in an AudioWorklet feeding a ring buffer off the render thread. Every stage was built test-first against synthetic drums — deterministic modal-strike fixtures whose frequencies, amplitudes, and decay rates were later reset from measurements of real recordings.
The first live sessions were humbling. Six real strikes produced twenty-one to twenty-four pitch readings, the display wandering 364 → 654 → 196 Hz after every hit, while three strikes in twelve got no reading at all — a sub-audible blip of room tone, two to five milliseconds before the true attack, was quietly consuming the onset debounce. The fixes were measured rather than guessed: numbered energy gates over a tracked noise floor, and a rise gate demanding each hit be 1.2× louder than anything in the previous 0.45 seconds — sized to out-wait the slow swells that beating membrane modes produce. The pipeline was then replayed frame-by-frame against 24-bit recordings of the author’s own drum until it produced exactly one reading per hit.
One bug was actively harmful. The session target is the head’s fundamental, but lugs are tapped at the edge, where a different membrane mode rings roughly 1.7× higher — so the app told its user that every properly tuned lug was sixty to eighty hertz sharp, and obeying it would have detuned the drum far below the intended pitch. Ideal-membrane theory puts that ratio at 1.59; the author’s floor tom measured 212.9 / 124.8 = 1.71. The remedy was to stop trusting theory: a guided interval step (after Toulson’s Drum Sound and Drum Tuning) now measures each drum’s actual ratio and re-anchors the lug target to the particular head being tuned.
Even choosing which pitch to report required opposite rules for the two kinds of strike. At the center the fundamental radiates efficiently and dies within a tenth of a second while the lug mode keeps singing — so the largest cluster of frame estimates is usually the wrong one, and the center strike must elect the lowest well-supported cluster. At the edge it is the reverse: the lug tone is whatever is still alive latest in the window, after the flash of the stick itself has gone.
The kick drum earned its own chapter. Recordings showed it reading 170 cents flat: a kick’s lowest modes sat at 70 and 79 Hz, too close for a fixed 60-millisecond analysis frame to separate, so they merged into a phantom peak near 71.5. A second kick mystery — readings flipping between 78 and 133 Hz on an identically tuned drum — was settled by a spectrum figure that still lives in the repository, annotated in Spanish: el salto 78/133 es el detector, no el tambor — the jump is the detector, not the drum. The frame now lengthens itself to suit the search band, the fundamental search anchors to the session target, and a spectrum inspector lets the curious see the last strike’s spectrum and drag the search bands by hand.
Reliability came the hard way. Three separate “stuck level bar” freezes proved undiagnosable from the interface, and when the culprit was finally caught with a stack trace it turned out to be three coupled teardown races: the worklet kept delivering queued audio after stop() had nulled the context; stop() itself was not idempotent; and one wedged close() call held every subsequent start hostage. The repairs — take-and-null teardown, a generation counter so superseded starts clean up after themselves, and a staleness guard that reads a dead stream as silence — are each pinned by tests, including one in which close() simply never returns. A separate post-mortem found the tuner reporting the previous hit’s pitch 719 milliseconds late, because the analysis window ended at the attack and so contained mostly the old ring; deferring analysis a quarter-second past onset made latency a deterministic ~260 milliseconds.
The second movement is a practice room: Stick Control exercises rendered as a perspective highway in the manner of a rhythm game, judged against an audio-clock transport that is the sole authority on time — a stroke is perfect within ±25 milliseconds. Exercises are written as integer ticks at 6720 pulses per quarter note, a resolution chosen so that every subdivision the book demands — duplets through octuplets, tens, twelves, fifteens — lands on a whole tick; a dynamic-programming aligner matches strokes to targets so that one dropped hit cannot cascade into a run of false judgments.
The module carries a strict honesty ethos, written into the project’s standing instructions as an invariant. A single microphone cannot know which hand struck, so the lanes display written hands only — no visual may claim a detected one. Latency calibration is an acoustic loopback: twelve clicks at pseudo-random gaps so room echoes cannot alias, quadrature correlation, median of the inliers — and when a Bluetooth-grade route falls outside the measurable window, the calibrator returns nothing at all, on the principle that an edge-clamped answer is unmeasurable, not data. There is even a dedicated stop-for-tension button, and pressing it is scored as correct practice.
The whole account spans twenty calendar days — June 22 to July 12, 2026 — of which eleven saw commits: 214 of them, across 35 pull requests, roughly half co-authored with Claude. The workflow was planning-first throughout: four dated specifications and fifteen implementation plans, each mandating test-driven development, with the interface arriving as vendored design handoffs that each explored three visual directions before one was chosen. The test suite stood at 460 by the final branch. Late features were built by parallel agents working separate branches of the same tree, their plans carrying explicit coordination clauses; the practice module itself landed as a single commit hardened beforehand by an adversarial review of the spec that produced forty-three verified findings.
The method that mattered most: record real hits, measure every mode’s frequency and decay, rebuild the drum as a deterministic synthetic fixture, fix the algorithm, and pin the fix as a regression test with the raw measurements kept in the comments. The discipline cut both ways — when the practice onset detector was first graded against hand-labeled recordings it scored an alarming F1 of 0.59, and the investigation found the fault in the grader: the labeling pipeline had counted forty-four samples as one millisecond. The true baseline was 0.876; honest tuning then carried it to 0.987. Even the machine grading the detector had to be debugged first.
The lug ratio of one floor tom is presently a constant in the code; more heads deserve measuring, and the kick’s special handling wants generalizing to every low drum. The practice library ships original exercises in Stick Control’s manner while a private 867-exercise transcription waits, reference-only, out of respect for rights it does not hold. And the instrument has so far met one room and one player’s drums — it should meet many. It may be played at drumtuner-production.up.railway.app.