MIDI — протокол реального времени




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

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

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

В общем, получается, что временем звучания нот, темпом, и другими временнЫми моментами управляет сам исполнитель. Если мы хотим записать действия исполнителя, нужно каждое MIDI-сообщение, поступившее в секвенсор, снабдить меткой времени. Примерно так: сообщение "взять ноту" поступило на первый тик. Записываем его в память вместе с меткой 1. Сообщение "снять ноту" поступило на двадцать первый тик, записываем его с меткой 21. Если секвенсор отсчитывал двадцать тиков в секунду, то, очевидно, длина записанной ноты — одна секунда. При воспроизведении секвенсор начинает снова отсчитывать тики. Подошел первый тик, в тон-генератор отправилось сообщение о взятии ноты, подошел 21-й тик — о снятии ноты. Таким образом, мы записали, а затем воспроизвели действия исполнителя.

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

Компоненты MIDI


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

Протокол MIDI состоит из трех частей: спецификации формата данных, аппаратной спецификации интерфейса и спецификации формата хранения данных.

Начнем разговор о MIDI с первой части, то есть с языка, на котором общаются устройства.

Язык MIDI


Для управления одним устройством с другого нужно придумать язык команд, понятный им обоим. То есть составить список команд, обозначить каждую команду своим кодом и договориться: если устройство понимает команду, оно должно на нее реагировать так-то и так-то, если не понимает — игнорировать.

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

Сообщения логично разделить на два основных типа: одни управляют звукообразованием, то есть говорят, например, какую ноту и как громко играть, вторые выполняют служебные функции, вроде изменения настроек тон-генератора и синхронизации. Поскольку извлечение звуков происходит в MIDI на определенном канале, сообщения первого типа называются сообщениями канала (Channel Messages). Сообщения второго типа называются системными (System Messages). Сообщения канала всегда относятся к какому-либо MIDI-каналу и обрабатываются тон-генератором только в том случае, если он настроен на прием данного канала. Выше говорилось, что соединение нескольких тон-генераторов через разъем MIDI Thru, при соответствующих настройках инструментов, позволяет передавать "каждому свое". Системные сообщения предназначаются всем устройствам в MIDI-системе, независимо от того, на прием каких каналов они настроены.

Сообщения канала делятся, в свою очередь, на голосовые (Channel Voice Messages) и сообщения режима канала (Channel Mode Messages). Системные сообщения делятся на общесистемные (System Common Messages), сообщения реального времени (System Real Time Messages) и эксклюзивные (System Exclusive Messages).

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

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

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

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

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

Представьте, что, например, фирма Roland выпустила новый звуковой модуль с необычной функцией. Для управления этой функцией нет стандартного голосового сообщения, предусмотренного спецификацией MIDI. Что делает фирма Roland? Она придумывает свое эксклюзивное сообщение, с помощью которого и происходит управление функцией. Для того, чтобы эксклюзивные сообщения одних фирм не мешали другим, каждый производитель получает свой уникальный идентификатор и использует его в заголовке сообщения. Так что звуковой модуль, скажем, фирмы Yamaha, увидев в заголовке сообщения SysEx идентификатор Roland, говорит себе: "Так, это не для меня, я тут все равно ничего не пойму, пропускаю все сообщение".

Несколько сообщений SysEx являются универсальными и поддерживаются устройствами разных производителей. Эти сообщения применяются для настройки таких параметров тон-генератора, как общая громкость и панорама, а также для реализации дополнительных протоколов в рамках MIDI, например, протокола передачи семплов (MIDI Sample Dump Standard), управления сценическим светом и пиротехническими устройствами (MIDI Show Control), управления транспортными функциями оборудования (MIDI Machine Control).

Ну вот, разобрались с тем, какие сообщения бывают. Теперь пора выяснить, как их передавать. Понятно, что каждому сообщению нужно присвоить свой код, однако прежде чем перейти к этому, необходимо четко представлять, как хранится информация в цифровых устройствах.

Системы счисления


Мы не будем здесь учиться программировать или складывать двоичные числа в столбик. Первое музыканту не обязательно, а второе проще делать на калькуляторе.

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

Как же хранится информация в цифровых устройствах? Логично предположить, что раз "цифровые", то в виде привычных для нас чисел. Люди используют десятичную систему счисления, возникшую благодаря пальцевому счету — числу пальцев на обеих руках. У нас есть десять различных знаков (цифр), с помощью которых мы можем представить любое число. Если бы у нас было по три пальца на каждой руке (какой ужас), мы бы наверняка пользовались шестеричной системой счисления. И выражали бы любые числа, используя шесть цифр — 0, 1, 2, 3, 4, 5.

