Score

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):

  1. In Oscilla, MIDI input panel → Follow MIDI timecode, score starts at 00:00:00:00.
  2. 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.
  3. 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.
  4. 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.
  5. 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

See also

Tip: use ← → or ↑ ↓ to navigate the docs