This project provides Python interface to ALSA sequencer API.
- Pythonic API to most of the ALSA sequencer functionality
- Access to ALSA sequencer features not available when using other ('portable') Python MIDI libraries:
- Precise timestamping of messages sent and received
- Port connection management, including connection between ports on different clients
- Access to non-MIDI events, like announcements about new clients, ports and connections
- Python 3.7 – 3.11 compatibility
- Both synchronous (blocking) and asynchronous (asyncio) I/O
- Only Python code, no need to compile a binary module. Requires cffi, though.
- MIDO backend provided
This package requires ALSA library to be installed (libasound.so.2
– 'libasound2' package on Debian-like systems). On a typical Linux system it is probably already installed for some other audio or MIDI software.
python-alsa-midi package may be installed with pip:
python3 -m pip install alsa-midi
This should normally install a binary wheel compiled on a compatible system or pure-python wheel working without compilation.
If no compatible wheel is found build from source package will be triggered, which will also require ALSA library development files (libasound2-dev).
To force installing from source (and compiling the binary extension) use:
python3 -m pip install --no-binary=alsa-midi alsa-midi
To force installing from source without compiling the extension:
PY_ALSA_MIDI_NO_COMPILE=1 python3 -m pip install --no-binary=alsa-midi alsa-midi
Alternatively one can just add the source directory (as checked out from https://github.com/Jajcus/python-alsa-midi.git) to $PYTHONPATH and use the packages directly, with no compilation.
Detailed documentation is available at https://python-alsa-midi.readthedocs.io/
Simple example:
import time
from alsa_midi import SequencerClient, READ_PORT, NoteOnEvent, NoteOffEvent
client = SequencerClient("my client")
port = client.create_port("output", caps=READ_PORT)
dest_port = client.list_ports(output=True)[0]
port.connect_to(dest_port)
event1 = NoteOnEvent(note=60, velocity=64, channel=0)
client.event_output(event1)
client.drain_output()
time.sleep(1)
event2 = NoteOffEvent(note=60, channel=0)
client.event_output(event2)
client.drain_output()
python-alsa-midi can be used as a MIDO back-end too:
export MIDO_BACKEND=alsa_midi.MIDO_BACKEND
mido/examples/midifiles/play_midi_file.py file.mid