1

我正在使用 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 文档都令人难以置信的混乱。

4

1 回答 1

2

GM 2 规范说:

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))
于 2020-04-08T13:58:31.553 回答