Pattr

MIDI и OSC - Основные Протоколы Взаимодействия Музыкальных Приложений

Часть 1. MIDI

MIDI (Musical Instrument Digital Interface) - это стандарт обмена данными между цифровыми музыкальными инструментам. Он позволяет обмениваться такой информацией, как номер ноты, скорость нажатия, таймкод и др. MIDI поддерживает большинство выпускаемых музыкальных девайсов, исключения составляют многие модули модульных систем (например, Eurorack), а также такие специфичные вещи, как Monome.

1 Предпосылки

Необходимость в таком стандарте возникла примерно к концу 70-х годов. В то время синтезаторы управлялись напряжением с помощью интерфейса CV/Gate. Существовало несколько его видов, однако, наибольшую популярность получил вариант, предложенный фирмой Roland: в нем при увеличении напряжения на 1 В, частота генерируемого тона увеличивалась на одну октаву. Главным недостатком такого интерфейса является то, что с помощью него можно управлять только одним голосом полифонии. Для извлечения дополнительной ноты нужно добавлять еще один интерфейс CV/Gate. Кроме того, таким способом передается только сам факт нажатия клавиши и ее высота, чего однозначно мало для выразительной игры.

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

Несомненно, у каждого синтезатора свой характер звучания, каждый из них был силен в определенных типах звуков. Поэтому многие музыканты того времени практиковали игру сразу на двух инструментах, как бы используя лучшее из разных моделей. Наслоение звуков из различных синтезаторов стало исполнительским приемом, визитной карточкой многих музыкантов. [1]

2 История появления

К началу 80-х большинство производителей осознали необходимость создания единого интерфейса. Задача стояла такая: разработать стандарт передачи действий исполнителя в цифровой форме между всеми типами электромузыкальных инструментов. [1]

Не будем детально углубляться в историю, (хотя она и очень интересна, о ней можно прочитать в [1]), приведем несколько основных дат:

  • Июнь 1981 - на выставке NAMM произошел первый разговор на тему единого интерфейса между главами Sequential Circuits, Roland и Oberheim.
  • Осень 1981 - первая версия интерфейса под названием UMI (Universal Musical Interface).
  • Июнь 1982 - на выставке NAMM были представлены плоды международной разработки. Ввиду возможных юридических проблем от названия UMI пришлось отказаться в пользу MIDI.
  • Октябрь 1982 - закончена предварительная спецификация MIDI.
  • Декабрь 1982 - выпушен первый синтезатор, оборудованный MIDI-интерфейсом - Sequencial Circuits Prophet 600.
  • 1983 - сформированы комитет по MIDI-стандартам (JMSC), международная группа пользователей MIDI (IMUG), выпущена спецификация MIDI 1.0.
  • 1984 - сформирована ассоциация MIDI-производителей (MMA).

3 Основы

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

Сам протокол состоит из трех частей [1]: спецификация формата данных, аппаратная спецификация интерфейса и спецификация хранения данных. В данной статье будет идти речь только о первой части. MIDI сообщения делятся на два типа: сообщения канала (channel messages) и системные сообщения (system messages). Первые управляют звукообразованием, а вторые выполняют служебные функции, например, синхронизация.

Типы MIDI-сообщений.

Сообщение обычно состоит из двух или трех байт. Первый байт называется статус байтом. В нем задается тип сообщения и номер канала, к которому оно относится. Все последующие байты называются байтами данных. Статус-байт всегда начинается с единицы, а байт-данных с нуля - таким образом система их различает. Получается, что для MIDI информации остается только 7 бит, с помощью которых можно закодировать целые числа от 0 до 127, - вот откуда берется это "знаменитое" ограничение на количество нот и значения контроллеров.

Структура MIDI-сообщения.

Как видно из рисунка, информации о типе сообщений отводится всего 3 бита, в которых можно закодировать только 8 чисел. 7 из них отведены под наиболее часто используемые команды, а последнее используется для системных сообщений. Когда передается системное сообщение, последние 4 бита статус байта (в которых обычно передается номер канала) определяют тип системного сообщения.

