feat(percussion): drums pan by kit geometry + grid bias (not tone pitch)
Tone pan is derived from pitch (`(semitones - 12) / 15`), so C4 pans
hard left and B4 pans center. For drums this inherited the same
calculation, meaning the kick (C) always hard-panned left and the ride
(B) always near center — which is wrong for a drum kit. Drums should
pan by physical kit layout, not by the note name assigned to their pad.
New `drumPanFor(letter, gridOffset)` helper combines two factors:
1. Grid bias — left grid → -0.32, right grid → +0.32. So the two
octave grids occupy distinct stereo spaces when both have drums on.
2. Drum-type offset (DRUM_PAN_OFFSET) — kit-geometry per-drum:
kick 0.00 center
snare -0.05 barely off center
clap +0.10 slightly right
snap -0.10 slightly left
hat-c +0.25 drummer's right (closed hat)
hat-o +0.32 drummer's right (open hat)
ride +0.45 far right
crash -0.45 drummer's left
splash -0.55 far left
cowbell +0.22 right accent
block -0.18 left accent
tambo +0.30 right accent
Final pan = clamp(gridBias + drumOffset * 0.7, ±0.9). Grid side
dominates so the two grids stay distinguishable, drum offset modulates
for kit-color variety.
Wired through all 3 drum trigger sites:
- keyboard act() drum path (notepat.mjs:~1412)
- touch-tap drum pad (notepat.mjs:~1800)
- drag-rollover drum pad (notepat.mjs:~1952)
Each now computes its own `drumPan` / `touchDrumPan` / `rollDrumPan`
instead of using the melodic pan. The two-step DOWN/UP jitter inside
playPercussion still adds its own ±0.05 stereo movement on top.