Skip to content
Zach Radloff edited this page Oct 14, 2026 · 4 revisions

@joue-bien/rtp-midi-transport

A TypeScript library for sending controller MIDI messages over UDP without a driver, in compliance with Apple's RTP implementation.

Install

npm install @joue-bien/rtp-midi-transport

Documentation

Documentation can be found on the projects GitHub Wiki

Further reading

Supported features

This library focuses on MIDI controllers, not real-time music playback. As control is the focus, there are a number of features that have not been fully implemented. Merge requests are welcome if you want to add a feature or fix a missing feature.

Feature Supported Notes
Client side connection handshake and sending Midi messages. ✅ Supported.
Server side connection handshake and sending Midi messages. ✅ Keeping track of connected clients must be implemented on your own.
Sending and receiving midi lists ✅ Supports encoding and decoding multiple midi messages in the midi list section.
System extended Messages ✅ Decodes as a buffer. You will need to encode and decode the System extended header on your own.
Test tools ✅ vitest utilities are supported for easily setting up both the server and client in tests.
Byte timestamps in midi list. ❌ Decoding or encoding the interlaced timestamps in the Midi list is not supported.
Enforcing Apple's MIDI subheader ⚠️ During decoding, the decoder skips checking most of the MIDI message subheader because we assume you are sending compliant messages. Why? The X-Touch doesn't and sets a single flag to the wrong value.
Recovery journal handling. ❌ Not supported, the decoder will skip journal sections. There is no journal encode support.
Setting the running status flag in the header. ⚠️ This flag can't be set in the encoder. It is exposed in the decoder.
Clock offset tracking. ⚠️ Clock exchanges are handled on both the client and server; however, only enough to keep the two devices talking to each other through the clock pulse system. If you need to calculate the difference in time between the server and client, you will need to do that on your own by listening for CK events.
No Bonjour Support. ❌ This library does not implement Apples discovery layer. If you need Bonjour support use bonjour.