fix(perc): drum pan by QWERTY physical key position, not kit geometry
The old drumPanFor() mixed grid-offset bias (-0.32 / +0.32) with
kit-geometry drum offsets (kick center, ride right, crash left, etc).
That worked on paper but mismatched the physical gesture — your hand
is at a specific keyboard column, but the pan was being computed from
the drum type assigned to that key.
New model: KEY_QWERTY_PAN maps each drum key to pan -0.9..+0.9 based
on its column index on a US QWERTY keyboard. Left-side keys (q/a)
pan hard left, right-side keys (p/;) pan hard right, center keys
(t/g/b) stay near center. Computed as (col - 4.5) / 4.5 * 0.9 across
the three rows:
Row 0 (qwerty): q=-0.9 w=-0.7 e=-0.5 r=-0.3 t=-0.1 y=+0.1 u=+0.3 i=+0.5 o=+0.7 p=+0.9
Row 1 (asdf): a=-0.9 s=-0.7 d=-0.5 f=-0.3 g=-0.1 h=+0.1 j=+0.3 k=+0.5 l=+0.7
Row 2 (zxcv): c=-0.5 v=-0.3 b=-0.1 n=+0.1 m=+0.3
drumPanFor(letter, gridOffset, key) now checks KEY_QWERTY_PAN[key]
first and falls back to grid-side bias if no key provided (reverse
playback replay path). All 3 live trigger sites updated to pass the
key: keyboard act() drum branch, touch-tap drum pad, drag-rollover.
Result: your fingers and the stereo field line up directly — no
mental translation needed between "which drum is this" and "where
does it pan".