Skip to main content

Comprehensive MIDI 1.0 and 2.0 constant definitions for Python.

Project description

PyMidiDefs

Comprehensive MIDI 1.0 and 2.0 constant definitions for Python.

A zero-dependency reference library providing named constants, lookup dictionaries, and utility functions for the MIDI specification. Covers note numbers, Control Change assignments, General MIDI instruments and percussion, status bytes, Standard MIDI File meta-events, MIDI 2.0 Universal MIDI Packet (UMP) message types, and MIDI-CI capability inquiry constants.

Why PyMidiDefs?

If you're building a Python synthesiser, sequencer, DAW, MIDI controller interface, music generator, or any application that sends or receives MIDI messages, you need the same set of protocol constants: note numbers, CC assignments, program change values, status bytes. These numbers are defined by the MIDI specification and never change, yet most projects end up re-defining them from scratch or copying them from unreliable sources.

PyMidiDefs gives you a single, authoritative package with every constant sourced directly from the official MIDI specifications. It has no runtime dependencies and works with any MIDI library or framework -- python-rtmidi, mido, pygame.midi, or your own socket-level implementation.

About MIDI

MIDI (Musical Instrument Digital Interface) is a technical standard for communication between electronic musical instruments, computers, and audio devices. It was conceived in the early 1980s by Dave Smith of Sequential Circuits and Ikutaro Kakehashi of Roland, who proposed a Universal Synthesizer Interface to allow instruments from different manufacturers to talk to each other. The MIDI 1.0 Detailed Specification was published in August 1983 by the International MIDI Association (now the MIDI Manufacturers Association, MMA) and has remained backwards-compatible ever since.

General MIDI (GM), standardised in 1991, defined a common set of 128 instrument sounds and a percussion key map so that a MIDI file created on one device would sound broadly similar on another. The Standard MIDI File (SMF) format, also formalised in the early 1990s, became the universal way to store and exchange MIDI sequences.

In January 2020, the MIDI Association announced MIDI 2.0 -- the first major update to the protocol in nearly four decades. MIDI 2.0 introduces the Universal MIDI Packet (UMP) format with higher-resolution velocity and controller values, per-note controllers, and bidirectional communication via MIDI-CI (Capability Inquiry) for automatic device configuration, profile negotiation, and property exchange. MIDI 2.0 is a strict superset of MIDI 1.0; all existing MIDI 1.0 definitions remain valid.

Installation

pip install git+https://github.com/simonholliday/PyMidiDefs.git

Modules

Module Description
pymididefs.notes MIDI note numbers (C-1 to G9) and name/number conversion
pymididefs.cc Control Change number assignments (0-127), plus 14-bit pack/unpack helpers
pymididefs.rpn Standard Registered Parameter Numbers (RPN) and the 14-bit parameter conventions shared with NRPN
pymididefs.drums General MIDI Level 1 percussion key map
pymididefs.gm General MIDI Level 1 instrument program numbers and families
pymididefs.status MIDI 1.0 status bytes (channel voice, system common, system real-time)
pymididefs.meta Standard MIDI File meta-event type bytes
pymididefs.ump MIDI 2.0 Universal MIDI Packet message types and constants
pymididefs.ci MIDI 2.0 Capability Inquiry (MIDI-CI) constants

Usage

import pymididefs.notes
import pymididefs.cc
import pymididefs.drums
import pymididefs.gm

# Note constants
pymididefs.notes.C4    # 60  (Middle C)
pymididefs.notes.A4    # 69  (Concert pitch)

# Note name conversion
pymididefs.notes.note_to_name(60)     # "C4"
pymididefs.notes.name_to_note("Db4")  # 61

# Control Change numbers
pymididefs.cc.SUSTAIN_PEDAL    # 64
pymididefs.cc.FILTER_CUTOFF    # 74
pymididefs.cc.CC_MAP["pan"]    # 10

