Single-page polyrhythm workstation built with vanilla JS + Tone.js.
- Multi-lane sequencer with add/remove lanes (up to 12).
- Hybrid editing per lane:
- Circular step editor
- Compact step grid editor
- Transport controls:
- Play/Stop
- BPM
- Bars (loop length)
- Swing
- Panic (kill all voices)
- Lane tools:
- Mute / Solo
- Copy / Paste
- Clear
- Fill (2/3/4)
- Invert
- Rotate left/right
- Humanization and workflow:
- Step accent cycling (soft/mid/hard)
- Mutate lane
- Undo / Redo
- Persistence/export:
- Autosaved session in
localStorage - Presets (IndexedDB with localStorage fallback)
- Session JSON import/export
- MIDI export
- Autosaved session in
Run from a local web server (not file://):
python -m http.server 8000Open:
http://localhost:8000
- Click steps to toggle on/off.
- Right-click a step to cycle accent level.
- Use lane toolbar buttons for lane-level operations.
Space: Play / StopCtrl/Cmd + Z: UndoCtrl/Cmd + Shift + Z: RedoR: Mutate active laneC: Copy active laneV: Paste to active lane1-9: Select lane by indexLeft/Right: Move active stepEnter: Toggle active stepA: Cycle active step accent?: Toggle shortcuts panel
index.html: App shell and controls.styles.css: UI styling, responsive behavior, reduced-motion support.app.js: Bootstrap, store/audio/ui wiring.statemanager.js: Reducer store, action handling, undo/redo, persistence.audioengine.js: Tone.js scheduling, lane audio graph, playback sync.uicontroller.js: Rendering, interaction handlers, shortcuts, presets, import/export.midiexport.js: MIDI file generation and download.
GET /favicon.ico 404in local server logs is harmless unless you add a favicon file.- If audio is blocked, ensure:
- You started from a web server
- Network access to CDN scripts is available
- You interact with the page before playback (browser audio policy)
Add your preferred license in LICENSE.