For anyone, like me, who grew up in the 80s and 90s trying to make music the travails of midi sync, Midi Timecode, LTC and SMPTE may well be familiar. As a young man I purchased a Fostex R8 8-track recorder which came with a free midi controller, the MTC-1. I couldn't ever make the MTC-1 do anything back then as I didn't have a computer; My sequencer was the Alesis HR-16 and MMT-8.
But now I do have a computer! :) The problem is that sending the necessary midi commands to the MTC-1 to make it Chase to SMPTE etc required a combination of midi notes being sent, with one being a 'SHIFT' key, and the timing apparently quite critical. Worse, the MTC-1 had but 2 LEDs to provide user feedback on its condition. I did get this working with Logic but has each time it power cycles it needs to receive the Chase to TC command anew, I needed a reliable way to send those commands. hence this solution. If it helps anyone it would be marvellous to know. :)
Node.js controller for the Fostex MTC-1 SMPTE sync interface. Controls the MTC-1 via MIDI, with a browser web UI (tablet-friendly) and optional Stream Deck MK2 hardware surface.
- Node.js v18 or later — https://nodejs.org
- npm (comes with Node)
- Emagic MT4 (or any USB MIDI interface) connected
- Fostex MTC-1 connected to MT4 MIDI OUT 3 / MIDI IN 1
cd mtc1-controller
npm installnode server.jsThen open http://localhost:3000 in any browser. Also accessible from a tablet on the same Wi-Fi network at the IP printed in the terminal.
Connect the Stream Deck MK2 before running node server.js.
The server detects it automatically — no extra config needed.
Button layout (Stream Deck MK2, 5×3):
[ Sys Reset ] [ MTC Out ON ] [ MTC Out OFF ] [ Time Ref ] [ Start Seq ]
[ Play ] [ Stop ] [ Record ] [ Gen SMPTE ] [ RX TC ]
[ TRK 1 ] [ TRK 2 ] [ TRK 3 ] [ TRK 4 ] [ TRK 5-8 ]
Each power cycle of the MTC-1 requires this sequence:
- System Reset (0xFF) — returns MTC-1 to defaults (not strictly necessary but can be helpful to return you to a known state)
- MTC Output ON — enables MTC on MIDI OUT (off by default!)
- Time Reference Selection: MTC — enables tape chase mode
The Full Session Startup button does all three automatically.
| Command | SHIFT note | NORMAL note |
|---|---|---|
| MTC Output ON | 78 | 61 |
| MTC Output OFF | 79 | 61 |
| Time Reference selection: MTC | 82 | 49 |
| Time Reference selection: LTC with TACH & DIR | 82 | 50 |
| Time Reference selection: LTC | 82 | 51 |
| Time Reference selection: TACH & DIR | 82 | 52 |
| Generate SMPTE | 78 | 56 |
| Stop SMPTE | 79 | 56 |
| Arm Track n | 83 | 36+n |
| Disarm Track n | 84 | 36+n |
Gap between SHIFT note-on and NORMAL note-on: 20ms (adjustable in server.js GAP_MS)
- Track arm note numbers from MTC-1 manual shift table (Track 1 = note 37, Track 8 = note 44)
- System Reset (0xFF) — MTC-1 MIDI IN LED does not flash for this message, this is normal
- MMC uses old Fostex format, device ID 127
- "Time Ref: TACH" being the sensible "undo" state — it switches the MTC-1 back to reading the tape's own tach/direction signals rather than incoming MTC, which is the natural non-sync mode.