Выберите инструменты GM MIDI уровня 2 с помощью библиотеки Python Mido

Я использую библиотеку 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 уровня 1. Я также хочу получить доступ к инструментам GM MIDI уровня 2.

Пожалуйста, покажите мне с помощью кода, как это сделать. Вся документация по MIDI, которую я нашел в Google, невероятно сбивает с толку.

1 ответ

Решение

Спецификация GM 2 гласит:

3.2 Сообщение об изменении программы

[…]
Устанавливает тембр для указанного канала.

Если канал является каналом мелодии, тембр выбирается из банка, заданного параметром выбора банка (с помощью выбора банка 79H/xxH, с банком 79H/00H, соответствующим набору звука GM1). […]

3.3.1 Выбор банка (cC#0/32)

Выбор банка выбирает желаемый банк для указанного канала. Первым перечисленным байтом является старший бит, передаваемый на cC#0. Второй байт в списке - это LSB, передаваемый на cC#32. Банки перечислены в таблице набора звуков GM2 (Приложение A). Выбор банка 79H/00H соответствует звуковому набору GM1. […]

Сообщение выбора банка не влияет на изменение звука до тех пор, пока не будет получено последующее сообщение об изменении программы.

Таким образом, чтобы получить доступ к другим инструментам, вы должны выбрать другой банк перед отправкой сообщения об изменении программы. Например, чтобы выбрать "Пузырь":

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))
Другие вопросы по тегам