У меня несколько 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) делает примерно такую цепочку:1. Получает список сцен OBS (через кеш с маленьким TTL, чтобы не дергать OBS на каждый клик).
2. По индексу 1 берёт имя сцены.
3. Отправляет в OBS команду SetCurrentProgramScene через WebSocket.
Итоговая логика одной клавиши
MIDI note 48 → (command mode ON) → находим smkActions[48] → вызываем obsSetSceneByIndex(1) → OBS переключает сцену на #1.
Оглавление темы 📌
Навигация по проектам канала 📍
Все проекты 🎶
#macOSAutomation@annsFlow
💻 annFlow