memlnaut-nisps/playground/ARCHITECTURE.md

43 lines
2 KiB
Markdown
Raw Normal View History

2026-04-07 00:17:42 +02:00
# Playground Architecture
## Event Systems
### Event Bus (preferred for new code)
The shared event bus at `js/event-bus.js` is the preferred event system for all new playground code. It provides namespaced pub/sub with wildcard support and automatic timestamping.
**Import:**
```js
import { EventBus, getDefaultBus, SEQ, ML, UI } from './js/event-bus.js';
```
**API:**
| Method | Description |
|--------|-------------|
| `new EventBus(audioCtx?)` | Create a new bus. Optional AudioContext for `seq.*` timestamps. |
| `bus.on(event, cb)` | Subscribe. Exact (`'seq.step'`) or wildcard (`'seq.*'`). |
| `bus.off(event, cb)` | Unsubscribe. Same signature as `on()`. |
| `bus.emit(event, data?)` | Emit. A `timestamp` field is added automatically. |
| `bus.setAudioContext(ctx)` | Set or replace the AudioContext for `seq.*` timestamps. |
| `getDefaultBus(audioCtx?)` | Get (or lazily create) the shared singleton bus. |
**Namespace conventions:**
| Prefix | Constants | Purpose |
|--------|-----------|---------|
| `seq.*` | `SEQ.STEP`, `SEQ.NOTE_ON`, `SEQ.NOTE_OFF`, `SEQ.PARAM_CHANGE`, `SEQ.LOOP_START` | Sequencer transport and timing events. Timestamped via `AudioContext.currentTime`. |
| `ml.*` | `ML.TRAINED`, `ML.FROZEN`, `ML.UNFROZEN`, `ML.DELTA_UPDATE` | ML engine state changes. |
| `ui.*` | `UI.PARAM_SELECT`, `UI.CHAIN_EDIT`, `UI.PRESET_LOAD`, `UI.FREEZE_TOGGLE` | UI interaction events. |
New features should define their own namespace constants following the same pattern.
**Callbacks** receive `(data, eventName)` where `data` always includes a `timestamp` field (`AudioContext.currentTime` for `seq.*`, `performance.now()` for everything else).
### DOM CustomEvents (existing code)
Existing code uses DOM `CustomEvent` dispatched on DOM elements (e.g. `controlsurface:change`, `eoc:change`). These work fine and should **not** be migrated at this time. Both systems coexist without conflict.
When the app is rewritten in the future, the goal is to unify on the event bus and retire DOM CustomEvents for inter-module communication.