Utilizing Python Libraries for Advanced MIDI Message Manipulation


MIDI (Musical Instrument Digital Interface) has been a crucial technology in the music industry for decades. It allows musicians, producers, and enthusiasts to connect and control various musical devices, such as synthesizers, drum machines, and sequencers. Python, a versatile programming language, offers a range of powerful libraries that enable advanced MIDI message manipulation. In this article, we will explore some important concepts and demonstrate how Python libraries can be used to enhance MIDI workflows.

MIDI Basics: Main Message Types

Before diving into the world of Python libraries, let’s briefly review some fundamental concepts of MIDI. MIDI messages are used to transmit information between devices. These messages can be categorized into four major types:

1. Channel Voice Messages

Channel Voice Messages are used to convey musical performance data on one of the 16 available MIDI channels. They represent the essential commands that control the playback of notes and their characteristics:

  • Note On: Signals when a key is pressed or a note is started, specifying the pitch and velocity.
  • Note Off: Signals when a key is released or a note ends, with pitch and velocity information.
  • Polyphonic Key Pressure (Aftertouch): Indicates pressure or aftertouch data on a specific note.
  • Control Change: Transmits information from controllers, like knobs or faders.
  • Program Change: Specifies a change in instrument or sound patch.
  • Channel Pressure (Aftertouch): Sends aftertouch data for all notes on a specific channel.
  • Pitch Bend: Adjusts the pitch of notes on a specific channel.

2. Channel Mode Messages

Channel Mode Messages are a subset of Control Change messages that affect a channel’s mode of operation:

  • All Sound Off: Immediately stops all sound on a channel.
  • Reset All Controllers: Returns all controllers to their default values.
  • Local Control: Determines if a device’s keyboard controls its internal sounds.
  • All Notes Off: Turns off all notes on a specified channel.
  • Omni Mode On/Off: Determines device responsiveness to all channels or just one.
  • Mono Mode (Poly Off): Puts the device in monophonic mode.
  • Poly Mode (Mono Off): Puts the device in polyphonic mode.

3. System Common Messages

System Common Messages are non-channel-specific messages serving various functions:

  • MIDI Time Code Quarter Frame: Part of the MIDI Time Code protocol.
  • Song Position Pointer: Indicates a position in a sequence of beats.
  • Song Select: Chooses a specific song or sequence number.
  • Tune Request: Asks analog synthesizers to retune.
  • System Exclusive (SysEx): device-specific and/or manufacturer-specific messages.

4. System Real-Time Messages

System Real-Time Messages are used for real-time control and synchronization:

  • Timing Clock: Provides regular timing pulses.
  • Start: Initiates playback of a sequence from the beginning.
  • Continue: Resumes playback from where it was stopped.
  • Stop: Halts playback of a sequence.
  • Active Sensing: A keep-alive message to ensure connection validity.
  • System Reset: Resets all connected MIDI devices.

Python Libraries for MIDI Manipulation

Python provides several libraries that simplify MIDI message manipulation. Let’s explore some of the most popular ones:

Python has several libraries for working with MIDI, allowing for tasks ranging from reading and writing MIDI files to interacting with MIDI hardware. Some of the major MIDI libraries for advanced MIDI message manipulation include:

mido (MIDI Objects)

Mido is a versatile library that can work with MIDI messages and ports.

  • Description: A backend-agnostic library suitable for MIDI message creation, parsing, and MIDI port communication.
  • Features:
    • Parsing and creating MIDI messages
    • MIDI port communication
    • Interoperability with various MIDI libraries/tools
  • Website: Mido on Github


Provides real-time MIDI input and output by binding to the RtMidi C++ library.

  • Description: Enables real-time MIDI I/O functionalities.
  • Features:
    • MIDI input/output
    • Callback-based message handling
    • Support for virtual ports
  • Website: python-rtmidi on Github


Designed for music informatics tasks, pretty_midi facilitates the analysis and creation of complex MIDI files.

  • Description: Ideal for MIDI file manipulation and music analysis tasks.
  • Features:
    • MIDI file manipulation
    • Transcription and synthesis
    • Instrument assignment
  • Website: pretty_midi on GitHub


