Hand tracking at 30fps was writing 126 params per frame to the C15 ring buffer (capacity 512), flooding it and starving arpeggiator noteOn/noteOff messages — causing stuck/dropped notes. Three-part fix: - Arpeggiator now runs in a dedicated Web Worker with direct SharedArrayBuffer access, bypassing the main thread entirely for note timing. Worker setInterval isn't subject to main thread jank. - RingBufferWriter uses CAS (Atomics.compareExchange) for multi-producer safety — both main thread (params) and worker (notes) write safely. - routeOutputs throttles synth parameter sends: dead-zone filter (0.2% change threshold) + rate cap (~20fps), reducing ring buffer pressure from ~3800 msg/s to ~50-100 msg/s of actual changes. |
||
|---|---|---|
| .. | ||
| nisps | ||
| synth | ||
| ui | ||
| a-app.js | ||
| app.js | ||
| b-app.js | ||
| c-app.js | ||