Выберите инструменты GM MIDI Level 2 с помощью библиотеки Python Mido - PullRequest
0 голосов
/ 08 апреля 2020

Я использую библиотеку 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 Ответ

1 голос
/ 08 апреля 2020

В спецификации GM 2 указано:

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

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

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

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

Выбор банка выбирает нужный банк для указанного канала. Первый перечисленный байт - это MSB, передаваемый по cc # 0. Второй перечисленный байт - младший бит, переданный на CC # 32. Банки перечислены в таблице GM2 Sound Set (Приложение 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))
...