simplyaudio

tussenalpha

One beat for music, visuals and people, jamming across the internet.

tussen keeps a live performance in time. Music, visuals and controllers, on one Mac or across the internet, all on one beat.

Download Alpha, for the Mac.
Simply Tussen: live audio and visuals in one hub (audio.dev demo)
The first live demo.
Simply Tussen’s Align tab during a djay Pro set: the music scrolling over bars 5 and 6, and below it the beat strip held still on beat 4, djay’s waveform marked “in time”
The Mix tab: inputs on the left (an audio interface, djay’s sound, MIDI, a camera, two replays), the Main mix in the middle, and the outputs on the right, cables between them

Everything you play goes in.

Sound, pictures and controllers. tussen lines it all up on the beat, mixes it, and sends it out.

The Align tab: four sounds on the beat strip, held still on beat 2; djay’s lane marked “17 ms late, drag left”

Visuals hit on the kick you hear.

Drag a sound’s waveform until the kicks sit on the beat line. That’s its delay, set once.

The Mix tab with two other tussens as inputs, berlin and lisbon; berlin’s panel shows its lag and that it follows this tussen’s beat

Jam with a friend in another city.

Paste a ticket into a chat, and your friend plays on your beat, however far away. No server to run and no VPN.

A camera’s shaders: a Feedback shader whose amount is on a controller knob, its hue drift on the level of the Main mix and its pulse on the beat; beside it, the choice of what drives a parameter

Visuals that follow the music.

A shader on a camera or a clip follows the beat, the bass level, your controller. Send the picture to a projector, or as NDI to Resolume or OBS.

The Control tab for a Launch Control XL: faders on the channels’ volume, two rows of knobs sending to TouchDesigner, one on pan, the buttons on mute and solo, each with the light it shows

Your controller, ready to play.

A Launch Control XL drives the mix, lights included. A pad switches scenes on the next bar: a new look, a new mix, together.

Record a set, replay it

tussen keeps the audio, every control signal and the beat. Replayed, your visuals and apps can’t tell it from live.

Cue the next thing

Prepare it on your headphones while the room hears the current one.

Undo anything

Every change to the set-up, whoever made it.

Works with

  • TouchDesigner
  • Resolume
  • djay Pro
  • Ableton Live
  • Traktor
  • OBS
  • Zoom

Anything that speaks Link, OSC, MIDI or NDI.

Get tussen on your Mac.

One click, no sign-up, and it is yours.

Download
Where it is at
Alpha, for the Mac.
What you need
A Mac on macOS 13 or later; 14.2 or later to bring in another app’s sound.
Windows, Linux
Not yet. Leave your email on the download page and we will tell you when.

The details

What sets it apart

tussen starts from the music, not from the network. Five things follow from that.

1A shared musical transport

  • One tempo and one beat across everyone in the jam.
  • Start, stop and tempo changes land on the same bar for everyone.
  • Ableton Link and MIDI clock follow along, so Ableton, djay, Traktor and your drum machine stay on it.

Other solutions have no shared clock: everyone plays to what they hear.

2Not just audio

  • Video and control go through tussen too: cameras, screens, NDI, OSC, MIDI.
  • Sound, pictures and controls line up on the same beat.
  • Visuals react to the music: a shader follows the beat, the level of a channel, a fader.
  • Across the internet it’s sound for now. Pictures and controls line up on your own machine.

3Performance controls

  • Scenes: a whole set-up you switch to on the next beat or bar, without a click.
  • Cue: prepare the next thing on your headphones, and on a cue screen for video, while the room hears the current one.
  • Controllers mapped to actions: a fader to a gain, a pad to a scene, a knob to a shader.
  • Undo for every change to the set-up, whoever made it.

4Asymmetric meshes

  • Everyone builds their own mix, for their own audience.
  • Nobody hears themselves come back: each player sends only what they play.
  • Listeners can sit downstream: a player passes one group’s stream on to another.
  • Only players in a loop need low latency. A listener hears the jam a little late, but on the beat.

Other solutions are one room where everyone hears everyone.

5Play over the internet, not just one band on a LAN

  • Each player stays on the beat, however far away.
  • Connecting is pasting a ticket into a chat or Discord.
  • No server to run and no VPN. tussen finds a way through home routers, and through a public relay when there’s no direct path.

Other solutions need latency low enough to play by ear. In practice that means one region.

Works with
Timing
Ableton Link, MIDI clock
Control
MIDI 1.0 and 2.0, OSC, game controllers, TouchOSC
Video
NDI in and out, cameras, screens, windows and apps, video clips
Sound
Any audio interface, one app’s sound or several, VST3 and CLAP plugins
Apps
TouchDesigner, Resolume, djay Pro, Ableton Live, Traktor, OBS, Zoom. Anything that speaks Link, OSC, MIDI or NDI.
For fellow nerds

