Как я привязал MIDI-контроллер к эфиру в браузере
Когда мы сделали живой эфир в браузере на Тьюнио, мышка сразу стала самым слабым местом. В эфире нужно одновременно убрать музыку, открыть микрофон, запустить джингл и не промахнуться.
Я хотел, чтобы обычный MIDI-контроллер стал для студии таким же элементом управления, как микшер на столе.
Что хотелось получить
В Тьюнио эфир устроен так: пока ведущий не нажал «В эфир», играет обычная автоматическая ротация из AI-музыки. После старта поверх потока идет живой выпуск. После стопа поток сам возвращается к музыке.
Это удобно, но для ведущего интерфейс должен быть быстрым. Кнопка «В эфир» не должна прятаться среди вкладок. Пэд с джинглом должен быть под пальцем. Фейдер гостя должен быть фейдером, а не маленьким ползунком под курсором.
Поэтому я взялся за поддержку MIDI. Не для музыкантов, а для людей, которые ведут эфир. Нам были нужны простые вещи:
- пэды запускают джинглы
- фейдеры двигают громкость каналов
- кнопки включают Air, Mute, CUE и старт эфира
- контроллер показывает состояние обратно, если умеет светиться
Я пошел через Web MIDI. Это API браузера, поэтому не нужен отдельный софт, виртуальные кабели и OBS только ради управления. Подключил USB-контроллер, открыл студию, браузер увидел устройство.
С этим решением сразу пришел компромисс. В Chrome и Edge все нормально. В Safari Web MIDI нет, и красиво обойти это внутри браузера нельзя. Мне это до сих пор не нравится, но тащить нативное приложение только ради Safari было бы хуже.
Самым сложным оказался не MIDI, а люди с разными контроллерами
MIDI-сообщение само по себе не многословное. Пришло событие. Есть номер контрола. Есть значение. На этом все.
Но контроллеры разные. У одного 8 пэдов в ряд. У другого сетка 4×4. У третьего есть фейдеры, ручки и транспортные кнопки. Еще у разных устройств кнопки могут вести себя по-разному: где-то нажал — значение 127, отпустил — 0, а где-то кнопка работает как переключатель.
Первый риск был сделать настройку, где человек вручную выбирает тип контрола, номер, канал и режим. Это быстро превращается в таблицу, которую никто не хочет трогать перед эфиром.
В результате - был сделан режим обучения MIDI. В студии выбираешь действие, потом трогаешь нужную кнопку на контроллере. Нажимаешь пэд, двигаешь фейдер, крутишь ручку. Студия запоминает привязку.
Но тут появилась неприятная часть: надо понять, что именно человек потрогал. Кнопку или фейдер.
После первого события студия короткое время смотрит на поведение контрола. Если значение один раз щелкнуло между крайними состояниями, это похоже на кнопку. Если оно плавно прошло диапазон, это фейдер или ручка.
Это не магия. Это просто эвристика. Но она убирает лишний шаг из настройки. Для эфира это важнее, чем идеальная академическая модель MIDI.
Экран пришлось подстраивать под железо
После привязок появилась другая мелочь, которая оказалась не мелочью. Если на контроллере пэды стоят 4×4, а на экране они идут длинным рядом, ведущий начинает ошибаться.
Рука помнит физическую сетку. Глаза ищут то же самое на экране. Если верхний левый пэд на железе запускает не верхний левый джингл на экране, доверия к системе нет.
Поэтому я дал настраивать количество пэдов и количество в ряду. Ничего умного. Просто чтобы сетка на экране совпала с пластиком на столе.
С каналами было сложнее. Канал «Гость 1» не равен конкретному человеку навсегда. Сегодня в первом кресле один гость, завтра другой. Если привязать фейдер к внутреннему id участника, профиль пульта быстро протухнет.
Я стал привязывать фейдеры к слотам. Есть слот «Гость 1». Кто сейчас сидит в нем, того и ведет фейдер. Это простое решение, но оно спасает профили раскладки. Можно один раз собрать пульт и использовать его снова.
То же относится к индикаторам. Air, Mute, CUE и уровни нельзя держать только на экране. Если ведущий смотрит в заметки или на гостя, он все равно должен видеть, что канал заглушен.
Поэтому студия не только слушает MIDI, но и отвечает контроллеру. Когда канал в эфире или включен mute, мы отправляем состояние обратно, и кнопка на контроллере загорается. Там, где устройство это поддерживает, стол начинает показывать правду об эфире.
Что я бы сделал аккуратнее
Я рад, что мы не стали делать отдельную программу. Браузерная студия осталась браузерной. Это сильно упростило вход в эфир: нет звуковой карты, нет внешнего энкодера, нет схемы из пяти окон.
Но у браузерного подхода есть цена. Web MIDI зависит от браузера. Разрешения зависят от браузера. Поведение устройств тоже не всегда одинаковое. Когда работаешь с аудио, хочется полной власти над системой, а в браузере ее никогда нет.
Еще меня немного раздражает, что хорошая настройка пульта все равно требует усилий. Надо назвать каналы понятно. Надо разложить джинглы так, чтобы рука их запомнила. Надо не вешать критические действия на соседние кнопки, если можно промахнуться.
Кодом это не исправить. Поэтому я дал профили, MIDI настроек, подсветку и сетку. Но эфир остается живым местом, где интерфейс должен помогать человеку, а не думать за него.
Если вы делали управление живым аудио через MIDI или горячие клавиши, как вы решали проблему разных контроллеров и случайных нажатий?