Этот пример вводит протокол Цифрового интерфейса музыкальных инструментов (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
с типом сообщения и затем задают обязательные параметры для определенного типа сообщения. Например, чтобы создать примечание по сообщению, задайте 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, задайте его его типом и необходимыми значениями свойств. Например, создайте Давление Канала сообщение 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 на маленькие повторяемые фрагменты времени.