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




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

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

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

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

Отсюда вывод: необходимо сделать так, чтобы приемник в любой момент мог отличить статус-байт от байта данных, без всяких подсчетов и необходимости синхронизации с передатчиком. Для этого в протоколе MIDI каждый статус байт содержит в старшем значащем разряде единицу, а каждый байт данных — ноль. Так что один бит из байта расходуется по служебной необходимости. Для кодирования сообщений и передачи данных остаются только семь бит. Отсюда — фундаментальное число 128, пронизывающее насквозь весь протокол. Семью битами можно представить только 128 различных значений (от 0 до 127, 27-1). Именно поэтому в MIDI 128 нот, 128 уровней динамики и так далее.

Стало быть, и в статус-байте можно закодировать 128 сообщений. Разработчики протокола могли так и сделать, но поступили иначе, и этим во многом объясняется гибкость и живучесть MIDI. Во-первых, 128 сообщений рано или поздно окажется недостаточно, во-вторых, в каждом сообщении канала нужно передавать номер канала, которому адресовано сообщение. Под номер канала придется отводить один байт данных, что не рационально — сообщения канала используются в MIDI гораздо активнее системных, а если к каждому такому сообщению будет "пришит" дополнительный байт, это намного снизит пропускную способность MIDI. К тому же каналов всего 16, и для их представления достаточно четырех бит. Поэтому было решено кодировать номер канала в младшей половине статус-байта (рис. 12)

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

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

Однако, что же получается: вместо 128 возможных сообщений мы можем закодировать только семь голосовых и шестнадцать системных? Да, именно так. Системных сообщений, в принципе, достаточно, а вот все голосовые в семь штук явно не уложишь. Поэтому разработчики MIDI применили многоуровневый метод кодирования. Но об этом поговорим в следующий раз.

 


Дата добавления: 2016-01-04; просмотров: 14; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!