Mido:用 Python 处理 MIDI,这一套就够了
Mido:用 Python 处理 MIDI,这一套就够了
Mido 是一个 Python MIDI 库,在 GitHub 上收获了 1600+ Star。它的定位很明确,让你在 Python 里和 MIDI 打交道时,不用关心底层细节。
用过 MIDI 的人都知道,这协议活了 40 多年,生态复杂。不同系统、不同硬件、不同格式,坑不少。Mido 把这些全封装了。它提供了一套统一的对象模型和端口 API,无论你接的是什么硬件,写法都一样。

从消息到文件,一条线打通
Mido 的核心是 Message 对象。创建一条 note_on 消息,设置音符、力度、通道,发出去,几行代码搞定。
>>> import mido
>>> msg = mido.Message('note_on', note=60)
>>> msg.type
'note_on'
>>> msg.note
60
>>> msg.bytes()
[144, 60, 64]
消息对象支持 copy,可以基于一条消息快速生成变体,改个通道或力度就行。
如果想读键盘输入:
with mido.open_input() as inport:
for msg in inport:
print(msg)
MIDI 文件也一样。读一个 .mid 文件、遍历每条消息、修改后写回去,全程不用碰底层字节。用 play 方法还能把文件内容实时发送到输出端口。Mido 支持全部 18 种标准 MIDI 消息,常见 meta 消息也都覆盖了。SYX 文件读写也支持,二进制和纯文本格式都行。
项目内置了一个可复用的 MIDI 流解析器。如果你自己写了一个 MIDI 硬件,可以直接用 Mido 的 parser 处理原始数据流,不用从头解析字节。
后端可切换
Mido 把后端和接口拆开了。RtMidi、PortMidi、Pygame,不管底层用哪个驱动,上层的 port API 完全一致。想换驱动,改个参数就行。写新后端也不难,继承基类重写几个方法就能跑起来。
这意味着你可以在 Windows 上写代码,部署到 Linux 或 macOS 上,不用改业务逻辑。open_input 和 open_output 用法统一,读什么设备都一样。
port = mido.open_output('Port Name')
port.send(msg)

网络 MIDI 和实用工具
Mido 实现了 TCP/IP 上的 MIDI 传输。两台电脑可以通过网络传 MIDI 消息,不用连 5 针 MIDI 线。这功能标了 experimental,但在局域网里实际可用。
项目还附带几个命令行工具。播放 MIDI 文件直接跑,列出可用端口一眼看清,网络端口转发也配好了。日常调试够用。
安装
python3 -m pip install mido
需要硬件端口支持的话,装带 rtmidi 的版本:
python3 -m pip install mido[ports-rtmidi]
也可以用 PortMidi 或 Pygame 作为后端,文档里有配置说明。
Python 3.7 以上即可。当前稳定版是 1.3,MIT 协议,语义化版本管理。项目的 Discussion 区挺活跃,有问题可以直接去问。
对于做音乐工具、合成器,或任何需要和 MIDI 打交道的 Python 项目,Mido 是个省心的选择。
n 区挺活跃,有问题可以直接去问。
对于做音乐工具、合成器,或任何需要和 MIDI 打交道的 Python 项目,Mido 是个省心的选择。
更多推荐
所有评论(0)