Этот пример вводит протокол Цифрового интерфейса музыкальных инструментов (MIDI) и как можно использовать Audio Toolbox™, чтобы взаимодействовать с MIDI-устройствами. Инструменты, описанные здесь, позволяют вам отправить и получить все сообщения MIDI, как описано протоколом MIDI. Если вы интересуетесь только отправкой и получением сообщений Изменения Управления с поверхностью управления MIDI, смотрите Интерфейс Поверхности Управления MIDI. Если вы интересуетесь использованием MIDI, чтобы управлять вашими аудио плагинами, смотрите Управление MIDI для Аудио Плагинов. Чтобы узнать больше о MIDI в целом, консультируйтесь с Ассоциацией Производителей MIDI.
MIDI является техническим стандартом для связи между электронными инструментами, компьютерами и связанными устройствами. MIDI несет сообщения о событиях, характерные для звуковых сигналов, таких как подача и скорость, а также управляющие сигналы для параметров и сигналов часов синхронизировать темп.
MIDI device является любым устройством, способным к отправке или получению сообщений MIDI. MIDI-устройства имеют входные порты, выходные порты или обоих. Протокол MIDI задает сообщения как однонаправленные. MIDI-устройство может быть реальным или виртуальным.
Audio Toolbox позволяет вам создать интерфейс к MIDI-устройству с помощью mididevice
. Чтобы создать MIDI-интерфейс к определенному устройству, используйте mididevinfo
, чтобы запросить вашу систему для доступных устройств. Затем создайте объект mididevice
путем определения MIDI-устройства по наименованию или ID.
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. Примечание По упоминается как имя сообщения, команда или тип.
В MATLAB® сообщение MIDI группировано как объект midimsg
и может управляться как скаляры или массивы. Чтобы создать сообщение MIDI, вызовите midimsg
с типом сообщения и затем задайте обязательные параметры для определенного типа сообщения. Например, чтобы создать примечание по сообщению, задайте
Type
midimsg
как '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, задайте его его типом и необходимыми значениями свойств. Например, создайте Давление Канала сообщение 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. Концептуально, часы синхронизации запускаются, когда объект mididevice
создается и присоединяется как прослушиватель данного входного порта MIDI. Если другой mididevice
присоединен к тому же входному порту, он получает метки времени от тех же часов синхронизации как первый объект.
При отправке сообщений MIDI с помощью midisend
интерпретированы метки времени как тогда, когда отправить сообщение.
Если не было никаких недавних вызовов midisend
, то midisend
интерпретирует метки времени как относительно текущего реального времени. Сообщение с меткой времени нуля сразу отправляется. Если был недавний вызов midisend
, то midisend
интерпретирует метки времени как относительно самой большой метки времени последней возможности к midisend
. Часы метки времени для midisend
характерны для выходного порта MIDI, с которым соединяется mididevice
.
Рассмотрите пару сообщений MIDI, которые включают и выключают примечание. Сообщения указывают, что примечание запускается после одной секунды и поддержано в течение одной секунды.
Создайте Примечание По и Примечание От сообщений.
OnMsg = midimsg('NoteOn',1,59,64); OffMsg = midimsg('NoteOn',1,59,0);
Чтобы переслать и от сообщений с помощью одного вызова midisend
, задайте метки времени сообщений относительно того же времени начала.
OnMsg.Timestamp = 1; OffMsg.Timestamp = 2; midisend(device,[OnMsg;OffMsg]))
Чтобы отправить Сообщение От сообщения отдельно, задайте метку времени Примечания От сообщения относительно самой большой метки времени предыдущего вызова 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 на маленькие повторяемые фрагменты времени.