MIDI-клавиатура и OBS как аппаратный контроллер (Hammerspoon)
У меня несколько MIDI-клавиатур, в следствии появилась простая идея: использовать одну из них, как физическую панель управления, где клавиши запускают команды. Hammerspoon здесь работает как “прошивка”: принимает MIDI-события, переводит их в действия и управляет OBS по WebSocket.
Пример:
В конфиге есть карта действий smkActions[…], и для ноты 48 назначено:
smkActions[48].label = "OBS: Scene #01"
smkActions[48].fn = function() obsSetSceneByIndex(1) end
Что это значит:
-
smkActions[48] — слот для конкретной MIDI-ноты (48).
-
.label — человекочитаемое имя (для логов/понимания).
-
.fn = function() … end — функция, которая выполняется при нажатии этой MIDI-клавиши.
-
obsSetSceneByIndex(1) — переключить OBS на сцену с индексом 1 (индекс берётся из списка сцен OBS).
Дальше в обработчике MIDI-событий есть логика: выполнять действия только в command mode (который включается sustain-педалью/CC64).
Ключевой фрагмент (суть):
if smkCommandMode and cmdType == "noteOn" then
local note = mdTable.note
local vel = mdTable.velocity or 0
if not note or vel <= 0 then return end
if note < SMK_NOTE_MIN or note > SMK_NOTE_MAX then return end
local act, layer = smkResolveAction(note)
if not act then return end
if not act.hotkey and not act.fn then return end
-- дальше debounce и выполнение act.fn / act.hotkey
end
-
smkCommandMode— булевый флаг “режим команд включён”. -
cmdType == "noteOn"— реагируем на нажатие клавиши (Note On). -
mdTable.note— номер ноты (например, 48). -
mdTable.velocity— сила нажатия; vel <= 0 отсекается (чтобы не триггерить “пустые” события). -
SMK_NOTE_MIN/MAX— ограничение диапазона, чтобы обрабатывать только нужные 25 клавиш. -
smkResolveAction(note)— достаёт действие для конкретной ноты (с учётом возможных слоёв/оверрайдов). -
act.fn— если у ноты есть функция, она будет вызвана.
Дальше obsSetSceneByIndex(1) делает примерно такую цепочку:
-
Получает список сцен OBS (через кеш с маленьким TTL, чтобы не дергать OBS на каждый клик).
-
По индексу 1 берёт имя сцены.
-
Отправляет в OBS команду SetCurrentProgramScene через WebSocket.
Итоговая логика одной клавиши
MIDI note 48 → (command mode ON) → находим smkActions[48] → вызываем obsSetSceneByIndex(1) → OBS переключает сцену на #1.