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

МИДИ

В этом руководстве представлен протокол 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

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

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

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

  2. Второй байт описывает, какая клавиша нажата. Второй байт упоминается как Data Byte.

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

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

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

См. также

Классы

Функции

Похожие темы

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