TGViewer
annFlow annFlow @annsflow · 33 subscribers
Post #90 40
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.


Оглавление темы 📌
Навигация по проектам канала 📍
Все проекты 🎶

#macOSAutomation@annsFlow

💻 annFlow
  • ❤ 1
  • 👀 1
More from @annsflow
  1. Sep 24, 2026LiveContext в реальном разговоре. На видео я разбираюсь с претензией по недоставленному за…
  2. Sep 21, 2026Как LiveContext разделяет мой голос и голос собеседника Чтобы LiveContext мог понимать раз…
  3. Sep 16, 2026Почему мне оказалось недостаточно просто сохранять разговоры В VoxBase я решал проблему то…
  4. Sep 15, 2026Как я построил LiveContext, или Как связать живой разговор с памятью проекта ● Почему мне…
  5. Sep 14, 2026annFlow pinned a video
  6. Sep 14, 2026Самая неожиданная вакансия, которую нашел мой бот Моя система постоянно сама ищет вакансии…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →