thestk/rtmidi

A set of C++ classes that provide a common API for realtime MIDI input/output across Linux (ALSA & JACK), Macintosh OS X (CoreMIDI) and Windows (Multimedia)

C++

1,211

540 commits

updated Oct 11, 2026

See the code

README

RtMidi

Build Status Conan Center

A set of C++ classes that provide a common API for realtime MIDI input/output across Linux (ALSA & JACK), Macintosh OS X (CoreMIDI & JACK), Windows (Multimedia Library & UWP), Web MIDI, iOS and Android.

By Gary P. Scavone, 2003-2023.

This distribution of RtMidi contains the following:

On Unix systems, run ./configure and then make in the top level directory. This builds both the library and the test programs in tests/. For installation and building on Windows, refer to WINDOWS.md.

If you checked out the code from git, please run ./autogen.sh before ./configure.

./configure --help lists the available MIDI API options (--with-alsa, --with-jack, --with-core, --with-winmm); by default those appropriate to the system are selected. RtMidi can also be built with CMake.

On Linux, ALSA support needs its development files (libasound2-dev on Debian and Ubuntu, alsa-lib-devel on Fedora); without them both ./configure and CMake build without ALSA, and ./configure may find no MIDI API if no other backend is available.

Android support uses the AMidi API and must be built with CMake. See android/README.md.

Overview

RtMidi is a set of C++ classes (RtMidiIn, RtMidiOut, and API specific classes) that provide a common API (Application Programming Interface) for realtime MIDI input/output across Linux (ALSA, JACK), Macintosh OS X (CoreMIDI, JACK), and Windows (Multimedia Library) operating systems. RtMidi significantly simplifies the process of interacting with computer MIDI hardware and software. It was designed with the following goals:

  • object oriented C++ design
  • simple, common API across all supported platforms
  • only one header and one source file for easy inclusion in programming projects
  • MIDI device enumeration

MIDI input and output functionality are separated into two classes, RtMidiIn and RtMidiOut. Each class instance supports only a single MIDI connection. RtMidi does not provide timing functionality (i.e., output messages are sent immediately). Input messages are timestamped with delta times in seconds (via a double floating point type). MIDI data is passed to the user as raw bytes using an std::vector<unsigned char>.

RtMidi is also offered as a module, which is enabled with RTMIDI_BUILD_MODULES, and is accessed with import rt.midi;. Namespaces are implicitly imported (unless disabled with RTMIDI_USE_NAMESPACE), so classes can be accessed through namespace rt::midi or through the global namespace (for example, rt::midi::MidiApi and ::MidiApi are both valid).

Windows

In some cases, for example to use RtMidi with GS Synth, it may be necessary for your program to call CoInitializeEx and CoUninitialize on entry to and exit from the thread that uses RtMidi.

Further reading

For complete documentation on RtMidi, see the doc directory of the distribution or surf to https://caml.music.mcgill.ca/~gary/rtmidi/.

The RtMidi license is similar to the MIT License, with the added feature that modifications be sent to the developer. Please see LICENSE.

thestk/rtmidi

A set of C++ classes that provide a common API for realtime MIDI input/output across Linux (ALSA & JACK), Macintosh OS X (CoreMIDI) and Windows (Multimedia)

C++

1,211

540 commits

updated Oct 11, 2026

See the code

README

RtMidi

Build Status Conan Center

A set of C++ classes that provide a common API for realtime MIDI input/output across Linux (ALSA & JACK), Macintosh OS X (CoreMIDI & JACK), Windows (Multimedia Library & UWP), Web MIDI, iOS and Android.

By Gary P. Scavone, 2003-2023.

This distribution of RtMidi contains the following:

On Unix systems, run ./configure and then make in the top level directory. This builds both the library and the test programs in tests/. For installation and building on Windows, refer to WINDOWS.md.

If you checked out the code from git, please run ./autogen.sh before ./configure.

./configure --help lists the available MIDI API options (--with-alsa, --with-jack, --with-core, --with-winmm); by default those appropriate to the system are selected. RtMidi can also be built with CMake.

On Linux, ALSA support needs its development files (libasound2-dev on Debian and Ubuntu, alsa-lib-devel on Fedora); without them both ./configure and CMake build without ALSA, and ./configure may find no MIDI API if no other backend is available.

Android support uses the AMidi API and must be built with CMake. See android/README.md.

Overview

RtMidi is a set of C++ classes (RtMidiIn, RtMidiOut, and API specific classes) that provide a common API (Application Programming Interface) for realtime MIDI input/output across Linux (ALSA, JACK), Macintosh OS X (CoreMIDI, JACK), and Windows (Multimedia Library) operating systems. RtMidi significantly simplifies the process of interacting with computer MIDI hardware and software. It was designed with the following goals:

  • object oriented C++ design
  • simple, common API across all supported platforms
  • only one header and one source file for easy inclusion in programming projects
  • MIDI device enumeration

MIDI input and output functionality are separated into two classes, RtMidiIn and RtMidiOut. Each class instance supports only a single MIDI connection. RtMidi does not provide timing functionality (i.e., output messages are sent immediately). Input messages are timestamped with delta times in seconds (via a double floating point type). MIDI data is passed to the user as raw bytes using an std::vector<unsigned char>.

RtMidi is also offered as a module, which is enabled with RTMIDI_BUILD_MODULES, and is accessed with import rt.midi;. Namespaces are implicitly imported (unless disabled with RTMIDI_USE_NAMESPACE), so classes can be accessed through namespace rt::midi or through the global namespace (for example, rt::midi::MidiApi and ::MidiApi are both valid).

Windows

In some cases, for example to use RtMidi with GS Synth, it may be necessary for your program to call CoInitializeEx and CoUninitialize on entry to and exit from the thread that uses RtMidi.

Further reading

For complete documentation on RtMidi, see the doc directory of the distribution or surf to https://caml.music.mcgill.ca/~gary/rtmidi/.

The RtMidi license is similar to the MIT License, with the added feature that modifications be sent to the developer. Please see LICENSE.

Project health

Overall

3.6/10

Maintained

10/10

Code review

2/10
OpenSSF Scorecard

Significant stargazers

Hugo Hromic

56 followers · starred Jan 2014

Alexandre Bique

312 followers · starred Nov 2021

Ezekiel Warren

49 followers · starred Jul 2026

Ayu

216 followers · starred Jul 2019