Табл. 1. Сообщения канала.

Сообщение Статус-байт Байт данных 1 Байт данных 2
Note Off 1000nnnn Номер ноты Velocity
Note On 1001nnnn Номер ноты Velocity
Polyphonic Key Pressue 1010nnnn Номер ноты Давление
Control Change 1011nnnn Номер контроллера Значение
Program Change 1100nnnn Номер программы -
Channel Pressure 1101nnnn Давление -
Pitch Wheel Change Change 1110nnnn Номер программы -
Системные сообщения 1100nnnn ... ...

Табл. 2. Системные сообщения.

Сообщение Статус-байт Байт данных 1 Байт данных 2
System Exclusive (SysEx)
System Exclusive 11110000 ID ...
System Common
MTC Quater Frame 11110001 Тайм-код -
Song Position Pointer 11110010 LSB MSB
Song Select 11110011 Номер песни -
Tune Request 11110110 - -
End Of Exclusive (EOX) 11110111 - -
Real Time
Timing Clock 11111000 (248) - -
Start 11111010 (250) - -
Continue 11111011 (251) - -
Stop 11111100 (248) - -
Active Sensing 11111110 - -
System Reset 11111111 - -

4 Недостатки

MIDI разрабатывался, как доступный и практичный стандарт для передачи жестов исполнителя между любыми MIDI-устройствами [2]. Не в последнюю очредь благодаря своей легковесности он и получил такое распространение. Что ни говори, со своим предназначением он справляется прекрасно, и это подтверждается временем.

Итак, наверное, самый известный недостаток - ограничение значений контроллеров на 128 значений. Конечно, есть возможность передавать их с помощью двух байтов данных (что дает 16 384 возможных значений), но для этого надо передать три сообщения Control Change, что очень сильно загрузит протокол, так как данные по нему передаются со скоростью 31 250 бит/с. Это очень мало. Для сравнения, 12-нотный аккорд передастся примерно за 10 мс. И это без других сообщений, например Clock и CC. В реальном перфомансе, когда одновременно передается много различных параметров, могут возникнуть проблемы с синхронизацией.

Часть 2. Open Sound Contol

"Open Sound Control - это новый, оптимизированный для современных сетевых технологий протокол для взаимодействия компьютеров, звуковых синтезаторов и других мультимедиа устройств" - так был представлен OSC на международной конференции по компьютерной музыке в 1997 году [3]. OSC не является протоколом в том виде, каким является MIDI, так как он не описывает требований к аппаратному обеспечиванию - спецификации описывают лишь формат передачи данных. В этом плане OSC больше схож с XML или JSON, нежели с MIDI [8].

Пока оставим технические подробности и начнем с самого начала, с истории.

1 История, области применения

Open Sound Control был создан в 1997 году Мэттью Райтом (Matthew Wright) и Эдрианом Фридом (Adrian Freed) в Университете Калифорнии в центре новой музыки и аудио технологий (CNMAT - Center of New Music and Audio Technologies). Разработчики хотели использовать высокоскоростные сетевые технологии в интерактивной компьютерной музыке [4]. OSC не важно, по какому протоколу передаваться, так как он представляет собой всего лишь формат данных (binary message format), хотя большинство реализаций используют TCP/IP или UDP. Другой причиной создания было то, что MIDI с его нотами, каналами и контроллерами логично не подходил к разрабатывающемуся в то время синтезаторуCAST (CNMAT Additive Synthesis Tools), оно и понятно, ведь MIDI - это клавишно-ориентированный протокол, который разрабатывался для управления одним синтезатором с другого [1].

Слово "Open" в названии означает, что OSC не предопределяет, какие сообщения должны использоваться для определенных параметров - это решается разработчиком конкретного девайса. Кроме того, это слово имеет и другое значение: протокол открыт, его спецификации находятся на официальном сайте, где можно скачать исходники.

