Timecode Chase — the score follows a DAW or a film
A DAW, a video player or a timecode generator sends MIDI Time Code (MTC); Ableton Live, Bitwig and hardware sequencers send MIDI clock (see below). With chase on, the score goes where the timecode says: it plays when the source plays, stops where it stops, and jumps when it locates. The composer works in the DAW against picture; the players see the score locked to it.
Turning it on
Open the MIDI input panel (the round button with three dots in the top bar, next to the Live Console's) and tick Follow MIDI timecode (chase). In score starts at, give the timecode of the score's beginning:
00:00:00:00 |
a DAW session that starts at zero (the default; the demo's) |
01:00:00:00 |
the film and TV convention: picture starts at one hour |
00:00:10:00 |
the score begins ten seconds into the session |
It accepts hh:mm:ss:ff, hh:mm:ss, or plain seconds. The panel shows the
timecode it hears, the frame rate, and whether the score is playing with it.
Both settings are kept in this browser and come back on the next visit.
Chase starts at once on plain MIDI, which is all a playing DAW sends; the
browser may also ask for MIDI with SysEx — allow it, and a locate made
while the DAW is stopped moves the score too (a DAW sends that as a SysEx
message). Web MIDI works in Chrome and Edge, and in the Oscilla app.
On the DAW's side: send MTC to a MIDI port this computer sees -- a USB interface, or a virtual port (IAC Driver on macOS, loopMIDI on Windows, the ALSA/JACK MIDI through port on Linux). In the DAW's synchronisation settings, look for Transmit MTC or Send MTC on that port, and set the session's frame rate to match the picture. Not every DAW sends MTC: some send only MIDI clock (tempo, not position), which chase does not use.
MIDI clock: Ableton Live, Bitwig, sequencers
Ableton Live and Bitwig send no MTC: they send MIDI clock — 24 ticks a beat, start / continue / stop, and the song position (in sixteenths) when you locate. Chase follows that too, from the same checkbox; it follows whichever it hears, and timecode if both.
Clock is musical position, not time, so the panel needs two things:
| score tempo | the tempo the score was written at (default 120). At the same tempo in the DAW the two run together; speed the DAW up and the score speeds up with it — bars stay lined up. |
| starts at bar | the bar the score begins at (4/4; default 1) |
The panel then shows MIDI clock · bar 9.1 · 124 bpm · playing with it.
In Ableton Live: Preferences → Link, Tempo & MIDI (the tab's name varies a little between versions) → MIDI Ports → the output that reaches this computer's browser → Sync: On. If Live offers a MIDI Clock Type, Song sends the song position (Pattern does not: then a locate in Live is not followed until it plays again). On macOS, the IAC Driver bus is a port both see; on Windows, loopMIDI.
In Bitwig: add a MIDI clock output for that port (in recent versions a controller of its own, "MIDI Clock Transmitter", under Settings → Controllers; check your version's manual).
Measured with a simulated clock source: at the score's own tempo the score stayed within ~20 ms; at 150 bpm against a 120 bpm score it ran 1.25× as fast within ~30 ms; a song position to bar 9 put it exactly on 16 s.
Try it: the demo, with Ardour
Open the Timecode Chase Demo (Demos ▾ on the start page): a minute of ruler with timecode under it, and a mark that flashes and beeps every four seconds (higher every sixteen). With Ardour (8):
- In Oscilla, MIDI input panel → Follow MIDI timecode, score starts at
00:00:00:00. - In Ardour, Window → Audio/MIDI Setup → Audio System: JACK (on a current Linux this is PipeWire's JACK: nothing else to install or start). Through it Ardour sees the computer's MIDI ports, among them Midi Through Port-0, which the browser hears.
- Edit → Preferences → Transport → Generate → Enable MTC Generator (a preference: Ardour keeps it for every session). Any timecode rate (Session → Properties → Timecode) works; chase reads it.
- Window → MIDI Connections: from MTC out (under Ardour Misc, or
Transport), to Midi Through Port-0 (under Hardware; with PipeWire
it is listed as
Midi-Bridge:Midi Through … Midi Through Port-0). Ardour saves this connection in the session. - Playhead at the start, press play: the score plays with Ardour. Turn on
Ardour's click (120 bpm: a demo mark falls every two bars). Stop: the
score stops. Locate to
00:00:30:00(marked in the score): it jumps there.
Tested end to end with Ardour 8.4 on Ubuntu 24.04 (PipeWire): Ardour's MTC through Midi Through into Chrome, the demo score following it second by second, and stopping where Ardour stopped. (Ardour's ALSA backend is another route: set its MIDI System to ALSA sequencer and connect MTC out to Midi Through there.)
To check that timecode is arriving, in a terminal: aseqdump -p "Midi Through" prints MTC quarter frame lines while Ardour plays.
Tested with simulated MIDI timecode on a real MIDI port into Chrome: the score held at its start through two seconds of pre-roll, started on the frame and stayed within about 10 ms of the timecode.
What it does
| The source | The score |
|---|---|
| plays | plays, from where the timecode is |
| stops | stops there |
| locates (a jump while playing, or the playhead moved while stopped) | seeks there; cues are re-armed, as with any seek |
| plays before the score's start (pre-roll) | waits at the start, and starts on the frame |
| plays past the score's end | stops at the end |
| scrubs backwards | stops, and follows where it lands |
While both run, the small differences between the two clocks are taken in smoothly -- no jump, and no cue fires twice. Measured against a simulated source at 25 fps, the score stayed within a few milliseconds of the timecode, well inside a frame.
Frame rates: 24, 25, 29.97 drop-frame and 30. The rate is read from the timecode itself.
Good to know
- Timecode sets the position, so the score's own
speed()changes are not followed while chasing: write the music's tempo changes in the DAW. Score time is the score's own clock -- its duration across its width, asseek()counts it. - One machine chases: the one the timecode reaches. The other devices
joined to the score follow it over the network as they follow any
transport. A projector window (
?follow=1) never chases. - Turn chase off to play the score from its own transport again.
- MTC from a DAW is MIDI over the computer, so its timing is good to a few milliseconds, not to the sample. For picture, a frame (40 ms at 25 fps) is the unit that matters.
See also
- External Audio -- the other way round: Oscilla leads, and SuperCollider or Pd plays along.
- The Playhead
midi()-- sending MIDI out.
Tip: use ← → or ↑ ↓ to navigate the docs