Уровни кодирования
Проблема была решена так: самым часто употребляемым сообщениям выделили собственный статус-байт, а для всех остальных сделали статус-байт-посредник. Ситуацию можно сравнить с телефонными номерами. Для звонков внутри города (предположительно, наиболее частых) вы набираете прямой номер, а для междугородных звонков (предположительно, более редких) вы должны набрать префикс (код города), и только потом номер. Междугородный номер приходиться набирать дольше, чем внутригородской. Так и в MIDI — сообщения с прямым статус-байтом проходят быстрее, чем сообщения с байтом-посредником. Итак, можно выделить два множества сообщений или, иначе, два уровня кодирования. Доступ к первому — прямой, ко второму — только через посредника. Следующая таблица показывает сообщения первого уровня (рис. 4). Статус-байты даны в двоичном, десятичном и шестнадцатеричном виде. Младшая половина статус-байта (4 бита) содержит номер канала, которому адресовано сообщение. Так, например статус-байты в диапазоне от 10010000 (0x90) до 10011111 (0x9F) означают одно и тоже сообщение Note On, в диапазоне от 11000000 (0xC0) до 11001111 (0xCF) — сообщение Program Change и т. д. То есть, статус-байт, соответствующий одному типу сообщения, может быть представлен в шестнадцати вариантах, в зависимости от номера канала. В MIDI, как и во всем компьютерном мире, отсчет ведется с нуля. При передаче сообщений первый канал кодируется как 0000, второй как 0001, а шестнадцатый — как 1111 (десятичное 15, шестнадцатеричное 0xF).
Статус-байт-посредник получил название Control Change ("изменение управления"). В спецификации все сообщения, вызываемые через этот байт, называются сообщениями типа Control Change, и предполагается, что они "генерируются манипулятором, отличным от клавиатуры". Но, например, колесо питч-бенда — тоже манипулятор, отличный от клавиатуры, однако он к группе Control Change не относится. Музыканты настолько часто им пользуются, что его просто невыгодно помещать во второй уровень. А вот колесо модуляции используется пореже, и там ему самое место. Хотя, повторю, это все в среднем: иногда вы можете руку не снимать с колеса модуляции, а к колесу высоты тона даже не прикоснуться. Таким образом, "сообщения об изменении управления" — название условное, а функция статус-байта Control Change служебная. Он просто действует как префикс, открывающий путь к другим сообщениям. Получается такая картина. Если пришел статус байт вида 1100nnnn, то инструмент сразу по нему определяет тип сообщения, — в данном случае это Program Change. Если пришел статус-байт 1011nnnn, то инструмент видит, что это байт-посредник, который о типе сообщения ничего не говорит, а просто уведомляет: сейчас пойдет сообщение второго уровня. Какое именно — смотри байт данных, следующий за посредником. Синтезатор читает этот байт и определяет, что это сообщение колеса модуляции. Положение колеса будет передано в третьем, завершающем байте (см. рис. 7). Таким образом, с помощью статус-байта-посредника и следующего за ним байта данных можно закодировать 128 сообщений. Эти сообщения показаны в таблице на рис. 5. Их принято называть сообщениями контроллеров, но правильнее было бы называть сообщениями второго уровня. Слово контроллер не очень удачно еще и потому, что под контроллером часто подразумевается физический орган управления — колесо, движок или педаль. Поэтому догадаться о том, что имеется в виду — сообщение типа Control Change или физическое устройство, иногда бывает очень сложно, даже по контексту. Но традиция сложилась, поэтому под словом "контроллер" я буду иметь в виду сообщение второго уровня. А физическое устройство буду называть органом управления.
Сообщения контроллеров обозначаются в документации как СС#N (сообщение Control Change номер N, в десятичном представлении), например, сообщение колеса модуляции обозначается как CC#1. Из таблицы видно, что часть сообщений контроллеров не определена (такие сообщения могут использоваться экспериментаторами и производителями для тестирования или отладки оборудования). Восемь последних сообщений (СС#120 — CC#127) являются сообщениями режима канала. Они применяются довольно редко, поэтому выделять им место в ограниченном первом уровне, то есть давать собственный статус-байт, не было смысла. Можно заметить, что многие сообщения, выполняющие одну и ту же функцию, представлены двумя вариантами: MSB и LSB. Зачем такое разделение, почему не передавать пару MSB:LSB в одном сообщении? Во-первых, это увеличит длину всех сообщений второго уровня: за байтом-посредником придется передавать не два, а три байта. Многим контроллерам это не нужно — они позволяют производить только грубую настройку. Во-вторых, даже для контроллеров высокого разрешения часто можно обойтись грубой настройкой, и передавать LSB нет смысла. Несмотря на то, что среди сообщений второго уровня есть более 50 свободных (которые пока не определены), разработчикам, видимо, понравилось прятать сообщения за посредниками, и они сделали третий уровень кодирования. Идея такая: выделить специальное сообщение контроллера, в байте данных которого будет передаваться номер сообщения третьего уровня. Было решено задавать такой номер двумя байтами данных. На деле это означает, что для адресации должна использоваться пара MSB:LSB. Плюс ко всему, сообщения третьего уровня разбили на два типа: зарегистрированные параметры (RPN, Registered Parameter Numbers) и незарегистрированные параметры (NRPN, Non Registered Parameter Numbers). Первые кодируются с помощью пары CC#101:CC#100, вторые — СС#99:CC#98. Таким образом, третий уровень может содержать 16384 зарегистрированных параметров и 16384 незарегистрированных, то есть всего 32768 сообщений. Что ж, на первое время хватит... Спецификация определяет назначение только для зарегистрированных параметров. В настоящий момент определены пять параметров, которые перечислены в таблице на рис. 6. Организации MMA и JMSC медленно, но верно пополняют этот список.
Проблема, которая может возникнуть при использовании NRPN, — несовместимость устройств. Так, одно устройство может применять NRPN номер 1 для настройки добротности эквалайзера, а другое — для изменения точки начала петли внутри семпла. Особенно неприятно это при соединении приборов в цепь (посредством разъемов Thru). Тогда потенциально несовместимые NRPN могут передаваться по всей цепи, что приведет к неверной их интерпретации. Многие устройства в этой связи позволяют отключить реакцию на NRPN.
Как получить доступ к сообщению третьего уровня? Для начала нужно задать его номер, используя пару MSB: LSB. Например, для сообщения RPN номер 1 эта пара будет иметь вид 0:1. Следовательно, нужно послать в CC#101 значение 0, а в CC#100 — 1. Таким образом, мы даем знать тон-генератору, какой параметр нас интересует. Для передачи значения параметра есть специально выделенный контроллер высокого разрешения под названием Data Entry (пара MSB:LSB, CC#6:CC#38). Предположим, нам нужно задать параметру RPN номер 1 значение 500. Пара MSB:LSB в этом случае будет иметь вид 3:116 (128 x 3 + 116 = 500). Посылаем в CC#6 значение 3, а в CC#38 — 116. Если какой-либо параметр не требует тонкой настройки, достаточно послать только MSB посредством контроллера CC#6. Если нужно увеличить или уменьшить на единицу ранее переданное значение параметра, то для этого проще воспользоваться сообщениями Data Increment (СС#96) или Data Decrement (CC#97). Передавать заново пару MSB:LSB не нужно. Байт данных в сообщениях Data Increment/Decrement не используется и должен быть равен нулю. Пример использования контроллеров Data Entry и Data Increment/Decrement приведен далее, в разделе "RPN". Доступ к параметрам NRPN происходит аналогично, только номер параметра задается парой CC#101:СС#100. На рис. 7 показана схема передачи сообщений разного уровня, а на рис. 8 — требуемое количество байт.
Сообщения можно разделить на три основные группы: непрерывные, контроллеры-переключатели и простые команды. Непрерывные контроллеры (Continuous Controllers) — это такие контроллеры, которые обычно посылаются целой серией и представляют собой поток плавно изменяющихся значений параметра. Например, при перемещении колеса модуляции из положения 100 в положение 200 генерируется множество сообщений Modulation Wheel, каждое сообщение будет передавать текущее положение колеса (в данном случае 100, 101, 102 и т. д.). Поскольку отличие двух соседних значений небольшое, будет складываться ощущение действительно непрерывного изменения глубины модуляции. Непрерывные контроллеры можно дополнительно разделить на контроллеры высокого и контроллеры низкого разрешения. К первому типу спецификация относит сообщения из диапазона CC#0-CC#63 и CC#98-CC#101 (то есть пары MSB:LSB), ко второму — из диапазона CC#70-CC#95, а также сообщение режима канала Poly Mode Off (CC#126). На самом деле, часть этих "непрерывных" контроллеров используется для статичной настройки. Например, сообщение Bank Select (выбор банка), в отличие от Modulation Wheel, нет смысла посылать целой серией с последовательно увеличивающимися номерами банков. Обычно банк выбирается один раз, ну иногда меняется по ходу дела. Подобные сообщения правильнее было бы назвать "статичными". В первом уровне кодирования к сообщениям непрерывного типа относятся два вида послекасания (низкое разрешение) и Pitch Wheel Change (высокое разрешение). Сообщения Note Off, Note On и Program Change можно отнести к статичным, а сообщение Control Change само по себе ни в какую группу не попадает, так как является посредником. Все зарегистрированные параметры третьего уровня также относятся к статичным. Контроллеры-переключатели (СС#64-CC#69) могут передавать только два значения: включено или выключено (On/Off). Протокол связывает их с педалями всевозможных типов. Сюда же относится сообщение режима канала Local Control On/Off (CC#122). Простые команды вообще не передают никакой информации, кроме самой команды. Например, сообщение режима канала All Notes Off (CC#123) просит тон-генератор выключить звучащие ноты. И только. К простым командам относятся контроллеры CC#96, CC#97, CC#120, CC#121, CC#123, CC#124, CC#125, CC#127. Рис. 9 подытоживает вышесказанное. Некоторые сообщения (вроде панорамы) однозначно отнести к непрерывным или статичным сложно. Например, панорама (Pan) может выставляться один раз в начале работы, а может меняться непрерывно, для создания эффекта перемещения по стереобазе.
|