# GM percussion
pymididefs.drums.KICK_1              # 36
pymididefs.drums.HI_HAT_CLOSED       # 42
pymididefs.drums.GM_DRUM_MAP["snare_1"]  # 38
pymididefs.drums.KICK                # 36  (unnumbered "primary" alias of KICK_1)
pymididefs.drums.GM_DRUM_PRIMARY_ALIASES["crash"]  # 49

# GM instruments
pymididefs.gm.ACOUSTIC_GRAND_PIANO   # 0
pymididefs.gm.VIOLIN                 # 40
pymididefs.gm.GM_INSTRUMENT_NAMES[40]    # "Violin"
pymididefs.gm.GM_INSTRUMENT_MAP["flute"]  # 73

RPN and 14-bit values

import pymididefs.rpn
import pymididefs.cc

# Standard Registered Parameter Numbers
pymididefs.rpn.PITCH_BEND_SENSITIVITY  # 0
pymididefs.rpn.MODULATION_DEPTH_RANGE  # 5  (added in GM2)
pymididefs.rpn.NULL_PARAMETER          # 16383  (sent as MSB=127, LSB=127)

# 14-bit pack/unpack — works for any MIDI 1.0 14-bit value
# (Bank Select, Data Entry, RPN/NRPN parameter numbers, pitch bend, ...)
pymididefs.cc.pack_14bit(8192)         # (64, 0)   pitch bend centre
pymididefs.cc.unpack_14bit(64, 0)      # 8192

MIDI 2.0

import pymididefs.ump
import pymididefs.ci

# Universal MIDI Packet message types
pymididefs.ump.MIDI2_CHANNEL_VOICE  # 0x4
pymididefs.ump.NOTE_ON              # 0x9
pymididefs.ump.PROTOCOL_MIDI2       # 0x02

# MIDI-CI
pymididefs.ci.DISCOVERY       # 0x70
pymididefs.ci.PROFILE_INQUIRY # 0x20

Sources

All definitions are sourced from the official MIDI specifications published by the MIDI Association:

Some specifications require a free MIDI Association membership to download.

License

MIT -- you are free to use, copy, modify, merge, publish, distribute, sublicense, and sell copies of this software in any project, including commercial and closed-source applications. The only requirement is that you include the LICENSE file when redistributing the software. See LICENSE for the full text.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pymididefs-0.2.4.tar.gz (31.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pymididefs-0.2.4-py3-none-any.whl (28.0 kB view details)

Uploaded Python 3

File details

Details for the file pymididefs-0.2.4.tar.gz.

File metadata

  • Download URL: pymididefs-0.2.4.tar.gz
  • Upload date:
  • Size: 31.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pymididefs-0.2.4.tar.gz
Algorithm Hash digest
SHA256 a3f7bf426cf3e76a91c7c1b13cc1840d1eda9fbf013bd966445735962d4613b5
MD5 70fb1d92c6f6ce1a5e06a2170339923e
BLAKE2b-256 7d403e3717ccb40e230025c91a271bf2a4bf29e9eed225715a91881077dc1104

See more details on using hashes here.

Provenance

The following attestation bundles were made for pymididefs-0.2.4.tar.gz:

Publisher: publish.yml on simonholliday/PyMidiDefs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pymididefs-0.2.4-py3-none-any.whl.

File metadata

  • Download URL: pymididefs-0.2.4-py3-none-any.whl
  • Upload date:
  • Size: 28.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for pymididefs-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 785bf3e54035ad63184e9aa57285567f16c0803a7bda3f914d43981f50cd382d
MD5 7972d0bf6814c63beb546a2252cd5365
BLAKE2b-256 9af3f8eb5c98c4509791af892b3ee96bcc487bfedadff586175e9ccaf014a8d1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pymididefs-0.2.4-py3-none-any.whl:

Publisher: publish.yml on simonholliday/PyMidiDefs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page