В этой статье описана общая архитектура MIDI, не зависящая от реализации на платформе, API или функций платформы.
Основные понятия
События
Протокол MIDI предназначен для обмена данными на основе событий. Мероприятие – это указание на то, что что-то произошло или произойдет в определенное время. События MIDI представлены сообщениями – атомарными пакетами информации.
Способ отправки запроса
Сообщения MIDI кодируются и передаются через транспортный уровень, сокращенно транспорт, который отправляет необработанные данные MIDI получателю, а тот декодирует их в сообщения.
Аппаратные MIDI-транспорты включают:
- MIDI 1.0 с токовой петлей и 5-контактным разъемом DIN
- USB
- Bluetooth с низким энергопотреблением (BLE)
Представление сообщения
Спецификация передачи MIDI описывает, как передавать сообщения. Хотя упаковка сообщений зависит от транспорта на самом низком уровне, на более высоком уровне приложения могут рассматривать упорядоченную по времени последовательность сообщений как разграниченный поток байтов. Это возможно, поскольку каждое сообщение содержит достаточно информации, чтобы определить его общую длину, если известна граница начала сообщения.
Большинство сообщений MIDI короткие (от одного до трех байтов), но есть возможность отправлять более длинные сообщения с помощью SysEx.
Временные метки
Временная метка – это необязательный ярлык, который добавляется к письму при создании или получении в зависимости от транспорта. Временная метка выражается в единицах времени, таких как секунды или такты.
Если временная метка отсутствует, система должна подставить временную метку непосредственно предшествующего сообщения или текущее время. Точность этих временных меток, явных или неявных, является важным аспектом надежности системы на основе MIDI.
Временные метки не входят в протокол MIDI 1.0. Обычно они добавляются как часть API для определенной платформы. В транспортном протоколе BLE есть временные метки, указывающие время отправки нескольких отдельных сообщений в одном пакете BLE.
Устройства
Периферийное устройство обеспечивает возможности ввода/вывода (I/O) для компьютера. Термины периферийное устройство MIDI и устройство MIDI обычно относятся к любому аппаратному или программному модулю, поддерживающему протокол MIDI. В этом документе периферийное MIDI-устройство – это физический объект, а MIDI-устройство – это модуль, который реализует MIDI.
Порты
Порт – это интерфейс между компьютерами и периферийными устройствами.
В MIDI 1.0 в качестве порта используется пятиконтактный разъем DIN. Каждый порт может быть выходным (источником данных MIDI), входным (приемником данных MIDI) или сквозным (входным, напрямую подключенным к выходному).
Другие способы передачи данных, например USB и BLE, расширяют концепцию порта.
У MIDI-устройства есть хотя бы один порт OUT, IN или оба.
MIDI-устройство передает потоки сообщений, исходящих из каждого порта OUT, и получает потоки сообщений, поступающих в каждый порт IN. Термины IN и OUT, конечно, относятся к одному порту; с точки зрения другого порта применяется обратный термин.
Подключение
В транспорте MIDI 1.0 порт OUT подключается не более чем к одному порту IN или THRU из-за особенностей текущего цикла. В случае с USB и BLE это также верно для самого нижнего уровня, хотя реализация может перенаправить поток сообщений, чтобы его можно было передавать на несколько портов IN.
Кабели
Кабель MIDI 1.0 – это физический пучок проводов, который соединяет порт OUT с портом IN или THRU. Кабель используется только для передачи данных.
Примечание. Существуют нестандартные модификации MIDI, которые обеспечивают питание через два неиспользуемых контакта. Это называется фантомным питанием.
USB-кабель похож на MIDI-кабель, но у него много разных типов разъемов, а концепция IN/OUT/THRU заменена на роль хоста/периферийного устройства.
В режиме USB-хоста устройство-хост подает питание на периферийное устройство MIDI. Большинство небольших MIDI-устройств потребляют не более одной единицы нагрузки USB (100 мА). Однако некоторым крупным периферийным устройствам, а также устройствам с аудиовыходом или подсветкой требуется больше энергии, чем может предоставить хост-устройство. Если у вас возникли проблемы, попробуйте использовать другое периферийное MIDI-устройство или USB-концентратор с питанием.
Канал
Каждый поток сообщений MIDI мультиплексируется между 16 каналами. Большинство сообщений предназначены для определенного канала, но есть и такие, которые не связаны с каналом. Обычно каналы нумеруются от 1 до 16, хотя в коде они обозначаются значениями от 0 до 15.
Если приложению требуется более 16 каналов или более высокая пропускная способность, чем может поддерживать один поток сообщений, необходимо использовать несколько портов.
В MIDI 1.0 это достигается за счет нескольких кабелей, соединяющих пары портов.
При передаче MIDI через USB одна конечная точка USB может поддерживать несколько портов, каждый из которых идентифицируется номером кабеля. Согласно спецификации USB MIDI, номер кабеля идентифицирует виртуальный порт в конечной точке.
Примечание. Более точным термином был бы номер порта, поскольку он идентифицирует порт.
Таким образом, один физический кабель USB может передавать более одного набора из 16 каналов.
Реализация платформы
Как отмечалось во введении, эти общие концепции MIDI применимы ко всем реализациям. Чтобы узнать, как эти концепции реализованы на платформе Android, ознакомьтесь с
руководством пользователя Android MIDI для android.media.midi.