Перейти к основному содержанию

Кодирование MIDI-сообщений

Как уже было сказана, MIDI-сообщение представляет собой двоичный код. Вспомним основные принципы двоичного счисления:

midi
midi

В MIDI также широко используется шестнадцатеричная система счисления. В шестнадцатеричной системе числа представляются с помощью цифр и букв: цифры — от 0 до 9, и буквы — от A до F. Например, десятичное число 10, в шестнадцатеричной системе записывается как A. Значение F соответствует десятичному 15. 

Использование именно шестнадцатеричных чисел вызвано удобством их визуального представления (каждый байт представлен двумя символами) и перевода в двоичные числа:

midi

Максимальное число, которое можно представить одним шестнадцатеричным знаком (F, десятичное 15), равно максимальному числу, которое можно представить четырьмя битами (24-1). Максимальное число, которое можно представить двумя шестнадцатеричными знаками (FF, десятичное 255), равно числу, которое можно представить восемью битами (28-1). И так далее. 

Таким образом, каждые четыре бита двоичного числа соответствуют одному разряду шестнадцатеричного (24 = 16).

Принцип кодирования сообщений

Сообщение состоит из двух компонентов: первый определяет тип сообщения, второй содержит значения. В некоторых случаях значения не нужны, например, в системном сообщении реального времени, останавливающем секвенсор, достаточно первого компонента, который говорит "стоп". 

Компонент, определяющий тип сообщения, называется статус-байтом, компонент, содержащий значения — байтом данных. Если данных много, они могут быть представлены несколькими байтами. Таким образом, каждое MIDI-сообщение состоит из одного статус-байта, и одного или нескольких байтов данных. Передаются эти сообщения в том же порядке — сначала статус-байт, затем байты данных. Количество байтов данных жестко закреплено за каждым сообщением. Так что, если, например, синтезатор получил статус-байт "нажата клавиша", он ждет за ним два байта данных, первый из которых содержит номер нажатой клавиши, второй — скорость нажатия:

midi

Для сообщений типа System Exclusive сделано исключение — их длина жестко не задается. Она определяется специальным статус-байтом, который помещается в конец сообщения. 

Каждый статус байт содержит в старшем значащем разряде единицу, а каждый байт данных — ноль:

midi

Принимающее устройство анализирует полученный байт примерно по следующей схеме: 

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

В статус-байте можно закодировать 128 сообщений, однако 4 младших бита отданы под кодирование номера канала (каналов всего 16, и для их представления достаточно четырех бит).

Таким образом, старший бит статус-байта занят, так как должен всегда содержать единицу, четыре младших байта — тоже, так как содержат номер MIDI-канала. 

На кодирование типа сообщения остается всего три бита, которыми можно закодировать восемь сообщений:

midi

Семь из них отвели под сообщения канала, а последнее, все биты которого единичные (111), сделали признаком системного. 

Системные сообщения не требуют номера канала, поэтому младшие четыре бита статус-байта могут быть использованы для кодирования конкретного типа сообщения (всего их получается 16).

Зачастую 7 бит байта данных (т.е. 128 возможных значений) недостаточно для точного представления передаваемых значений, поэтому в MIDI применяется многоуровневый метод кодирования с использованием пары MSB:LSB. (Most Significant Byte и Least Significant Byte).

Для того, чтобы передать число, большее 127, оно кодируется двумя байтами данных, т.е. парой MSB:LSB.  Таким образом, контроллер может реагировать на самые тонкие наши движения и передавать свое положение в диапазоне от 0 до 16383:

midi

Можно представить пару MSB:LSB не как одно большое число, а как результат грубой и тонкой настройки. 

Представим MSB в виде линейки с крупным делением шкалы (128 отрезков). Но если поднести к линейке лупу, то мы увидим, что каждый отрезок состоит еще из 128 частей:

midi

Схема передачи сообщений разного уровня:

midi