Синхронизация Роман Вакулюк / ROMA ROBOT

Синхронизация. Новый уровень шоу. V2. NETWORK. Как работает OSC (Open Sound Control)

Роман Вакулюк / ROMA ROBOT

image

В статье в прошлом номере мы познакомились с основами построения сетей, и теперь,
основываясь на той информации, которую вы получили ранее
можно более подробно поговорить об OSC и его структуре.

Для передачи данных OSC использует транспортный протокол UDP и TCP. Поэтому при передаче и приеме сообщений мы должны указывать порт данных и IP-адрес клиента и сервера.
OSC очень похожи на MSC-сообщения. Отличие в том, что сами сообщения и адрес клиента не регламентируются протоколом, как в MSC. В OSC регламентируется лишь правило описания адреса и сообщения. Любой производитель и программист может придумать свои наборы сообщений и передать их через OSC.

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

Хорошо, OSC-сообщение мы доставили в нужный порт, и программа клиента прочитала это сообщение. Но как же программе понять, к чему применить это сообщение? Для этого OSC-сообщение содержит адрес назначения внутри программы клиента. Это очень похоже на параметр назначения MSC-сообщения, как CueList или Cue. Только, как я уже сказал выше, OSC не имеет жесткой привязки к синтаксису адреса, как в MSC, но тем не менее мы должны соблюдать правила описания адреса, которое использует OSC, а именно URL (Uniform Resource Locator).
Эту схему описания адреса пути вы применяете каждый раз, когда пользуетесь интернет-браузером, чтобы попасть в конкретное место на сайте.

image

Эти пути назначения сообщения могут быть разными – в зависимости от функционала, который заложил конкретный производитель. Если вы хотите отправить OSC-сообщение на световую консоль ETC Eos, то его путь должен начинаться с “/eos”, далее нужно указать группу контролируемых параметров пульта (например, “/fader”), далее нужно указать номер фейдера “/1” – и в итоге мы получим полный путь к конкретному фейдеру, который будет выглядеть так: “/eos/fader/1/”. Так же мы можем указать путь к группам, к спискам сцен и другому содержимому пульта.

Идем дальше. Теперь – по аналогии с MSC – вы можете предположить, что далее в сообщении OSC передается команда. Верно, но тут есть своя особенность: в OSC-сообщении передается не команда, а аргумент. В чем же их отличие? Аргумент в OSC-сообщении - это некий контейнер, который передает данные определенного типа. В последней версии OSC 1.1 вы можете использовать следующие типы данных:

Int32
Integer 32bit, этот тип данных может хранить в себе натуральное число в диапазоне от -2 147 483 648 до 2 147 483 647. Этот тип используют, когда нужно передать целочисленный номер: для идентификации номера страницы или фейдера, так как в пульте не существует фейдеров и страниц с дробным номером.
Float32
Float 32bit может хранить в себе действительное число c плавающей запятой в диапазоне от -3.41038 до +3.41038. Этот способ выражения действительного числа позволяет закодировать более точные данные. Часто этим типом данных кодируют уровни фейдеров, вы можете определить диапазон фейдера от нуля до единицы, а вот точность позиционирования фейдера в этом диапазоне может быть огромной, но зачастую производители ограничиваются двумя знаками после запятой.

String
Передает строку, закодированную в формате ASCII. С помощью этого типа вы можете передать имя объекта или целое сообщение. Очень часто это используется в системах дистанционного управления по OSC. К примеру, пульт может передать по OSC информацию об имени кьюлиста, который назначен на конкретный фейдер.

Blob
Binary Large Object передает оригинальный массив байтов. Очень часто его используют для передачи изображений, звука и видео.

Bool
Boolean – это логический тип данных, который может передать либо ложь, либо истину. Самое распространенное его использование – это описание состояния переключателя, который может быть включен (истина) или выключен (ложь). На самом деле в типологии OSC этот тип данных разделен на две части, каждая из которых несет в себе конкретное состояние. Я объединил их, дабы облегчить понимание этих типов.

Impulse
Это не совсем тип данных как таковой, поскольку он не несет в себе информацию о состоянии аргумента, он инициализирует событие. В описании OSC-протокола он обозначается как “Bang” и часто применяется, когда вам нужно передать информацию о действии (скажем, об открытии страницы или любого другого события) без необходимости передачи аргумента.

Null
Это пустой тип данных, который не содержит в себе ничего. Используется довольно редко, но как дополнительная опция присутствует.

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

image

Как видно на схеме, чтобы передать состояние кнопки Flash фейдера номер один на световую консоль Eos, мы должны указать сетевой адрес и порт пульта (192.168.1.101:5004) Далее нужно указать адрес необходимой кнопки, состояние которой мы хотим передать (/eos/fader/1/flash), и в итоге передать аргумент типа Boolean: если кнопка должна быть нажата, то аргумент равен True, если кнопка отпущена, то аргумент равен False.

Резюмируем особенности OSC-протокола
OSC-протокол базируется на интерфейсе передачи данных Ethernet. А это дает сразу несколько преимуществ. Для передачи такого сигнала мы можем использовать стандартное сетевое оборудование, которое намного распространеннее и доступнее, чем специализированные карты синхронизаций. По Ethernet мы можем передать сигнал практически на неограниченное расстояние, используя при этом разные способы передачи: как по радиоканалу, так и по оптике, и по витой паре.

OSC использует протокол передачи данных UDP, который обязывает указывать IP-адрес и порт клиента. Что дает множество преимуществ. К примеру, мы можем на одном сетевом клиенте синхронизировать несколько приложений одновременно, используя один и тот же IP-адрес, но при этом разные порты. Это также позволяет нам настраивать сложные маршруты, делить OSC-сигнал или получать на один клиент сообщения из разных источников без использования дополнительного оборудования, так как этот функционал уже заложен в сетевых протоколах группы TCP/IP.

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

Я считаю, что OSC – самый функциональный и современный протокол синхронизации. С его помощью можно построить сложнейшие системы генеративной синхронизации с большой скоростью передачи данных. При этом, как я уже говорил, благодаря тому, что данный протокол базируется на физическом интерфейсе Ethernet, OSC наследует все преимущества передачи данных по этому интерфейсу. Что делает его намного привлекательнее остальных протоколов синхронизации.


Остались вопросы? Тогда пиши. Facebook, Instagram, Behance, Telegram
Журнал Шоу Мастер. от 1 2019 (96)