Python wrapper for RtMidi written in Cython. Allows sending raw messages, multi-port input and sending multiple messages in one call.


Keywords
computer-music, creative-coding, midi, midi-instrument, realtime
License
MIT
Install
pip install rtmidi2==1.3.0

Documentation

rtmidi2

sh-downloads

Python wrapper for RtMidi, the lightweight, cross-platform MIDI I/O library. For Linux, Mac OS X and Windows.

Based on rtmidi-python

Installation

pip install rtmidi2

This module is compatible with Python 3 >= 3.7

Documentation

https://rtmidi2.readthedocs.io


Usage Examples

rtmidi2 uses a very similar API as RtMidi

Print all in and out ports

import rtmidi2
print(rtmidi2.get_in_ports())
print(rtmidi2.get_out_ports())

Send messages

import rtmidi2

midi_out = rtmidi2.MidiOut()
# open the first available port
midi_out.open_port(0)
# send C3 with vel. 100 on channel 1
midi_out.send_noteon(0, 48, 100)

Get incoming messages - blocking interface

import time
midi_in = rtmidi.MidiIn()
midi_in.open_port(0)

while True:
    message = midi_in.get_message()
    if message:
        print(message, delta_time)
    else:
        time.sleep(0.01)

Get incoming messages using a callback -- non blocking

def callback(message, time_stamp):
    print(message, time_stamp)

midi_in = rtmidi2.MidiIn()
midi_in.callback = callback
midi_in.open_port(0)

Open multiple ports at once

# get messages from all available ports
midi_in = MidiInMulti()
midi_in.open_ports("*")

def callback(msg, timestamp):
    msgtype, channel = splitchannel(msg[0])
    print(msgtype2str(msgtype), msg[1], msg[2])

midi_in.callback = callback

You can also get the device which generated the event by changing your callback to:

def callback(src, msg, timestamp):
    # src will hold the name of the device
    print("got message from", src)

Send multiple notes at once

# send a cluster of ALL notes with a duration of 1 second
midi_out = MidiOut()
midi_out.open_port()
notes = range(127)
velocities = [90] * len(notes)
midi_out.send_noteon_many(0, notes, velocities)
time.sleep(1)
midi_out.send_noteon_many(0, notes, [0] * len(notes))

License

rtmidi2 is licensed under the MIT License, see LICENSE.

It uses RtMidi, licensed under a modified MIT License, see RtMidi/RtMidi.h.