slab/menuband: kick / snare / closed-hat sample pads on the menubar
Three Akai-MPC-style drum pads on the *left* of the piano in the menu
bar status item:
- DrumPad enum: kick (GM 36), snare (GM 38), closed hi-hat (GM 42),
each with a calibrated accent color (warm orange / pink / gold).
- drawDrumPad: rounded-square, vertical gradient (top brighter → bottom
darker), 1 px white sheen at the top edge for the "lit-from-above"
feel, hairline border, single-letter monospaced glyph (K / S / H)
centered. Lit + hover states shift the gradient and brighten the
glyph.
- Layout: pads sized to match white-key width (23 × 21), sit between
the left padding and the piano with a 5 px gap. imageSize +
pianoOriginX + settingsHitRect all derive from the new layout.
drumsAreaWidth collapses to 0 in compact display mode so the
adaptive-sizing fallback still works.
- HitResult gains a `.drum(UInt8)` case. hit() checks drum cells before
falling through to piano + settings.
- AppDelegate.statusClicked: when the initial hit is a drum, fire
startTapNote at velocity 110, sleep 100 ms, stopTapNote. One-shot,
no drag tracking — drums don't glide like piano keys.
- The controller's existing isDrum routing (note < firstMidi → channel
9 → drum sampler) handles the rest, so no audio changes needed.
Site:
- Bump download cache-buster query string to ?v=1fbccdf.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>