Clock and beat

  • Ableton Link, through simply-link, an independent Rust implementation: tempo, beat, phase and start/stop. tussen joins a session; it never founds one unless you press Start session.
  • One host clock, monotonic, in ns: MIDI driver stamps, capture presentation times, OSC, RTP and NDI arrivals all land on it.
  • Every input is a channel with an offset, how late it arrives. Aligned outputs wait for the slowest one, O: a channel goes out at arrival + (O − offset). Raw outputs get it on arrival.
  • MIDI beat clock out, 24 ppqn, made from Link, with Song Position and Start on the next bar. Plugins hear Link as their host transport.
  • Plugin delay compensation to the sample, up to 1 s, re-read when a plugin’s latency changes.

Audio

  • CoreAudio in and out, any device, followed by its UID across renames; drifting clocks tracked by a DLL and resampled in the mix.
  • Process taps (macOS 14.2+): one app’s sound, a few apps, or everything the Mac plays but tussen.
  • A HAL driver (AudioServerPlugIn) ships inside the app: Tussen In 1, Tussen In 2 and Tussen Out, stereo loopback devices at 44.1, 48 or 96 kHz.
  • VST3 and CLAP chains on an input, a mix or an output, with their own editors and state saved in the scene. In process. No Audio Units.
  • RTP on the local network: L16, 48 kHz stereo, 256 frames (5.3 ms) a packet, reordered and jitter-buffered on the way in. NDI audio in too.

Visuals

  • A wgpu engine on Metal. Captured frames come in as IOSurfaces, imported as Metal textures with no copy.
  • Shaders in WGSL, GLSL and ISF, chained per input, reloaded on save; a bad save keeps the last good one running. ISF’s audio and audioFFT are the program’s sound, and tussen adds BEAT, PHASE, BAR and TEMPO.
  • In: cameras through AVFoundation (Continuity and virtual ones too), screens, windows and apps through ScreenCaptureKit, NDI senders, and clips (H.264, HEVC, ProRes) played on the beat.
  • Out: NDI, a full-screen window on a display, a separate cue picture, and an NDI source’s frames to local WebGL pages over a websocket.
  • Not yet: Syphon, and a compositor that mixes channels into one picture.

Control

  • OSC 1.0 in on UDP :9000, out per destination with filters and remaps, bundled under 1200 bytes so nothing fragments on Wi-Fi.
  • MIDI 1.0 and 2.0 (UMP), carried losslessly, SysEx never; MIDI out to hardware or to a virtual port.
  • Game controllers over HID (gilrs): a DualSense, say.
  • Surface drivers, LEDs included: Novation Launch Control XL (mk2) and XL 3, DJ TechTools MIDI Fighter Twister. Any other MIDI controller through a generic driver; TouchOSC or any OSC app fires actions.
  • MCP (streamable HTTP, loopback only): every API call is a tool for an agent, and screenshot shows it the window. A websocket gives scripts the same calls and a live signal feed.

The mesh

  • Two transports behind one seam: iroh (QUIC datagrams, hole punching, n0’s public relays) across the internet, or plain TCP and UDP over a tailnet, a LAN, ZeroTier or WireGuard.
  • Turning it on: [mesh] enabled = true in tussen.toml, and transport = "iroh" to reach across the internet; without it, the overlay.
  • Tickets carry a 128-bit session token; the joiner proves it holds it with an HMAC-SHA256 over both signed hellos, so the token never crosses the link. Hub keys are Ed25519.
  • Sound only, for now: L16 (about 1.5 Mbit/s for 48 kHz stereo) by default, or Opus, 5 ms CELT frames at 64 kb/s a channel, stepping down to 24 on loss, for 7.5 ms more latency.
  • One tempo and beat numbering per mesh: remote audio is placed by its beat stamp, clocks synced by min-RTT ping, crystal drift followed from the lags’ slope.
  • Not yet: video and control signals across the mesh.

Platform

  • macOS 13 or later (14.2 for app taps), one universal app for Apple Silicon and Intel.
  • Developer ID signed, hardened runtime, the dmg notarised and stapled.
  • One Rust process from one cargo workspace: the hub, a menu-bar item and an egui window. It runs headless too, with an HTML console.
  • One API for everything: the window, scripts and agents make the same calls, with one undo tree that records who made each change. The config is commented TOML, saved 500 ms after an edit, comments kept.
  • Windows: the code type-checks for it; nothing runs there yet.
What’s next
  • Everything across the internet, not just sound. Today a jam crosses as sound; next, your friend’s camera, controller and visuals, all on your beat.
  • Connecting from the app. Open tussen, paste a ticket, play: no settings file.
  • Scenes that crossfade over a few beats, sound and picture together, not just switched.
  • Takes with everything in them: every stem, every signal, every picture and the beat. Today a take keeps the sound, the signals and the beat.
  • Windows, next to the Mac, so nobody is left out of the jam. Today tussen runs on a Mac.

Why tussen?

It started at the ADE Lab hackathon in Amsterdam, October 2026. A team called tussen built an early prototype there: tussen-hub, open source and still on GitHub, if you are curious where it began. Simply Tussen grew out of it into a far more complete product. And the name? Tussen is Dutch for “in between”: it sits between your music, your visuals and the people you play with.