Приём и обработка команд MIDI

В данной статье рассказывается о том, как принимать и обрабатывать сообщения MIDI (Musical Instrument Digital Interface) например с помощью микроконтроллера или FPGA.

MIDI IN, OUT и THRU. Электрическое соединение MIDI-интерфейса

Электрически интерфейс MIDI представляет собой оптически развязанную линию передачи UART с уровнями напряжений TTL и скоростью передачи 31250 бод. На входе приёмника MIDI IN ставится изолирующая оптопара, на выходе передатчика MIDI OUT или MIDI THRU токовый буфер, построенный например на двух инверторах 74HCT04 (см. схему).

MIDI Sender and MIDI Receiver schema

На приведённой схеме видно, что передатчик и приёмник MIDI не связаны между собой электрически (гальванически развязаны). При использовании в качестве оптопары микросхемы 6N138 (6N139) можно в качестве напряжения VDD использовать +5В или +3.3В, в зависимости от уровня напряжений входа MIDI_RX принимающей схемы.

Сообщения MIDI

Все MIDI-сообщения можно разделить на три типа:

  1. Сообщения состояния
  2. Сообщения данных
  3. Сообщения SysEx (System Exclusive)

Сообщения состояния с программной точки зрения отличаются от сообщений данных битом 7 -- если бит 7 принимаемого байта равен 1, то это сообщение состояния.

Сообщения SysEx - это пакетные данные, каждое сообщение SysEx начинается с заголовка F0 ii dd (где ii -- ID производителя, а dd -- ID устройства) и заканчивается байтом F7. Есть несколько универсальных сообщений SysEx, которые поддерживаются большинством синтезаторов, такие как сообщения реального времени (ii=7F) Master Volume, Master Pan, Master Fine Tunning, Master Coarse Tunning, Reverb Time и Chorus Send To Reverb, a также не сообщения реального времени (ii=7E) GM System On, GM System Off, GM2 System On и т.п.

Режимы Active Sense и Sequence Play

При приёме сообщений MIDI прежде всего следует имплементировать обработку сообщений Sequence Start (FA), Sequence Stop (FC) и Active Sense (FE).

Принимающее устройство переключается в режим Active Sense при получении сообщения Active Sense. Если в течение 300 мс не поступает MIDI-данных или сообщений Active Sense, устройство выполняет команду All Sounds Off, чтобы не возникало эффекта зависшего пада при выключении MIDI-клавиатуры, который можно наблюдать на некоторых клавиатурах, нажав клавишу, переключив номер MIDI-канала и отпустив клавишу (сообщения Note On и Note Off при этом отправляются на разные MIDI-каналы).

Данный алгоритм выглядит следующим образом:

Обработка режимов Active Sense (FE) и Sequence Play (FA)

Обработка сообщений MIDI

Алгоритм обработки MIDI-сообщений выглядит следующим образом:

Обработка MIDI-сообщений

Изначально текущее состояние принимающего устройства неопределённо, поэтому поступающие сообщения данных игнорируются, как и в случае, если это данные сообщения SysEx не для данного устройства.

При приёме сообщения состояния текущее состояние устройства устанавливается и устройство начинает ожидает LSB-сообщения данных, если сообщение трёхбайтное (байт состояния, LSB, MSB), после приёма LSB устройство ожидает приёма MSB-сообщения данных.

Затем устройство снова ожидает LSB-сообщения. Таким образом, например аккорд до-мажор 3 октавы будет передан как Note On, С3, C3 velocity, E3, E3 velocity, G3, G3 velocity. По этой причине вместо Note Off зачастую передаётся сообщение Note On с velocity равным 0.

Автор: Андрей Шаройко <vanyamboe@gmail.com>