The idea
A rig built like a shell pipeline
Melody, harmony, drums and control signals are separate machines. What joins them is not a framework but a handful of wires.
Triggerfish is a set of musical machines, each living in its own browser tab. Odonus writes melodic figures, Vetula grows harmony, Balistes plays drums, and Selene makes control signals for a modular synthesiser. None of them knows how the others work inside. What they share are wires: MIDI to reach instruments, OSC between the programs that run the rig, a WebSocket to reach the rig's engine, and a BroadcastChannel so that pages can hear one another.
“Write programs that do one thing and do it well. Write programs to work together.”Doug McIlroy, as summarised by Peter H. Salus
That is the Unix idea, moved from text to sound. A pipe in a shell carries text; these wires carry notes, clocks and control voltages. Because each piece does one thing, each can be understood, replaced or simply left out. Someone new can open one page and play Ableton with it. Someone with a eurorack case can add the small programs that reach it. Nothing in between is needed until it is wanted.
Every machine is a web page, and every page is served from one origin, localhost:3023. So the pages share the routing table and the mode through the browser's own storage, and talk on a tab bus. The dashboard is one more page on that bus: it shows which machines are open, starts and stops them, sets the mode for all of them at once, and holds the routing: two matrices, in the manner of AUM, for the notes and the drums, while the harmony is patched on the chart itself, from Vetula to Odonus. In Atlantis its X-ray shows the rig: each of its programs, whether it is running, and a button to restart it. Close the dashboard, and each machine still plays on its own.
Text is a page like any other. Limulus is one editor in front of Tidal, and the machines answer to it too: drums $ s "bd*2 sn" plays the drum kit, odonus $ scale "dorian" moves Odonus, Q $ vetula "cow-umbrella-bell" is a Vetula voice playing a progression saved by name, conspicillum $ … a grain cloud, and odonus $ loop 2 plays back a stretch of what Odonus played, and selene $ ochd es9main sets eight LFOs running on the modular. Each machine is also open in its own page, and the rig keeps the two in step.
Every page is now laid out the same way: a browser on the left for what the machine keeps, the instrument in the middle, and Limulus on the right. Both drawers slide out when wanted (backtick for Limulus) and shut again, so the instrument gets the width. The pages are instruments; Limulus, with Tidal++, is where they are combined.
The same discipline runs underneath. The sequencer engines are written once, in PureScript, and compiled twice: to JavaScript for the page and to Erlang for the rig, with conformance tests holding the two to the same behaviour. A pattern does not change its mind when it moves from the browser to the rig.
| MIDI | Notes and controllers, to instruments. From the page by Web MIDI in Solo; from Diaphus by CoreMIDI in Atlantis. |
|---|---|
| The rig socket | A WebSocket from each page to Architeuthis: what to play (a machine's patch, its edits, its cues), its marks and loops, Selene's rack, and the stage, the rig's record of what each machine is playing. |
| OSC | Between the rig's own programs: Architeuthis to Diaphus, SuperDirt and es9-daemon, and the beat back from Diaphus. |
| The tab bus | A BroadcastChannel between pages of one origin: which machines are open; play, stop and panic; Vetula's scale for Odonus. |
| Ableton Link | Tempo and phase, shared over the local network with anything else that speaks Link. |
| Bosun's HTTP | Which of the rig's programs are up, and the requests to restart one or to raise and lower them all. The dashboard reads it every few seconds. |