12 из 132 мин

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) делает примерно такую цепочку:

  1. Получает список сцен OBS (через кеш с маленьким TTL, чтобы не дергать OBS на каждый клик).

  2. По индексу 1 берёт имя сцены.

  3. Отправляет в OBS команду SetCurrentProgramScene через WebSocket.

Итоговая логика одной клавиши

MIDI note 48 → (command mode ON) → находим smkActions[48] → вызываем obsSetSceneByIndex(1) → OBS переключает сцену на #1.

Мы встречаемся на пороге между условной нормой и хаосом Бессмысленность и скоротечность
Оглавление серии
  1. Клавиатурные слои
  2. Karabiner = набор JSON-правил
  3. 1) Caps Lock = Hyper
  4. 2) Слой на Space: tap = пробел, hold = F18
  5. 3) backtick hold = F17
  6. 4) RU-раскладка: точечные правила только для русского набора
  7. Hammerspoon
  8. Window Manager в Hammerspoon
  9. Медиа-контроль как сценарии в Hammerspoon
  10. Hammerspoon как локальный сервер и “пульт” управления
  11. Мониторы и стабильность рабочего места (Hammerspoon)
  12. MIDI-клавиатура и OBS как аппаратный контроллер (Hammerspoon)
  13. Тема клавиатурных слоев на этом этапе закрыта.