В этом руководстве представлен протокол MIDI (Musical Instrument Digital Interface) и как можно использовать Audio Toolbox™ для взаимодействия с устройствами MIDI. Описанные здесь инструменты позволяют вам отправлять и получать все сообщения MIDI, как описано в протоколе MIDI. Если вы заинтересованы только в отправке и получении сообщений Control Change с поверхностью управления MIDI, см. MIDI Control Surface Interface. Если вы заинтересованы в использовании MIDI для управления аудиоплагинами, смотрите MIDI Control for Audio Plugins. Чтобы узнать больше о MIDI в целом, обратитесь в Ассоциацию производителей MIDI.
MIDI является техническим стандартом для связи между электронными приборами, компьютерами и соответствующими устройствами. MIDI содержит сообщения о событиях, характерные для аудиосигналов, таких как тангаж и скорость, а также сигналы управления для параметров и синхросигналы для синхронизации темпа.
MIDI device - это любое устройство, способное отправлять или получать сообщения MIDI. Устройства MIDI имеют входные порты, выходные порты или оба. Протокол MIDI определяет сообщения как однонаправленные. Устройство MIDI может быть реальным или виртуальным.
Audio Toolbox позволяет вам создать интерфейс к устройству MIDI с помощью mididevice
. Чтобы создать интерфейс MIDI для определенного устройства, используйте mididevinfo
запросить у системы доступные устройства. Затем создайте mididevice
объект путем указания устройства MIDI по имени или идентификатору.
mididevinfo
MIDI devices available: ID Direction Interface Name 0 output MMSystem 'Microsoft MIDI Mapper' 1 input MMSystem 'USB MIDI Interface ' 2 output MMSystem 'Microsoft GS Wavetable Synth' 3 output MMSystem 'USB MIDI Interface '
device = mididevice('USB MIDI Interface ')
device = mididevice connected to Input: 'USB MIDI Interface ' (1) Output: 'USB MIDI Interface ' (3)
Можно задать mididevice
объект для прослушивания входных сообщений, отправки выходных сообщений или обоих. В этом примере mididevice
объект получает сообщения MIDI на вход порт с именем 'USB MIDI Interface '
и отправляет сообщения MIDI от выхода порта с именем 'USB MIDI Interface '
.
MIDI message содержит информацию, которая описывает действие, связанное со звуком. Например, при нажатии клавиши на клавиатуре соответствующее сообщение MIDI содержит 3 байта:
Первый байт описывает вид действия и канал. Первый байт упоминается как Status Byte.
Второй байт описывает, какая клавиша нажата. Второй байт упоминается как Data Byte.
Третий байт описывает, как тяжело воспроизводится ключ. Третий байт также является байтом данных.
Это сообщение является Note On сообщением. Примечание On называется именем, командой или типом сообщения.
В MATLAB®, MIDI-сообщение упаковывается как midimsg
объект и может быть манипулирован как скаляры или массивы. Чтобы создать сообщение MIDI, позвоните midimsg
с типом сообщения, а затем укажите необходимые параметры для определенного типа сообщения. Для примера, чтобы создать заметку к сообщению, задайте midimsg
Type
как 'NoteOn'
и затем укажите необходимые входы: канал, примечание и скорость.
channel = 1;
note = 60;
velocity = 64;
msg = midimsg('NoteOn',channel,note,velocity)
msg = MIDI message: NoteOn Channel: 1 Note: 60 Velocity: 64 Timestamp: 0 [ 90 3C 40 ]
Для удобства, midimsg
отображает тип сообщения, канал, дополнительные параметры, временную метку и построенное сообщение в шестнадцатеричной форме. Шестнадцатеричная форма является предпочтительной, поскольку она имеет прямую интерпретацию:
Для отправки и приема сообщений MIDI используйте mididevice
функции объекта midisend
и midireceive
. Когда вы создаете mididevice
объект начинает принимать данные на своем входе и помещать их в буфер.
Чтобы извлечь сообщения MIDI из буфера, вызовите midireceive
.
receivedMessages = midireceive(device)
receivedMessages = MIDI message: NoteOn Channel: 1 Note: 36 Velocity: 64 Timestamp: 15861.9 [ 90 24 40 ] NoteOn Channel: 1 Note: 36 Velocity: 0 Timestamp: 15862.1 [ 90 24 00 ]
midimsg
объекты. В этом примере нажата клавиатура MIDI.Чтобы отправить сообщения MIDI на устройство MIDI, вызовите midisend
.
midisend(device,msg)
Тип создаваемого сообщения MIDI определяется как вектор символов или строка. Чтобы создать MIDI-сообщение, задайте его по типу и необходимым значениям свойств. Для примера создайте сообщение Channel Давления MIDI путем ввода следующего в командной строке:
channelPressureMessage = midimsg('ChannelPressure',1,20)
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 20 Timestamp: 0 [ D0 14 ]
channelPressureMessage.ChannelPressure = 37
channelPressureMessage = MIDI message: ChannelPressure Channel: 1 ChannelPressure: 37 Timestamp: 0 [ D0 25 ]
В таблице представлены допустимые типы сообщений MIDI.
Audio Toolbox обеспечивает синтаксис удобства для создания нескольких сообщений MIDI, используемых последовательно, и для создания массивов сообщений MIDI. См. midimsg
полный список синтаксисов.
Протокол MIDI не определяет время сообщения и принимает, что сообщения действуют немедленно. Многим приложениям требуется время выполнения для постановки в очередь и пакетной обработки. Для удобства Audio Toolbox упаковывает время выполнения с сообщениями MIDI в одну midimsg
объект. Все midimsg
объекты имеют Timestamp
свойство, которое устанавливается во время создания как необязательный последний аргумент или после создания. Значение по умолчанию Timestamp
равен нулю.
Толкование Timestamp
свойство зависит от того, как создается и используется MIDI-сообщение:
При получении сообщений MIDI с помощью midireceive
базовая инфраструктура присваивает временную метку при получении сообщений MIDI. Концептуально синхроимпульс начинается когда a mididevice
создается и присоединяется в качестве прослушивателя к данному входному порту MIDI. Если другой mididevice
присоединен к тому же входному порту, он получает временные метки от того же синхроимпульса, что и первый объект.
При отправке сообщений MIDI с помощью midisend
временные метки интерпретируются как время отправки сообщения.
Если недавних вызовов не было midisend
, затем midisend
интерпретирует временные метки как относительные к текущему реальному времени. Сообщение с нулевой временной меткой немедленно отправляется. Если был недавний вызов на midisend
, затем midisend
интерпретирует временные метки как относительные к самой большой временной метке последнего вызова, midisend
. Часы временной метки для midisend
характерен для выходного порта MIDI, который mididevice
соединяется с.
Рассмотрим пару сообщений MIDI, которые включают и отключают заметку. Сообщения указывают, что заметка начинается через одну секунду и сохраняется в течение одной секунды.
Создание сообщений Note On и Note Off.
OnMsg = midimsg('NoteOn',1,59,64); OffMsg = midimsg('NoteOn',1,59,0);
Отправка и отключение сообщений с помощью одного вызова midisend
, задайте временные метки сообщений относительно того же времени запуска.
OnMsg.Timestamp = 1; OffMsg.Timestamp = 2; midisend(device,[OnMsg;OffMsg]))
Чтобы отправить сообщение Note Off отдельно, задайте временную метку сообщения Note Off относительно самой большой временной метки предыдущего вызова midisend
.
OnMsg.Timestamp = 1; OffMsg.Timestamp = 1; midisend(device,OnMsg) midisend(device,OffMsg)
«Стартовое» время, или ссылочное время, для midisend
является максимумом между абсолютным временем и самой большой временной меткой в последнем вызове midisend
. Например, примите во внимание, что x, произвольное время начала, равно текущему абсолютному времени. Если существует 1,5-секундная пауза между отправкой примечания и отключением сообщений, полученная длительность примечания составляет 1,5 секунды.
OnMsg.Timestamp = 1; OffMsg.Timestamp = 1; midisend(device,OnMsg) pause(1.5) midisend(device,OffMsg)
Обычно сообщения MIDI отправляются быстрее, чем в режиме реального времени, поэтому нет необходимости отслеживать абсолютное время.
Для живых выступлений или включения прерываний в потоке MIDI можно установить временные метки равными нулю, а затем вызвать midisend
в соответствующих интервалах времени в реальном мире. В зависимости от вашего случая использования, можно разделить поток MIDI на небольшие повторяемые фрагменты времени.