METRONOME  ·  DESIGN LAB  ·  v2  ·  2026-08-26

RUDIMENT LAB

Five panels, one language. BROWSE the library · BUILD a custom pattern by hand (or from a photo, honestly assisted) · PLAY it at tempo · TEACH it out loud.
④ TEACH is the headline and it is audible. Strike the coal below, put headphones on, and the rudiment plays: accent / tap / ghost as three real dynamics, right hand in your right ear a minor third above the left, flams landing early the way flams do.
Every frame is 390 pt wide at 1:1 on a desktop, so every size here is the size to type into SwiftUI. On a phone the frames reflow to the page — proportions survive, the 1:1 claim does not.
1.1+ arc only. Nothing here touches the frozen 1.0 scope. Reconstructed sticking now carries a RECON badge on the row itself — verify against the PAS chart before it ships.
AUDIO IS COLD
iOS Safari will not open an audio context outside a real tap, and a suspended context schedules nothing, silently. So this page never assumes autoplay — it asks for one deliberate strike, which is the same light is alive moment the transport already owns. Once lit, ④ TEACH and ③ PLAYING both run on one lookahead scheduler: one engine, one owner, exactly as a single AVAudioEngine will behave.
HEADPHONES — PAN ONLY EXISTS THERE. ON A STAND THE PITCH GAP CARRIES THE HAND.

THE STROKE VOCABULARY

①BROWSE PAS families + the 27 existing accent grids, one row component
Rows are one component. A true rudiment shows strokes on both sides of the rail; an accent grid from AccentPattern.swift has no hand, so it renders exactly as the app draws it today — all above the rail, dashes for sticking. That is the coexistence: an accent grid is a rudiment with nil hands. Select a grid and ADD STICKING seeds the builder with its accents — 27 patterns become 27 starting points.
②BUILDER R3 Tier 1 — the committed feature. Touch-first, 44 pt targets
NAME
INVERTED DIDDLE
SLOTS
8
GRID / BEAT
4
LEAD
R
SLOT 1TAP A SLOT TO SELECT
VELOCITY
HAND
ORNAMENT
Gestures (mock shows the tap path). Tap a slot to select · swipe a slot up/down to cycle velocity · double-tap to flip its hand · drag across slots to paint one velocity. The inspector is the discoverable path; the gestures are the fast one.
Four velocities, not two. ACCENT / TAP / GHOST / REST. Ghost is what moving-accent drills need (R2 §3); REST closes the note already sitting in AccentPattern.swift:154-155 — "bare clave (silent non-hits) waits for a .silent velocity in v2". One enum change, two open wants closed.
②bPHOTO ASSIST R3 Tier 2 — assisted, never automatic. Sub-flow of ②
THIS IS A DRAFT, NOT A TRANSCRIPTION
Your phone reads the page and proposes strokes. Every proposal starts unconfirmed. Nothing saves until you have confirmed all of them. If it guesses badly, correct it in the builder — you are never worse off than typing it in.
ON DEVICE RLRR LRLL RLRR CAPTURED · PERSPECTIVE CORRECTED · VNDocumentCamera
STICKING R/LSTRONG
STROKE POSITIONSFAIR
ACCENTS >CHECK
FLAM / DRAGCHECK
Why the meters differ. R and L are single printed characters — that is text OCR, which Apple's Vision framework is genuinely good at. Accent wedges and grace notes are shape heuristics on a photographed page: no reviewed OMR tool, open-source or commercial, demonstrates strong accuracy on scanned and annotated percussion pages (R3, §"state of OMR"). So the app says so, on the screen.
0/ 8 CONFIRMED TAP EACH ? TO CONFIRM
Privacy posture unchanged. VisionKit capture + Vision recognition run entirely on-device. No networking, no new API-access reason — the app's "Data Not Collected" label survives intact (R3, verified against PrivacyInfo.xcprivacy). Cloud OMR would break that for accuracy nobody has demonstrated.
The gate is the design. SAVE stays disabled at 7/8. A drummer who must re-check every bar of an "automatic" transcription has gained nothing over typing it; a drummer confirming an already-mostly-right grid has gained real time. That reframe is R3's core finding, rendered as a disabled button.
③PLAYING Live at tempo. Discrete cell lighting, bounded pulse
96BPM
0
REPS
SINGLE PARADIDDLEPAS 16
LEADR SLOT— GESTURERLRR·LRLL
HEAT LADDER · OPEN → CLOSED → OPENGLOW
Read the shape, not the letters, from across the room. At 2 m the R/L glyphs are below acuity on any phone (R1 §5.1). The rail silhouette — up for right, down for left — is a gross position code that survives. STAND VIEW strips the chrome and takes the letters to 64 pt for the 1 m glance.
No sliding playhead. AccentTickLane.swift's own comment forbids it: per-tick publishes hop off the audio timer and jitter. The current slot lights, the two behind it decay, nothing interpolates — which is also the correct Reduce Motion behaviour for free. The beat ring is the only wide element that moves, and it switches from brightness to scale above 180 BPM (R1 §5.4, WCAG 2.3.1).
v2: the chained setTimeout that drove this in v1 is gone. Every note here is now scheduled sample-accurately against ctx.currentTime and the lane is painted when the audio clock reaches it — so the light and the hit are the same event, not two things that agree most of the time.
④TEACH The audible feature. WATCH → LISTEN → ECHO → ALONG (R5)
SINGLE PARADIDDLEPAS 16
TEMPO
76
GRACE ms
28
PAN ±
0.7
Kill PAN and the rudiment still tells you which hand — that is the test, and it is the whole reason the pitch offset exists. Kill PITCH R/L as well and the hand information is gone on a stand, which is exactly the failure R5 §5.2 and R6 §A1 predict for a pan-only design. Both toggles are here so the claim can be disproved by ear rather than believed.
GRACE steps the flam/drag offset. 28 ms is a guess carried from D4 §4 — this stepper is how it stops being one. It is clamped live to 0.35 × tick and floored at 9 ms; the pill above turns red and says so when the clamp is doing the work rather than the setting.
The ladder is not four modes — it is one performance with the responsibility moving. WATCH gives you everything. LISTEN takes the picture away and leaves the sound (Kodály's inner hearing; the same trick Gap Click already plays on pulse, aimed at pattern instead). ECHO hands you the stick. ALONG lets go. Both middle stages are engine primitives MEtronome already ships — tradeFours and Tempo Trainer — which is why this feature is a re-aiming, not a build.