MIDIUtil is tailored for those looking to manipulate and create MIDI files.

  • Description: Suitable for creating and manipulating MIDI files from scratch.
  • Features:
    • MIDI composition
    • Note and chord manipulation
    • Support for various MIDI events
  • Website: MIDIUtil on Github


As part of the pygame module, pygame.midi offers functionalities to work with MIDI I/O and interfaces with MIDI devices.

  • Description: Provides MIDI input/output functions and is integrated with the larger pygame multimedia ecosystem.
  • Features:
    • MIDI I/O
    • Interfacing with MIDI devices
  • Website: Pygame on Github


This backend allows Mido to utilize the capabilities of python-rtmidi for real-time MIDI communication.

  • Description: Acts as a bridge between Mido and python-rtmidi for MIDI port communication.
  • Features:
    • Integrates Mido’s functionalities with real-time MIDI communication abilities of python-rtmidi.

The best library largely depends on the specific needs of your project. For MIDI file manipulation, libraries like pretty_midi or MIDIUtil might be more appropriate. For real-time MIDI device communication, python-rtmidi or mido with the rtmidi backend might be better choices.

Advanced MIDI Manipulation Techniques

Now that we have explored some essential Python libraries for MIDI manipulation, let’s delve into advanced techniques that can be achieved using these libraries.

Sure, here’s a restructured presentation of advanced MIDI manipulation techniques, highlighting the libraries best suited for each technique:

MIDI Filtering:

  • This technique involves filtering out or processing specific MIDI messages. For instance, you could choose to ignore all Note Off messages or focus only on specific Control Change messages.
  • Suited Libraries: Mido (especially for real-time filtering).

Real-Time Message Transformation:

  • Modify MIDI messages as they come in, such as altering the velocity of all Note On messages or remapping one type of control change to another.
  • Suited Libraries: Mido, python-rtmidi.

MIDI Routing:

  • Send MIDI messages from one source to multiple destinations. This is especially useful in setups where MIDI messages from one device need to be distributed to several other devices.
  • Suited Libraries: Mido.

Direct Device Communication:

  • Engage in real-time communication with MIDI hardware. This is pivotal for those developing custom MIDI controllers or instruments.
  • Suited Libraries: python-rtmidi.

Virtual MIDI Ports:

  • Establish virtual MIDI ports for interaction with other software. These ports act like MIDI devices and can be accessed by DAWs or other MIDI software.
  • Suited Libraries: python-rtmidi.

Instrument Manipulation:

  • Modify instruments within a MIDI file. For instance, one can create variations of a track or isolate instruments for specialized processing.
  • Suited Libraries: pretty_midi.

MIDI Composition:

  • Compose intricate MIDI tunes by defining note sequences, chords, and other musical elements from scratch.
  • Suited Libraries: MIDIUtil.

Dynamic Modulation:

  • Programmatically introduce modulations like pitch shifts or vibratos to enhance MIDI sequences.
  • Suited Libraries: MIDIUtil.

Interactive MIDI Applications:

  • Fuse MIDI functions with graphical components to curate interactive MIDI applications or even MIDI-based games.
  • Suited Libraries: pygame.midi.

Multi-modal Interactions:

  • Employ MIDI data to control other facets of multimedia tools, such as graphics or in-game mechanisms.
  • Suited Libraries: pygame.midi.

Backend Switching and Cross-Platform Port Management:

  • Description: Transition between different MIDI backends without hassles and maintain MIDI ports seamlessly across various platforms.
  • Suited Libraries: mido.backends.rtmidi.


In this article we took a look at the four main MIDI message types. Next, we looked at several Python libraries that handle MIDI, like Mido and python-rtmidi. These tools offer different functions for working with MIDI, from basic tasks to more involved processes. We also described some advanced methods for using MIDI messages. In sum, this information gives a clear picture of MIDI’s capabilities in Python.

Similar Posts