# open-audiovisual > open-audiovisual is a zero-build JavaScript framework that turns MIDI controllers, microphones, hand tracking and phones into signals for browser-based audiovisual performance: p5.js, WebGL or WebToe worlds, MIT licensed. Inputs (MIDI, microphone, chords, body and hand pose, phones) publish named signals; a mapping layer routes signals to parameters; an algorithmic "world" reads only parameters and renders image and sound; a timeline, a director's console and a backstage monitor run the show. Plain ES modules, no build, no dependencies. Extracted from The Last Input (Che-Yu Wu, 2026), a 49.4-channel performance at the IRCAM residency × C-LAB, Taipei. Today: 27 packages, 26 examples, 27 MIDI controller profiles (21 devices and 6 generic layouts), version 0.1.0; oav-p5 0.8.4 (https://openaudiovisual.com/changelog/). Site: https://openaudiovisual.com/ (English) · https://openaudiovisual.com/zh/ (繁體中文, Traditional Chinese) Repository: https://github.com/frank890417/open-audiovisual Author: Che-Yu Wu 吳哲宇 (https://cheyuwu.com) How to cite: cite the canonical URL of the page you read. Code is MIT; examples 05 to 07 integrate artworks © Che-Yu Wu, all rights reserved. ## Pages - [Homepage](https://openaudiovisual.com/) ([繁體中文](https://openaudiovisual.com/zh/)): a playable instrument, how it works, the works, quick start, for AI agents. - [Handbook](https://openaudiovisual.com/docs/) ([繁體中文](https://openaudiovisual.com/zh/docs/)): the complete documentation on one page: every chapter listed below, in one HTML file. Generated from the Markdown in `docs/`. - [API reference](https://openaudiovisual.com/docs/reference/) ([繁體中文](https://openaudiovisual.com/zh/docs/reference/)): the API reference: every variable, function, event and option of oav-p5 (`micLevel`, `knob1`, `startDrums()` …) and every export of every package, searchable, each with a description, parameters, examples you can run and a link to the source line. Generated from the code on every build and checked against it in CI, so it cannot list a name that does not exist or miss one that does. The same data as JSON: https://openaudiovisual.com/docs/reference/reference.json. - [MIDI controller library](https://openaudiovisual.com/controllers/) ([繁體中文](https://openaudiovisual.com/zh/controllers/)): every modeled controller as a playable faceplate with its full MIDI implementation table and cited sources; embed any of them with `` or an iframe (`/embed/controller/`). - [Examples](https://openaudiovisual.com/examples/) ([繁體中文](https://openaudiovisual.com/zh/examples/)): every example, with a thumbnail and what it needs. - [p5.js in one line](https://openaudiovisual.com/p5/) ([繁體中文](https://openaudiovisual.com/zh/p5/)): load `oav-p5.js` and any p5 sketch plays from MIDI, an on-screen controller or a phone; the same line adds sound (`startSound`), a drum machine with one line of rhythm (`startDrums("bd*4, [~ sd]*2, hh*8")`), the microphone (`micLevel`), video recording (`startRecording`) and values smoothed like TouchDesigner's Lag CHOP (`lag()`); it also runs next to Strudel. Ready-made sketches in `p5/examples/`, each playable as an example (16 to 26). - [WebToe](https://openaudiovisual.com/webtoe/) ([繁體中文](https://openaudiovisual.com/zh/webtoe/)): the sister project and the engine half of the stack: a web-native, node-based dataflow engine for real-time visuals (TouchDesigner-style, WebGL2 + WebGPU, zero runtime dependencies) that opens TouchDesigner `.toe` projects; how `@openav/world-webtoe` performs a WebToe patch as a world. Editor: https://webtoe.openaudiovisual.com/ - [Changelog](https://openaudiovisual.com/changelog/) ([繁體中文](https://openaudiovisual.com/zh/changelog/)): what changed, newest first: oav-p5 version by version, the framework and the site by day, each with its commit. ## Core concepts - **Signal** — a named, normalized value saying what is happening: `midi/cc/74`, `audio/rms`, `chord/consonance`, `pose/hand/right/y`, `phone//tilt/x`. Continuous (has a value, usually 0..1) or pulse (fires an event payload, e.g. `midi/note/on` → `{note, vel}`). Signals are the only currency of input. - **Param** — a value a world listens to (`hue`, `bloom`), declared by the world as `{ key, min, max, def }`. Resolved per frame: timeline automation, overridden by a hand/knob/route. - **Mapping / route** — `{ source: 'midi/cc/74', target: 'bloom', curve, inMin, inMax, smooth }`. Many-to-many; "learn" binds the next signal that moves. Routes are JSON. - **World** — the piece: `{ name, params, init({container, signals, params}), update(dt, state, io), render(), dispose() }`. Reads params, never inputs; may subscribe to discrete event signals. Renderer-agnostic (canvas, p5, three.js, a WebToe patch). - **Show** — `createShow({ world, timeline, routes, modules })` from `@openav/show` assembles inputs, mapping, timeline, console, sound and backstage around one world. - **Score** — a show with structure: `createShow({ score: { cuts, modules } })` (`@openav/score`). A cut is a list of segments with *lengths* (`{ id, dur, cues, acts, linger, hold }`), never absolute seconds; a derived cut is `{ id, from, scale }`. A Director runs one module per segment (`enter / update / exit / param`), a module that throws is switched off alone, `?cut=` picks the version, `hold: true` waits for Space. `window.openav.show.table()/goto()/status()`. - Two rules an agent must not break: (1) continuous control goes through params, never `signals.get()` in `update()`; (2) never edit `packages/*` to make one example look right. ## Start - Run: `git clone https://github.com/frank890417/open-audiovisual.git && cd open-audiovisual && node serve.js` → http://localhost:8080 (no npm install; Chrome/Edge for Web MIDI and camera) - Make a new work: copy `examples/01-hello-particles/` to `examples/27-/`, write the World in `main.js`, open `http://localhost:8080/examples/27-/`. - Verify: `npm test` (node --test) passes; the example loads with zero console errors (a refused `ws://localhost:7457` monitor connection is expected when no monitor runs). ## Docs - [AGENTS.md](https://openaudiovisual.com/AGENTS.md): conventions for AI coding agents, the two rules, how to create a work. Read first. - [README](https://openaudiovisual.com/README.md): overview, architecture diagram, examples, phone remote. - [Introduction](https://openaudiovisual.com/docs/introduction.md): what it is, who it is for, what it handles so a show does not rebuild it. - [Quick start](https://openaudiovisual.com/docs/getting-started.md): run it, play it, make a new work. - [Core concepts](https://openaudiovisual.com/docs/concepts.md): signal, param, route, world, timeline, show, and the two rules that hold them together. - [Architecture](https://openaudiovisual.com/docs/architecture.md): the frame loop and every layer's contract. - [Writing a world](https://openaudiovisual.com/docs/writing-a-world.md): the World interface, params vs events, sound output, checklist. - [Inputs](https://openaudiovisual.com/docs/inputs.md): every input package and the `modules` key that switches it on. - [Mapping](https://openaudiovisual.com/docs/mapping.md): routes, curves, smoothing, many-to-many and "learn". - [Show control](https://openaudiovisual.com/docs/show-control.md): timeline, scenes, performance mode, console, monitor, OSC. - [Score & Director](https://openaudiovisual.com/docs/score.md): a show as segment lengths: cuts, cues, hold, segment modules, the prompter, score to MIDI. - [MIDI controllers & embedding](https://openaudiovisual.com/docs/controllers.md): MIDI controllers as JSON profiles, the `` element and the iframe embed. - [p5.js in one line](https://openaudiovisual.com/docs/p5.md): one line that lets any p5.js sketch play from MIDI, an on-screen controller or a phone, with sound, a drum machine you can write as one line of rhythm, the microphone, video recording, and values that move like TouchDesigner's CHOPs (`lag()`). - [With Strudel](https://openaudiovisual.com/docs/strudel.md): Strudel and OAV side by side: knobs, phone and microphone as Strudel parameters; Strudel's notes and clock drawn in a p5 sketch on the same page or in another tab (link=); Hydra. - [Phones, relay & surfaces](https://openaudiovisual.com/docs/remote.md): phones and iPads as controllers: relay, sensors, control surfaces. - [Signals reference](https://openaudiovisual.com/docs/signals.md): every signal the built-in inputs publish, with ranges. - [Package reference](https://openaudiovisual.com/docs/packages.md): every package, by layer. - [For AI agents](https://openaudiovisual.com/docs/agents.md): conventions for AI coding agents, the two rules, how to create a work. - [Lab integration (the `"lab"` field)](https://openaudiovisual.com/docs/lab-integration.md): the `"lab"` field in package.json. - [Troubleshooting](https://openaudiovisual.com/docs/troubleshooting.md): real problems found in rehearsals, and what to do about them. - [Roadmap](https://openaudiovisual.com/docs/roadmap.md): signal recording and replay, npm publish, WebGPU worlds, NDI gateway, distributed performance, agent performers. - [Patch bay design](https://openaudiovisual.com/docs/design/patchbay.md): multi-device MIDI and the patch bay. - [Full text](https://openaudiovisual.com/llms-full.txt): README, AGENTS.md and every handbook chapter in one file. ## MCP server The repo ships a zero-dependency MCP server over stdio (`packages/mcp/server.js`). Claude Code picks it up from `.mcp.json` when opened in the repo. Other clients: ```json { "mcpServers": { "openav": { "command": "node", "args": ["/path/to/open-audiovisual/packages/mcp/server.js"] } } } ``` Tools: `list_examples` (works and one-line summaries) · `read_doc` (architecture, writing-a-world, signals, show-control, roadmap, agents, readme) · `scaffold_world` (copy a donor example into a new numbered one) · `run_checks` (the test suite CI runs) · `list_controllers` / `read_profile` / `validate_profile` / `scaffold_profile` (MIDI controller profiles: browse, read, check, start a new one). A Claude Code skill, `.claude/skills/create-world`, scaffolds a world from a description. ## Examples Each runs in the browser without hardware (on-screen piano, QWERTY keys, simulated performer or drum machine). Live at https://openaudiovisual.com/examples//, source in `examples//main.js`. - [01-hello-particles](https://openaudiovisual.com/examples/01-hello-particles/): The smallest complete app. Read its main.js from top to bottom and you know the framework. (plays with on-screen piano · QWERTY · simulated performer) - [02-chord-garden](https://openaudiovisual.com/examples/02-chord-garden/): A note drops a seed, a triad opens flowers along the branches, a cluster makes them droop and fall. The branches are The Last Input's own L-system plants. The world listens to chord signals, never to keys. (plays with on-screen piano · QWERTY · simulated performer) - [03-pose-field](https://openaudiovisual.com/examples/03-pose-field/): Fingers as an instrument: one pinch sets tightness, another grows arms, both fists bloom. Four pattern families: mandala, lissajous, spirograph, web. (plays with camera (hands) · on-screen piano · drum machine) - [04-webtoe-stage](https://openaudiovisual.com/examples/04-webtoe-stage/): The world is a WebToe node patch, TouchDesigner-style, performed through ext() bindings. WebToe is the engine, open-audiovisual is the show. (plays with on-screen piano · simulated performer) - [05-prebiotic-flake](https://openaudiovisual.com/examples/05-prebiotic-flake/): A 2023 MIDI daily sketch replayed through the framework. The drawing code is the original. The flakes now have a voice through Tone.js. (plays with on-screen piano · simulated performer · sound) - [06-cylinder-earth](https://openaudiovisual.com/examples/06-cylinder-earth/): A 2020 voice-controlled WebGL sketch. Lows pump the towers, highs shimmer the spin, a kick turns the palette. (plays with microphone · drum machine) - [07-firework-festival](https://openaudiovisual.com/examples/07-firework-festival/): A 2021 sketch. Close a finger pinch and a firework launches from that hand. The particle system is the 2021 code. (plays with camera (hands) · on-screen piano) - [08-remote-surface](https://openaudiovisual.com/examples/08-remote-surface/): The phone is the instrument panel. The world only declares params, and the control surface on the phone grows from them. Needs node serve.js on your network. (plays with phone or iPad · on-screen piano) - [09-midi-controllers](https://openaudiovisual.com/examples/09-midi-controllers/): On-screen MiniLab 3, LPD8, Launchpad and nanoKONTROL2. Plug the real one in and the on-screen one moves with your hands. (plays with MIDI controller, or the on-screen one) - [10-record](https://openaudiovisual.com/examples/10-record/): A performance video: the work above the webcam in one vertical 1080×1920 to 4K file with the work's own sound; MIDI takes recorded and played back. (plays with on-screen piano · QWERTY · simulated performer · camera (optional)) - [11-controller-video](https://openaudiovisual.com/examples/11-controller-video/): The performance video without a camera: the MIDI controller being played (MiniLab 3, any profile) drawn live under the work; replayed takes animate it too. (plays with MIDI controller · on-screen piano · QWERTY · a demo take) - [12-leap-hands](https://openaudiovisual.com/examples/12-leap-hands/): A Leap Motion as an instrument through the local bridge; the mouse simulates hands when no bridge runs. (plays with Leap Motion · mouse as a simulated hand) - [13-score-director](https://openaudiovisual.com/examples/13-score-director/): A show with structure: "A day of sky" written once as segment lengths; a Director runs one module per segment, ?cut= picks a version, Space continues a hold. (plays with on-screen piano · keyboard: Space, ← →) - [14-timeline](https://openaudiovisual.com/examples/14-timeline/): Automation you can see. Five lanes of keyframe curves drive a ring of light, scenes cut it, cues fire one-shot flashes, and any knob you touch takes over until you let go. Record a knob move to write a new curve. (plays with nothing: it plays itself · knobs on screen) - [15-p5-one-line](https://openaudiovisual.com/examples/15-p5-one-line/): A plain p5 sketch whose first line loads oav-p5.js, then plays from a MIDI controller, an on-screen controller or a phone. (plays with MIDI controller · on-screen controller · phone) - [16-p5-sound](https://openaudiovisual.com/examples/16-p5-sound/): startSound('piano') in setup(): every key from a MIDI keyboard, the 🎹 on screen or a phone is heard, and bursts into particles. (plays with MIDI keyboard · on-screen controller · phone) - [17-p5-microphone](https://openaudiovisual.com/examples/17-p5-microphone/): micLevel, bass and beat read the microphone the way p5 reads mouseX: a circle that grows when you speak, and no p5.sound. (plays with microphone · drum machine (🥁)) - [18-p5-drums](https://openaudiovisual.com/examples/18-p5-drums/): startDrums('breakbeat', 110) puts a 16-step drum machine on the page; kickDetected() and cueFired() turn its hits and its bars into the picture. (plays with drum machine · its 16-step grid) - [19-p5-rhythm](https://openaudiovisual.com/examples/19-p5-rhythm/): startDrums("bd*4, [~ sd]*2, hh*8") writes the drums as one line of rhythm; drumPhase and beatPhase turn a hand once a bar and swell a circle on every beat. (plays with drum machine · one line you can edit) - [20-p5-rhythm-visual](https://openaudiovisual.com/examples/20-p5-rhythm-visual/): drawRhythm() draws the rhythm on the canvas as a grid, a circle or a spiral, so a recording has it; the cells and the line on the card edit each other. (plays with drum machine · its cells and its line) - [21-p5-record](https://openaudiovisual.com/examples/21-p5-record/): startRecording() saves the canvas and the sketch's own sound as one video, MP4 where the browser can write it; ⏺ and 📷 in the 🎹 panel need no code. (plays with QWERTY keys A–K · on-screen controller · drum machine) - [22-p5-lag](https://openaudiovisual.com/examples/22-p5-lag/): lag(micLevel, 0.03, 0.4) smooths a jumpy value the way TouchDesigner's Lag CHOP does, in the same seconds; scope() plots both in a corner of the page. (plays with microphone · drum machine (🥁)) - [23-p5-with-strudel](https://openaudiovisual.com/examples/23-p5-with-strudel/): Strudel plays in another tab and this sketch draws: every note Strudel sends to OAV Virtual MIDI calls notePressed(), and its clock turns drumPhase. (plays with Strudel in another tab · on-screen controller) - [24-p5-note-names](https://openaudiovisual.com/examples/24-p5-note-names/): noteIsDown('C4') works like noteIsDown(60): write note names (C4, c#4, Db3) wherever a note number goes; noteNumber(), noteName() and noteFreq() convert. (plays with MIDI keyboard · on-screen controller · phone) - [25-p5-chop](https://openaudiovisual.com/examples/25-p5-chop/): env('kick'), spring(), speed() and count('kick', 4) shape a number the way TouchDesigner's Trigger, Spring, Speed and Count CHOPs do: a bass drum opens a disc, a spring bounces it back, a hand turns, every fourth kick changes the colour. (plays with microphone · drum machine (🥁)) - [26-p5-rhythm-lab](https://openaudiovisual.com/examples/26-p5-rhythm-lab/): OAVp5.drums.edit('bd(3,8), …') swaps the rhythm like typing it, OAVp5.drums.undo() goes back a line, OAVp5.drums.strudelUrl opens the line in Strudel; rhythmChanged() says what the line is now. (plays with keys 1–4, Z, S · drum machine (🥁)) Examples 05–07 integrate artworks © Che-Yu Wu (2020–2023), all rights reserved; the framework is MIT. ## MIDI controllers 27 controller profiles, one page each with every control's exact MIDI message (channel, CC or note), LED feedback and cited sources. The profile JSON is the data behind the page. - [AKAI LPD8 (mk2)](https://openaudiovisual.com/controllers/akai-lpd8/): 16 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/akai-lpd8.json - [AKAI APC mini mk2](https://openaudiovisual.com/controllers/akai-apc-mini-mk2/): 90 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/akai-apc-mini-mk2.json - [AKAI MIDImix](https://openaudiovisual.com/controllers/akai-midimix/): 52 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/akai-midimix.json - [AKAI MPK mini mk3](https://openaudiovisual.com/controllers/akai-mpk-mini-mk3/): 43 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/akai-mpk-mini-mk3.json - [AKAI APC40 mkII](https://openaudiovisual.com/controllers/akai-apc40-mk2/): 139 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/akai-apc40-mk2.json - [Arturia MiniLab 3](https://openaudiovisual.com/controllers/arturia-minilab3/): 48 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/arturia-minilab3.json - [Arturia KeyStep 37](https://openaudiovisual.com/controllers/arturia-keystep37/): 44 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/arturia-keystep37.json - [Arturia BeatStep](https://openaudiovisual.com/controllers/arturia-beatstep/): 32 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/arturia-beatstep.json - [Behringer X-TOUCH MINI](https://openaudiovisual.com/controllers/behringer-x-touch-mini/): 33 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/behringer-x-touch-mini.json - [DJ TechTools Midi Fighter Twister](https://openaudiovisual.com/controllers/djtechtools-midi-fighter-twister/): 38 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/djtechtools-midi-fighter-twister.json - [Korg nanoKONTROL2](https://openaudiovisual.com/controllers/korg-nanokontrol2/): 51 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/korg-nanokontrol2.json - [Korg nanoKEY2](https://openaudiovisual.com/controllers/korg-nanokey2/): 28 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/korg-nanokey2.json - [Novation Launchpad Mini MK3](https://openaudiovisual.com/controllers/novation-launchpad-mini-mk3/): 80 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launchpad-mini-mk3.json - [Novation Launch Control XL (MK2)](https://openaudiovisual.com/controllers/novation-launch-control-xl-mk2/): 56 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launch-control-xl-mk2.json - [Novation Launch Control XL 3](https://openaudiovisual.com/controllers/novation-launch-control-xl-3/): 48 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launch-control-xl-3.json - [Novation Launchkey Mini MK3](https://openaudiovisual.com/controllers/novation-launchkey-mini-mk3/): 51 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launchkey-mini-mk3.json - [Novation Launchkey 25 MK4](https://openaudiovisual.com/controllers/novation-launchkey-25-mk4/): 52 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launchkey-25-mk4.json - [Novation Launchkey 37 MK4](https://openaudiovisual.com/controllers/novation-launchkey-37-mk4/): 64 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launchkey-37-mk4.json - [Novation Launchpad Pro MK3](https://openaudiovisual.com/controllers/novation-launchpad-pro-mk3/): 105 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/novation-launchpad-pro-mk3.json - [ODD Ball](https://openaudiovisual.com/controllers/odd-ball/): 10 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/odd-ball.json - [teenage engineering OP-1 field](https://openaudiovisual.com/controllers/teenage-engineering-op-1-field/): 61 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/teenage-engineering-op-1-field.json - [Generic 8 knobs + 8 pads](https://openaudiovisual.com/controllers/generic-8k8p/): 16 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/generic-8k8p.json - [Generic 8 faders](https://openaudiovisual.com/controllers/generic-8f/): 8 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/generic-8f.json - [Generic 16 pads](https://openaudiovisual.com/controllers/generic-16p/): 16 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/generic-16p.json - [Generic 25-key keyboard](https://openaudiovisual.com/controllers/generic-keys25/): 28 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/generic-keys25.json - [Generic 49-key keyboard](https://openaudiovisual.com/controllers/generic-keys49/): 52 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/generic-keys49.json - [Generic 61-key keyboard](https://openaudiovisual.com/controllers/generic-keys61/): 64 controls, every MIDI message; profile https://openaudiovisual.com/packages/midi/profiles/generic-keys61.json ## Packages 27 packages under `packages//`, imported as `@openav/` through an import map. - Input: `midi` (Web MIDI in and out, many devices, on-screen controller profiles) · `audio` (Microphone analysis: loudness, bands, brightness, onsets, drum hits) · `chord` (Chord detection for performance: consonance, triads, clusters) · `pose` (Body and 21-point hand tracking from the camera, on the device) · `keys` (On-screen piano, QWERTY playing and a simulated performer) · `drums` (Synth kit and step sequencer that publish analyzer-shaped signals) · `leap` (Leap Motion hands through a small local bridge, as 21-point hand signals) - Mapping: `mapping` (Signal to param routes: curves, smoothing, many-to-many, learn) · `chop` (Values over time, as TouchDesigner's CHOPs shape them: lag, envelope, speed, spring, trail, slope, count; the same curve at any frame rate) - World: `stage` (The world shell: lifecycle and params, no renderer opinion) · `world-webtoe` (Perform a WebToe node patch as a world) - Output: `sound` (Instruments in the page (Salamander piano, mallets, strings, organ, synth presets), one file to add your own) · `osc` (OSC out of the browser through a small Node bridge to UDP) · `out` (Page parameters to WLED lights, serial motor boards and OSC through one local bridge, with a watchdog that falls back to safe values) · `record` (Performance video: the work above the webcam in one file with its own sound; MIDI takes recorded and replayed) · `fab` (Can it be made? A 3D-print check for any mesh (watertight, overhang, thinnest wall, grams) and STL, OBJ, GLB, STEP files) - Spines: `timeline` (Param automation, scenes and cues: the clock of the show) · `score` (The show as segment lengths: cuts, cues, holds, and a director that keeps it running when a module fails) · `pattern` (Rhythm in one line: TidalCycles/Strudel-style mini-notation read into the hits of each bar (Euclidean rhythms, one-per-bar alternation, seeded chance)) · `console` (The director's desk and performance mode) · `monitor` (Backstage view for any device on the network) - Phones and tablets: `relay` (Zero-dependency room relay for phones and iPads) · `surface` (TouchOSC-style widgets and autoSurface(params)) · `remote` (The phone and iPad app: sensors, keyboard, control surface) - Glue and agents: `core` (Signals, Params and Loop: what every layer speaks) · `show` (createShow(): one call assembles the whole shell) · `mcp` (MCP server for coding agents: list, read, scaffold, check) ## Optional - [Roadmap](https://openaudiovisual.com/docs/roadmap.md): signal recording and replay, npm publish, WebGPU worlds, NDI gateway, distributed performance, agent performers. - [Lab integration](https://openaudiovisual.com/docs/lab-integration.md): the `"lab"` field in package.json. - [WebToe](https://github.com/frank890417/WebToe): sister project, a node-based dataflow engine that imports TouchDesigner projects.