使用 Python Mido 库选择 GM MIDI Level 2 乐器

Posted

技术标签:

【中文标题】使用 Python Mido 库选择 GM MIDI Level 2 乐器【英文标题】:Select GM MIDI Level 2 instruments using the Python Mido library 【发布时间】:2020-04-08 12:13:55 【问题描述】:

我正在使用 Python Mido 库来创建 MIDI 文件。我已经想出要改变 乐器您将program_change 消息添加到轨道 给定频道:

from mido import Message, MidiFile, MidiTrack
track = MidiTrack()
...
track.append(Message('program_change', program = 36,
                     time = 1234, channel = 0)

这可行,但我只能访问 GM MIDI Level 1 乐器。一世 想要访问 GM MIDI Level 2 仪器也是。

请使用代码告诉我如何做到这一点。所有 MIDI 文档 我通过谷歌搜索发现非常令人困惑。

【问题讨论】:

【参考方案1】:

GM 2 specification 说:

3.2 程序变更消息

[…] 设置指定通道的音色。

当 Channel 是 Melody Channel 时,音色从 Bank Select 指定的 Bank 中选择(使用 Bank Select 79H/xxH,Bank 79H/00H 对应 GM1 声音集)。 […]

3.3.1 银行选择 (cc#0/32)

Bank Select 为指定通道选择所需的 Bank。列出的第一个字节是 MSB,在 cc#0 上传输。列出的第二个字节是 LSB,在 cc#32 上传输。组列在 GM2 声音集表(附录 A)中。 Bank Select 79H/00H 对应于 GM1 Sound Set。[…]

在收到后续的 Program Change 消息之前,Bank Select 消息不会影响声音的任何变化。

因此,要访问其他乐器,您必须在发送程序更改消息之前选择不同的银行。 例如,选择“气泡”:

track.append(Message('control_change', control =  0, value = 0x79, channel = 0, time = 1233))
track.append(Message('control_change', control = 32, value = 0x05, channel = 0, time = 1233))
track.append(Message('program_change', program = 0x7a,             channel = 0, time = 1234))

【讨论】:

以上是关于使用 Python Mido 库选择 GM MIDI Level 2 乐器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 QFileDialog 打开带有 .mid 后缀的文件

在 Python MIDI MIDO 读取/保存文件中转换时间/刻度

在 Mac 上从 Python Mido 库输出 MIDI 声音

如何在 mido 中从 Message 中获取 note 属性?

如何将MIDO下的ticks_per_beat设置为一个新的MIDI文件?

用Python代码写首《本草纲目》