В статье кратко описано несколько подобных программ, а также рассказано об опыте разработки собственного ПО в этой области, т.к. доступные программы не обладали всеми необходимыми возможностями одновременно.
В начале 2012 года, на новогодних каникулах, я наткнулся на любопытный ролик:
В ролике видно, что в живую поют люди, как написано в комментариях, расположенные в разных студиях. Стало интересно что же это за технология. Единственной зацепкой стало слово NETDUETTO. Оказалось, что существует такое ПО, производимое одной из лабораторий японской компании Yamaha. Да вот беда, программа устанавливается только на японскую локаль. После поисков в сети был найден неофициальный дистрибутив, устанавливающийся на любую локаль. Но теперь уже сам исполняемый файл не запускался. В комплекте с дистрибутивом был патч, но он мне не понравился, и я решил сделать свой патч. Найдя код определения локали через IDA и пропатчив ее подстановкой nop'ов в HEX-редакторе программа запустилась, но интерфейс не отображался. Ибо был сделан под японскую локаль. Повозившись в Restorator'е, я обучил программу англоязычному интерфейсу (который, к слову, был в самом .exe-файле, просто неактивен) и можно было начать проводить опыты (ссылка).
Программа отлично работает, поддерживаются до 4х участников музыкальной онлайн-репетиции. Да вот незадача. Максимальное качество аудио — 44.1 кгц / моно. Моно мне, как клавишнику (а у клавишных инструментов стерео-эффекты порою суровая необходимость), однозначно не понравилось и начались поиски аналогов.
Единственным адекватным аналогом оказался Ninjam. Но он использовал компьютер одного из участников онлайн-репетиции в качестве сервера, так что звук от одного участника к другому идет через этот сервер, а не непрямую. С учетом специфики, когда важны миллисекунды для слаженной игры, подобное промежуточное звено недопустимо (Netduetto работает напрямую, каждый участник онлайн-репетиции обменивается аудио-данными с каждым). И, даже не опробовав данный инструмент, я принялся писать свою программу с поддержкой как стерео-режима, так и работающую без промежуточного сервера.
Но сначала упомяну еще одну серьезную программу со схожим функционалом. Она отличается от остальных разделением на две части. Одна — для звукорежиссера, и запускается из-под DAW (Digital Audio Workstation — общее название профессиональных программ для работы со звуком), а другая — для исполнителя — отдельным исполняемым файлом. Еще одно ограничение — в отличии от остальных программ, эта связывает только двух людей и позиционируется не как для репетиции, а как для удаленной записи без необходимости посещать студию. Но на данный момент опробовать ее могут лишь обладатели Cubase 7, к коим себя, к сожалению, не отношу.
Так вот, моя разработка. Используя многолетние наблюдения за торрент-клиентом mTorrent, а также опыт работы с UDP, эта программа была написана. Далее я хочу рассказать о некоторых вещах, которые мне показались интересными в процессе разработки программы.
Программа написана на чистом Winapi. Это обусловлено тем, что мне нужно было сделать исполняемый файл, который бы запускался безо всяких установок себя это раз. А также без установки какого бы то ни было стороннего ПО или библиотек (таких, как например .NET) это два. В итоге файл размером чуть более 100 кбайт является полнофункциональным и работает даже на Windows XP SP2.
Обнаружение собственного ip-адреса изнутри программы при отсутствии своих серверов в интернете (которые есть, например у Yamaha и которые используются в Netduetto для хранения информации о т.н. «комнатах» с музыкантами) оказалось неочевидным. Ведь интернет может быть как прямым, так и за роутером (грубо говоря, конечно). А нужно определить именно внешний ip-адрес, а не адрес оконечной локальной сети, возвращаемый штатными функциями определения адреса интерфейса. Поэтому был найден сайт, который отвечает небольшой страничкой с вашим внешним ip-адресом. Поскольку таких сайтов в интернете огромное количество, то был выбран именно тот, размер которого минимальный и дизайн страницы которого не менялся уже несколько лет.
Буферизация, или борьба с лишними задержками сигнала. Вот взяли вы гитару, подключили к микрофонному входу звуковой карты компьютера, взяли аккорд, и что же дальше? А дальше сигнал оцифровывается АЦП звуковой карты, и n отсчетов (где n — число, кратное 2-м; обычно 128, 256 или 512) передаются в ASIO-драйвер. Программа (например как Netduetto, так и Music Over The World Tool) имеет доступ к этому драйверу, который сигнализирует об обновлении n отсчетов данных в этом буфере (входной буфер ASIO-драйвера). Итого периодично в программе оказываются данные об n отсчетах звукового сигнала. Также периодично по сети в программы Netduetto и Music Over The World Tool (сейчас я сравниваю именно их, т.к. есть одно важное отличие в плане буферизации) поступают данные от других участников онлайн-репетиции в виде сетевых пакетов, содержащих m отсчетов звукового сигнала от каждого удаленного участника. Так вот, в программе есть два события — приняты новые n отсчетов звукового сигнала со входа звуковой карты, и приняты новые m отсчетов звукового сигнала от удаленного участника по сети. N отсчетов: передаются в выходной ASIO-буфер (чтобы вы сами слышали, что играете), а также посылаются по сети остальным участникам онлайн-репетиции. M отсчетов: а вот тут нас поджидает главное отличие программы Music Over The World Tool от Netduetto. В Netduetto данные от удаленного участника попадают в промежуточный буфер, который имеет динамически подстраиваемый размер, в зависимости от ping-а между участниками, от размера входного и выходного буферов ASIO-драйвера и от настроек сжатия аудиопотоков участников. Тем самым в Netduetto схема приема отсчетов звукового сигнала от удаленных участников выглядит так:
(m отсчетов, принятые по сети) -> (промежуточный буфер) -> (выходной буфер ASIO-драйвера) -> (ЦАП звуковой карты)
Тогда как в программе Music Over The World Tool эта схема выглядит так:
(m отсчетов, принятые по сети) -> (выходной буфер ASIO-драйвера) -> (ЦАП звуковой карты)
А что значит отсутствие буфера? Это значит что собеседник услышит ваш аккорд на несколько миллисекунд раньше. А что такое несколько миллисекунд? Много или мало? А контексте конкретной задачи это достаточно ощутимо. Без этого буфера в Music Over The World Tool можно без проблем играть на темпе 120-140. Конечно, чудес не бывает, и за все приходится платить — нужно устанавливать на всех компьютерах участников одинаковый размер входных и выходных буферов ASIO-драйверов. Также при подобном подходе можно передавать только сырые несжатые данные. Но оно того стоит.
Далее, поскольку Music Over The World Tool работает на основе p2p-технологий, пришлось повозиться, пока был отлажен механизм, при котором на ip-адрес отключившегося пира перестают слаться UDP-пакеты с отсчетами звукового сигнала остальных участников. По служебному каналу (отдельный порт UDP) от каждого к каждому участнику онлайн-репетиции раз в секунду передается список ip-адресов, с которыми он соединен в данный момент. И если один из участников отсоединился (закрыл программу), то на его ip-адрес по-прежнему продолжал сыпаться град из UDP-пакетов основного канала отсчетов аудиосигнала (отдельный порт UDP для каждого участника). Чтобы этого избежать, пришлось ввести контроль обмена данных по основному каналу. А также хранение таблицы всех ip-адресов, с которыми когда-либо была связь и неотправление пакетов с отсчетами аудиосигнала по тем адресам, от которых вот уже несколько секунд не приходили данные.
Еще одно важное отличие от остальных программ — интегрированная поддержка VST, и даже VSTi (который подключается опосредовано, через VST FLStudio). Т.е. из этой программы можно повесить обработчик, и, например, ваш сыгранный аккорд будет звучать как на перегруженной электрогитаре. А также можно подключить MIDI-клавиатуру и играть VSTi-инструментами. И все без необходимости продумывать роутинг аудиосигналов или запускать сторонние программы (за исключением необходимости наличия VST-версии FLStudio для поддержки VSTi).
Кстати о роутинге аудиосигналов. В комплекте с Netduetto устанавливается замечательный драйвер, который способен заменить набивший оскомину VAC (в VAC коммутация выхода на вход происходит на верхнем уровне абстракции через отдельное приложение Windows, что отнимает больше ресурсов и менее эффективно и изящно, чем в драйвере Yamaha, где коммутация выхода на вход происходит внутри ядра драйвера). Помимо основного его предназначения (в Netduetto на него дублируется весь выходной сигнал ASIO-драйвера, что полезно, например, при трансляции этого аудио в интернет) с его помощью можно подключить выход DAW ко входу как минимум Netduetto или Music Over The World Tool.
Если кто дочитал до этого места, но при этом с трудом представляет что это вообще такое и зачем. Это реализации технологий, которые делают незаметными расстояния. Можно сидеть дома перед компьютером и играть совместно с находящимися за много километров друзьями музыку так, как будто бы они находятся в одной комнате с вами. С качеством CD-audio.
PS: History. Long times ago… Несколько лет назад наши соотечественники уже создавали подобную программу. Но тогда не было ни ASIO, ни современного интернета. Изначально программа называлась Omnimusic, затем стала проектом Musigy. На данный момент следов того проекта в интернете не обнаружено.
UPD 15.11.20
Обновлены ссылки.
Кроме того, в свое время история получила интересное развитие. В 2014 году я заметил почту обратной связи на сайте Ямахи. Я написал им, попросив поддержку стерео-режима (на очень ломаном и глупом английском, да).
И вот, вскоре, поддержка стерео-режима появилась в Netduetto 2. На данный момент Netduetto 2 — это именно та программа для онлайн-репетиций через интернет, которую я рекомендую. Да, она на японском, но один мой камрад набросал инструкцию какая кнопка за что отвечает. Вот она (это лучше, чем ничего).
Кроме того, за последнее время мне нет-нет да попадались аналогичные программы, имеющие поддержку онлайн-игры по сети (но функционал их я не тестировал). Вот их названия: VSTunnel, VoiceMeeter Banana, ASIO Link Pro.
Еще один забавный момент. Когда началась самоизоляция из-за ковида, весной 2020 года личка на хабре и вконтакте была завалена просьбами скинуть программу. Люди даже скооперировлаись в теме на пикабу про мою прогу и обменивались ссылками.
Кроме того, еще мною была обнаружена некая версия RC5 моей программы, от 2015 года. В описании многообещающе написано «В 5 раз уменьшена интенсивность трафика данных от каждого участника (+теперь пакеты не дробятся роутером из-за превышения MTU size). Введено полное резервирование канала связи от каждого участника, в следствие чего вероятность искажений звука на плохих каналах связи уменьшена в два раза.» Но помнится, она работала как-то странно. Вот она. Качать на свой страх и риск..)
Предисловие
В начале 2012 года, на новогодних каникулах, я наткнулся на любопытный ролик:
В ролике видно, что в живую поют люди, как написано в комментариях, расположенные в разных студиях. Стало интересно что же это за технология. Единственной зацепкой стало слово NETDUETTO. Оказалось, что существует такое ПО, производимое одной из лабораторий японской компании Yamaha. Да вот беда, программа устанавливается только на японскую локаль. После поисков в сети был найден неофициальный дистрибутив, устанавливающийся на любую локаль. Но теперь уже сам исполняемый файл не запускался. В комплекте с дистрибутивом был патч, но он мне не понравился, и я решил сделать свой патч. Найдя код определения локали через IDA и пропатчив ее подстановкой nop'ов в HEX-редакторе программа запустилась, но интерфейс не отображался. Ибо был сделан под японскую локаль. Повозившись в Restorator'е, я обучил программу англоязычному интерфейсу (который, к слову, был в самом .exe-файле, просто неактивен) и можно было начать проводить опыты (ссылка).
Netduetto
Программа отлично работает, поддерживаются до 4х участников музыкальной онлайн-репетиции. Да вот незадача. Максимальное качество аудио — 44.1 кгц / моно. Моно мне, как клавишнику (а у клавишных инструментов стерео-эффекты порою суровая необходимость), однозначно не понравилось и начались поиски аналогов.
К слову, в одной из бета-версий Netduetto была поддержка стерео-режима
Ninjam
Единственным адекватным аналогом оказался Ninjam. Но он использовал компьютер одного из участников онлайн-репетиции в качестве сервера, так что звук от одного участника к другому идет через этот сервер, а не непрямую. С учетом специфики, когда важны миллисекунды для слаженной игры, подобное промежуточное звено недопустимо (Netduetto работает напрямую, каждый участник онлайн-репетиции обменивается аудио-данными с каждым). И, даже не опробовав данный инструмент, я принялся писать свою программу с поддержкой как стерео-режима, так и работающую без промежуточного сервера.
Steinberg VST Connect SE
Но сначала упомяну еще одну серьезную программу со схожим функционалом. Она отличается от остальных разделением на две части. Одна — для звукорежиссера, и запускается из-под DAW (Digital Audio Workstation — общее название профессиональных программ для работы со звуком), а другая — для исполнителя — отдельным исполняемым файлом. Еще одно ограничение — в отличии от остальных программ, эта связывает только двух людей и позиционируется не как для репетиции, а как для удаленной записи без необходимости посещать студию. Но на данный момент опробовать ее могут лишь обладатели Cubase 7, к коим себя, к сожалению, не отношу.
Music Over The World Tool
Так вот, моя разработка. Используя многолетние наблюдения за торрент-клиентом mTorrent, а также опыт работы с UDP, эта программа была написана. Далее я хочу рассказать о некоторых вещах, которые мне показались интересными в процессе разработки программы.
Программа написана на чистом Winapi. Это обусловлено тем, что мне нужно было сделать исполняемый файл, который бы запускался безо всяких установок себя это раз. А также без установки какого бы то ни было стороннего ПО или библиотек (таких, как например .NET) это два. В итоге файл размером чуть более 100 кбайт является полнофункциональным и работает даже на Windows XP SP2.
Обнаружение собственного ip-адреса изнутри программы при отсутствии своих серверов в интернете (которые есть, например у Yamaha и которые используются в Netduetto для хранения информации о т.н. «комнатах» с музыкантами) оказалось неочевидным. Ведь интернет может быть как прямым, так и за роутером (грубо говоря, конечно). А нужно определить именно внешний ip-адрес, а не адрес оконечной локальной сети, возвращаемый штатными функциями определения адреса интерфейса. Поэтому был найден сайт, который отвечает небольшой страничкой с вашим внешним ip-адресом. Поскольку таких сайтов в интернете огромное количество, то был выбран именно тот, размер которого минимальный и дизайн страницы которого не менялся уже несколько лет.
Буферизация, или борьба с лишними задержками сигнала. Вот взяли вы гитару, подключили к микрофонному входу звуковой карты компьютера, взяли аккорд, и что же дальше? А дальше сигнал оцифровывается АЦП звуковой карты, и n отсчетов (где n — число, кратное 2-м; обычно 128, 256 или 512) передаются в ASIO-драйвер. Программа (например как Netduetto, так и Music Over The World Tool) имеет доступ к этому драйверу, который сигнализирует об обновлении n отсчетов данных в этом буфере (входной буфер ASIO-драйвера). Итого периодично в программе оказываются данные об n отсчетах звукового сигнала. Также периодично по сети в программы Netduetto и Music Over The World Tool (сейчас я сравниваю именно их, т.к. есть одно важное отличие в плане буферизации) поступают данные от других участников онлайн-репетиции в виде сетевых пакетов, содержащих m отсчетов звукового сигнала от каждого удаленного участника. Так вот, в программе есть два события — приняты новые n отсчетов звукового сигнала со входа звуковой карты, и приняты новые m отсчетов звукового сигнала от удаленного участника по сети. N отсчетов: передаются в выходной ASIO-буфер (чтобы вы сами слышали, что играете), а также посылаются по сети остальным участникам онлайн-репетиции. M отсчетов: а вот тут нас поджидает главное отличие программы Music Over The World Tool от Netduetto. В Netduetto данные от удаленного участника попадают в промежуточный буфер, который имеет динамически подстраиваемый размер, в зависимости от ping-а между участниками, от размера входного и выходного буферов ASIO-драйвера и от настроек сжатия аудиопотоков участников. Тем самым в Netduetto схема приема отсчетов звукового сигнала от удаленных участников выглядит так:
(m отсчетов, принятые по сети) -> (промежуточный буфер) -> (выходной буфер ASIO-драйвера) -> (ЦАП звуковой карты)
Тогда как в программе Music Over The World Tool эта схема выглядит так:
(m отсчетов, принятые по сети) -> (выходной буфер ASIO-драйвера) -> (ЦАП звуковой карты)
А что значит отсутствие буфера? Это значит что собеседник услышит ваш аккорд на несколько миллисекунд раньше. А что такое несколько миллисекунд? Много или мало? А контексте конкретной задачи это достаточно ощутимо. Без этого буфера в Music Over The World Tool можно без проблем играть на темпе 120-140. Конечно, чудес не бывает, и за все приходится платить — нужно устанавливать на всех компьютерах участников одинаковый размер входных и выходных буферов ASIO-драйверов. Также при подобном подходе можно передавать только сырые несжатые данные. Но оно того стоит.
Далее, поскольку Music Over The World Tool работает на основе p2p-технологий, пришлось повозиться, пока был отлажен механизм, при котором на ip-адрес отключившегося пира перестают слаться UDP-пакеты с отсчетами звукового сигнала остальных участников. По служебному каналу (отдельный порт UDP) от каждого к каждому участнику онлайн-репетиции раз в секунду передается список ip-адресов, с которыми он соединен в данный момент. И если один из участников отсоединился (закрыл программу), то на его ip-адрес по-прежнему продолжал сыпаться град из UDP-пакетов основного канала отсчетов аудиосигнала (отдельный порт UDP для каждого участника). Чтобы этого избежать, пришлось ввести контроль обмена данных по основному каналу. А также хранение таблицы всех ip-адресов, с которыми когда-либо была связь и неотправление пакетов с отсчетами аудиосигнала по тем адресам, от которых вот уже несколько секунд не приходили данные.
Еще одно важное отличие от остальных программ — интегрированная поддержка VST, и даже VSTi (который подключается опосредовано, через VST FLStudio). Т.е. из этой программы можно повесить обработчик, и, например, ваш сыгранный аккорд будет звучать как на перегруженной электрогитаре. А также можно подключить MIDI-клавиатуру и играть VSTi-инструментами. И все без необходимости продумывать роутинг аудиосигналов или запускать сторонние программы (за исключением необходимости наличия VST-версии FLStudio для поддержки VSTi).
Кстати о роутинге аудиосигналов. В комплекте с Netduetto устанавливается замечательный драйвер, который способен заменить набивший оскомину VAC (в VAC коммутация выхода на вход происходит на верхнем уровне абстракции через отдельное приложение Windows, что отнимает больше ресурсов и менее эффективно и изящно, чем в драйвере Yamaha, где коммутация выхода на вход происходит внутри ядра драйвера). Помимо основного его предназначения (в Netduetto на него дублируется весь выходной сигнал ASIO-драйвера, что полезно, например, при трансляции этого аудио в интернет) с его помощью можно подключить выход DAW ко входу как минимум Netduetto или Music Over The World Tool.
Делается это так.
Кроме того, можно установить не одну копию этих виртуальных аудиодрайверов.Запускается DAW, выбирается ASIO4ALL. В настройках ASIO4ALL для DAW выставляется:
— входной канал — входной канал звуковой карты;
— выходной канал — выходной канал виртуального аудиоустройства Yamaha.
В настройках Netduetto или Music Over The World Tool выбирается ASIO4ALL с настройками:
— входной канал — входной канал виртуального аудиоустройства Yamaha;
— выходной канал — выходной канал звуковой карты.
— входной канал — входной канал звуковой карты;
— выходной канал — выходной канал виртуального аудиоустройства Yamaha.
В настройках Netduetto или Music Over The World Tool выбирается ASIO4ALL с настройками:
— входной канал — входной канал виртуального аудиоустройства Yamaha;
— выходной канал — выходной канал звуковой карты.
Если кто дочитал до этого места, но при этом с трудом представляет что это вообще такое и зачем. Это реализации технологий, которые делают незаметными расстояния. Можно сидеть дома перед компьютером и играть совместно с находящимися за много километров друзьями музыку так, как будто бы они находятся в одной комнате с вами. С качеством CD-audio.
PS: History. Long times ago… Несколько лет назад наши соотечественники уже создавали подобную программу. Но тогда не было ни ASIO, ни современного интернета. Изначально программа называлась Omnimusic, затем стала проектом Musigy. На данный момент следов того проекта в интернете не обнаружено.
UPD 15.11.20
Обновлены ссылки.
Кроме того, в свое время история получила интересное развитие. В 2014 году я заметил почту обратной связи на сайте Ямахи. Я написал им, попросив поддержку стерео-режима (на очень ломаном и глупом английском, да).
Письмо.
И вот, вскоре, поддержка стерео-режима появилась в Netduetto 2. На данный момент Netduetto 2 — это именно та программа для онлайн-репетиций через интернет, которую я рекомендую. Да, она на японском, но один мой камрад набросал инструкцию какая кнопка за что отвечает. Вот она (это лучше, чем ничего).
Кроме того, за последнее время мне нет-нет да попадались аналогичные программы, имеющие поддержку онлайн-игры по сети (но функционал их я не тестировал). Вот их названия: VSTunnel, VoiceMeeter Banana, ASIO Link Pro.
Еще один забавный момент. Когда началась самоизоляция из-за ковида, весной 2020 года личка на хабре и вконтакте была завалена просьбами скинуть программу. Люди даже скооперировлаись в теме на пикабу про мою прогу и обменивались ссылками.
Кроме того, еще мною была обнаружена некая версия RC5 моей программы, от 2015 года. В описании многообещающе написано «В 5 раз уменьшена интенсивность трафика данных от каждого участника (+теперь пакеты не дробятся роутером из-за превышения MTU size). Введено полное резервирование канала связи от каждого участника, в следствие чего вероятность искажений звука на плохих каналах связи уменьшена в два раза.» Но помнится, она работала как-то странно. Вот она. Качать на свой страх и риск..)