Небольшой (и не полный) список программ, использующих Open Sound Control:

  • Языки программирования: C/C++, Java, Php, Python, Ruby.
  • Среды визуального программирования и синтеза: Bidule, Chuck, Common Music CPS, Intakt, Max/MSP, Open Sound World, Pd, SuperCollider, Reaktor, VVVV.
  • Устройства для работы с сенсорами: EtherSense, Gluion, IpSonLab Kroonde, Lemur, Smart, Controller, Teabox, Toaster.
  • Другие программы: EyesWeb, Picker, SonART, SpinOSC.

2 Особенности

  • Позволяет использовать любые протоколы передачи данных (самые распространенные - TCP/IP и UDP).
  • OSC позволяет задавать интуитивные адреса для параметров. Например, если потребуется задать громкость, равной 100 третьего канала микшера, сообщение может выглядеть так: "/mixer/channel/4/volume 100".
  • Есть возможность управления несколькими параметрами с помощью одного сообщения, используя так называемый pattern matching. К примеру, понизить до 10 громкость всех каналов микшера можно с помощью такого сообщения: "/mixer/channel/*/volume 10". Такой формат записи может быть знаком программистам и пользователям операционных систем семейства Unix.
  • В одном OSC-сообщении можно передавать несколько типов данных.
  • Тайм-тэги (time tags). Каждому сообщению присваивается временнАя метка.

3 Анатомия сообщений

Анатомия OSC-сообщений.

Стоит отметить, что при использовании UDP, сообщения не обязательно будут приходить в том порядке, в каком были переданы [6]. Допустим, были переданы сообщения:

/synth1/noteoff 54
/synth1/noteon 60

Фактически они могут прийти в обратном порядке:

/synth1/noteoff 60
/synth1/noteon 54

Это может привести к проблемам с управлением голосами в полифонии, например, в данном сообщении передается команда noteoff, которая выключает голос, а потом включает другую ноту. Если эти сообщения придут в обратном порядке, голос не освободится и новая нота не сможет запуститься.

Чтобы этого избежать, надо передавать критичные к очередности приема сообщения в одном пакете (bundle), либо использовать TCP/IP, он отличается от UDP тем, что гарантирует корректную доставку пакетов, передавая каждый из них до тех пор, пока он не передастся в изначальном виде. Нужно иметь ввиду, что ценой такому удобству будут большие в сравнении с UDP задержки, поэтому использование TCP/IP должно быть обосновано.

4 Pattern matching

Символы, которые можно использовать в адресной строке [7]:

  • "?" - соответствует любому одному символу.
  • "*" - соответствует последовательности из нуля или любого другого числа символов.
  • Символы в квадратных скобках (например, "[string]") - соответствует любому символу в строке. В квадратных скобках дефис (-) и восклицательный знак (!) имеют специальное значение: дефис между двумя символами означает диапазон чисел в ASCII последовательности (дефис в конце строки не имеет специального значения); восклицательный знак после первой квадратной скобки "переворачивает" действие символов: теперь они будут соответствовать всем символам, которых нет в строке (если этот знак поставить в любом другом месте, его специальное значение пропадет).
  • Конструкции типа {first,second} соответствует любой из последовательностей символов , написанных через запятую.

Ссылки

[1] Цикл статей о MIDI из журнала "Музыкальное оборудование".
[2] T. Winkler "Composing interactive music" - 2001 MIT Press.
[3] M. Wright, and A. Freed, 1997. "Open Sound Control: a new protocol for communicating with sound synthesizers." - ICMC 1997.
[4] M. Wright "Open Sound Control: an enabling technology for musical networking". Organised Sound 10(3): 193–200 - 2005 Cambridge University Press.
[5] A. Schmeder, A. Freed, D. Wessel "Best Practices for Open Sound Control" - Linux Audio Conference, 01/05/2010, Utrecht, NL, (2010).
[6] A. Fraietta "Open Sound Control: Constraints and Limitations" - 2008 8th NIME conference.
[7] M. Wright "The Open Sound Control 1.0 Specification" - 2002.
[8] A. Freed, A. Schmeder "Features and Future of Open Sound Control version 1.1 for NIME" - 2009.

P.S. Большое спасибо хабраюзеру 8bitjoey за найденную критическую ошибку в статье.

01 Mar 2012  OSCII