У цифрового устройства пальцев нет совсем, а есть только электрические элементы, которые могут находиться либо во включенном, либо в выключенном состоянии. Можно представлять себе такой элемент в виде конденсатора, который либо заряжен, либо разряжен. Программисты договорились, что одно состояние конденсатора будет обозначаться цифрой 0, а другое — 1. Могли бы использовать буквы A и B, суть от этого не изменилась бы. Итак, на все нам даны две цифры, и поэтому система счисления в цифровой технике — двоичная. Цифры в двоичной системе обычно называют битами (от англ. bit — bi nary digi t). Также битом называют простейшую, неделимую область памяти (тот самый конденсатор), в котором хранится какая-либо из цифр двоичной системы. По сути, бит — это минимальная единица информации. Не стоит путать этот "бит" с музыкальным термином, звучащим по-русски аналогично, но обозначающим "удар" (от англ. beat).

Итак, бит принимает только два значения — обычно 0 и 1, хотя эти цифры условны. Например, бит может показывать логическое состояние "да/нет", наличие или отсутствие жесткого диска в семплере, или, скажем, тип дороги — асфальтовая или грунтовая. Понятно, что многие явления двумя состояниями не описать, а числа одним битом не выразить. Для этих целей применяется набор битов. Например, посчитаем в двоичной системе до восьми, и посмотрим, сколько битов (простейших ячеек памяти) нужно для представления чисел (рис. 9):

Нетрудно заметить: максимальное число, которое можно записать, располагая N битами, равно 2N-1. Действительно, двумя битами можно выражать числа до 3, тремя до 7 и так далее.

Для удобства доступа к данным в цифровой технике биты объединяются в группы. Самая распространенная и всем знакомая группа битов — байт. Байт состоит из восьми битов. Биты нумеруются справа налево — нулевой бит всегда находится справа и называется младшим значащим разрядом (LSD, Least Sign­ificant Digit). Самый левый бит называется старшим значащим разрядом (MSD, Most Significant Digit), рис. 10. Получается, что в одном восьмибитовом байте могут храниться значения от 0 до 255 (28-1), то есть всего 256 значений. Если нужно хранить числа больше 255, используются два байта (машинное слово, 16 бит), диапазон значений от 0 до 216-1 (65535), четыре байта (двойное слово, 32 бита) — от 0 до 232-1 (4294967295), и так далее. Заметьте, что число бит, используемых для хранения числа, всегда кратно восьми. Даже если для представления числа достаточно 9 бит, используются два байта. Группы байт объединяются в соответствии со степенями двойки: 2, 4, 8, 16 и так далее. Так что трехбайтовая величина (24 бита) в памяти машины все равно занимает 4 байта, старшие восемь бит просто не используются. Такое расточительство ресурсов связано с особенностью архитектуры микропроцессоров.

В протоколе MIDI значения параметров обычно ограничены двухбайтовым словом. Биты с 0 по 7 составляют младший значащий байт слова (LSB, Least Significant Byte), с 8 по 15 — старший значащий байт (MSB, Most Significant Byte).

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

Важно понять, что компьютеру абсолютно все равно, как мы там называем числа — цифрами, буквами или точками с тире. На физическом уровне есть только электрические элементы, способные находиться в одном из двух состояний. А то, что в компьютерном мире и, в частности, в протоколе MIDI используются именно шестнадцатеричные числа, вызвано удобством их перевода в двоичные, то есть на язык компьютера, и обратно.

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

С помощью нее можно быстро, без калькулятора, выполнять преобразование двоичных чисел в шестнадцатеричные и обратно. Работая с MIDI даже на уровне пользователя, такие преобразования иногда приходиться выполнять. Например, преобразуем наше число 35935 из двоичного вида (1000110001011111) в шестнадцатеричный. Первая четырехбитная группа справа — 1111, соответствует шестнадцатеричному F. Вторая группа (0101) — 5, третья (1100) — С, последняя (1000) — 8. Итак, десятичное 35935 в шестнадцатеричном виде выглядит как 8C5F. Аналогично, число D7 записывается в двоичном виде как 11010111.

Преобразования двоичных и шестнадцатеричных чисел в десятичные и обратно проще выполнять на калькуляторе.

Для того, чтобы отличать в тексте шестнадцатеричные числа от десятичных, используются разные методы. Я буду использовать синтаксис языка программирования Си и обозначать шестнадцатеричные числа префиксом "0x". В нашем примере 35935 = 1000110001011111 = 0x8C5F.


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

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






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