exponenta event banner

Интерфейс устройства MIDI

МИДИ

В этом учебном пособии описывается протокол MIDI (Musical Instrument Digital Interface; Цифровой интерфейс музыкального инструмента) и способы использования Audio Toolbox™ для взаимодействия с MIDI-устройствами. Описанные здесь инструменты позволяют отправлять и получать все MIDI-сообщения в соответствии с протоколом MIDI. Если вы заинтересованы только в отправке и получении сообщений Control Change с управляющей поверхностью MIDI, см. раздел Интерфейс управляющей поверхности MIDI. Если вы заинтересованы в использовании MIDI для управления аудиоплагинами, см. раздел MIDI Control for Audio Plugins. Для получения дополнительной информации о MIDI в целом обратитесь в Ассоциацию производителей MIDI.

MIDI - это технический стандарт связи между электронными приборами, компьютерами и связанными с ними устройствами. MIDI передает сообщения о событиях, специфичные для аудиосигналов, таких как тон и скорость, а также управляющие сигналы для параметров и тактовых сигналов для синхронизации темпа.

Устройства MIDI

Устройство MIDI - это любое устройство, способное отправлять или получать сообщения 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-сообщения

MIDI-сообщение содержит информацию, описывающую действие, связанное с звуком. Например, при нажатии клавиши на клавиатуре соответствующее MIDI-сообщение содержит 3 байта:

  1. Первый байт описывает вид действия и канал. Первый байт называется байтом состояния.

  2. Второй байт описывает, какая клавиша нажата. Второй байт называется байтом данных.

  3. Третий байт описывает, как жестко воспроизводится ключ. Третий байт также является байтом данных.

Это сообщение является сообщением 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

Для отправки и получения 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 ]
MIDI-сообщения возвращаются в виде массива midimsg объекты. В этом примере нажимается клавиша MIDI-клавиатуры.

Чтобы отправить MIDI-сообщения на устройство MIDI, вызовите midisend.

midisend(device,msg)

Типы сообщений MIDI

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

channelPressureMessage = midimsg('ChannelPressure',1,20)
channelPressureMessage = 

  MIDI message:
    ChannelPressure Channel: 1  ChannelPressure: 20  Timestamp: 0  [ D0 14 ]
После создания MIDI-сообщения можно изменить свойства, но изменить тип невозможно.
channelPressureMessage.ChannelPressure = 37
channelPressureMessage = 

  MIDI message:
    ChannelPressure Channel: 1  ChannelPressure: 37  Timestamp: 0  [ D0 25 ]

В таблице представлены допустимые типы сообщений MIDI.

Audio Toolbox предоставляет удобные синтаксисы для создания нескольких сообщений MIDI, используемых последовательно, и для создания массивов сообщений MIDI. Посмотрите midimsg для получения полного списка синтаксисов.

Синхронизация сообщений MIDI

Протокол 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]))

    Чтобы отправить сообщение 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 можно разделить на небольшие повторяющиеся порции времени.

См. также

Классы

Функции

Связанные темы

Внешние веб-сайты