OBS studio Toggle and Mutex example
This example gives you eight toggle and eight "mutex" key bindings. Mutex: Use the top eight buttons (nearest the USB connector) to bind your scenes. The light on these is mutually exclusive- the one you last pressed should light up. This is the scene you should be broadcasting. Toggle: The bottom eight buttons will toggle on/off, emitting a slightly different keycode for each state. This means they will always indicate the toggle state. Bind these to Mute/Unmute audio by pressing the key once in Mute and once again in Unmute. Keep OBS focussed when using these... to avoid weirdness!
This commit is contained in:
parent
39fd2719f1
commit
c53ac76c35
1 changed files with 133 additions and 0 deletions
133
examples/obs-studio-toggle-and-mutex.py
Normal file
133
examples/obs-studio-toggle-and-mutex.py
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
|
||||||
|
# SPDX-FileCopyrightText: 2021 Philip Howard
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
# This example gives you eight toggle and eight "mutex" key bindings for OBS studio
|
||||||
|
#
|
||||||
|
# MUTEX
|
||||||
|
# Use the top eight buttons (nearest the USB connector) to bind your scenes.
|
||||||
|
# The light on these is mutually exclusive- the one you last pressed should light up,
|
||||||
|
# and this is the scene you should be broadcasting.
|
||||||
|
#
|
||||||
|
# TOGGLE
|
||||||
|
# The bottom eight buttons will toggle on/off, emitting a slightly different keycode
|
||||||
|
# for each state. This means they will *always* indicate the toggle state.
|
||||||
|
# Bind these to Mute/Unmute audio by pressing the key once in Mute and once again in Unmute.
|
||||||
|
#
|
||||||
|
# Keep OBS focussed when using these... to avoid weirdness!
|
||||||
|
|
||||||
|
# Drop the keybow2040.py file into your `lib` folder on your `CIRCUITPY` drive.
|
||||||
|
|
||||||
|
import math
|
||||||
|
import board
|
||||||
|
from keybow2040 import Keybow2040, number_to_xy, hsv_to_rgb
|
||||||
|
|
||||||
|
import usb_hid
|
||||||
|
from adafruit_hid.keyboard import Keyboard
|
||||||
|
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS
|
||||||
|
from adafruit_hid.keycode import Keycode
|
||||||
|
|
||||||
|
# Pick your keycodes here, these are chosen to - mostly - stay out of the way
|
||||||
|
# and use Numpad and regular numbers.
|
||||||
|
# Toggle keybinds (indicated by a Tuple with True) will send:
|
||||||
|
# * CONTROL + SHIFT + KEYCODE - when toggled on
|
||||||
|
# * CONTROL + ALT + KEYCODE - when toggled off
|
||||||
|
keycodes = [
|
||||||
|
(Keycode.KEYPAD_FIVE, True), # Bottom 1
|
||||||
|
(Keycode.KEYPAD_ONE, True), # Bottom 1
|
||||||
|
Keycode.FIVE,
|
||||||
|
Keycode.ONE,
|
||||||
|
(Keycode.KEYPAD_SIX, True), # Bottom 2
|
||||||
|
(Keycode.KEYPAD_TWO, True), # Bottom 2
|
||||||
|
Keycode.SIX,
|
||||||
|
Keycode.TWO,
|
||||||
|
(Keycode.KEYPAD_SEVEN, True), # Bottom 3
|
||||||
|
(Keycode.KEYPAD_THREE, True), # Bottom 3
|
||||||
|
Keycode.SEVEN,
|
||||||
|
Keycode.THREE,
|
||||||
|
(Keycode.KEYPAD_EIGHT, True), # Bottom 4
|
||||||
|
(Keycode.KEYPAD_FOUR, True), # Bottom 4
|
||||||
|
Keycode.EIGHT,
|
||||||
|
Keycode.FOUR
|
||||||
|
]
|
||||||
|
|
||||||
|
# Set up the keyboard and layout
|
||||||
|
keyboard = Keyboard(usb_hid.devices)
|
||||||
|
layout = KeyboardLayoutUS(keyboard)
|
||||||
|
|
||||||
|
# Set up Keybow
|
||||||
|
i2c = board.I2C()
|
||||||
|
keybow = Keybow2040(i2c)
|
||||||
|
keys = keybow.keys
|
||||||
|
|
||||||
|
states = [False for _ in keys]
|
||||||
|
|
||||||
|
# Increment step to shift animation across keys.
|
||||||
|
step = 0
|
||||||
|
active = -1
|
||||||
|
|
||||||
|
for key in keys:
|
||||||
|
@keybow.on_press(key)
|
||||||
|
def press_handler(key):
|
||||||
|
global active
|
||||||
|
print("{} pressed".format(key.number))
|
||||||
|
binding = keycodes[key.number]
|
||||||
|
if binding is None:
|
||||||
|
return
|
||||||
|
if type(binding) is tuple:
|
||||||
|
binding, _ = binding
|
||||||
|
states[key.number] = not states[key.number]
|
||||||
|
if states[key.number]:
|
||||||
|
keyboard.press(Keycode.LEFT_CONTROL, Keycode.LEFT_SHIFT, binding)
|
||||||
|
else:
|
||||||
|
keyboard.press(Keycode.LEFT_CONTROL, Keycode.LEFT_SHIFT, Keycode.LEFT_ALT, binding)
|
||||||
|
else:
|
||||||
|
keyboard.press(Keycode.LEFT_CONTROL, Keycode.LEFT_SHIFT, binding)
|
||||||
|
active = key.number
|
||||||
|
|
||||||
|
@keybow.on_release(key)
|
||||||
|
def release_handler(key):
|
||||||
|
global active
|
||||||
|
print("{} released".format(key.number))
|
||||||
|
binding = keycodes[key.number]
|
||||||
|
if binding is None:
|
||||||
|
return
|
||||||
|
if type(binding) is tuple:
|
||||||
|
binding, _ = binding
|
||||||
|
if states[key.number]:
|
||||||
|
keyboard.release(Keycode.LEFT_CONTROL, Keycode.LEFT_SHIFT, binding)
|
||||||
|
else:
|
||||||
|
keyboard.release(Keycode.LEFT_CONTROL, Keycode.LEFT_SHIFT, Keycode.LEFT_ALT, binding)
|
||||||
|
else:
|
||||||
|
keyboard.release(Keycode.LEFT_CONTROL, Keycode.LEFT_SHIFT, binding)
|
||||||
|
|
||||||
|
@keybow.on_hold(key)
|
||||||
|
def hold_handler(key):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# Always remember to call keybow.update() on every iteration of your loop!
|
||||||
|
keybow.update()
|
||||||
|
|
||||||
|
step += 1
|
||||||
|
|
||||||
|
for i in range(16):
|
||||||
|
# Convert the key number to an x/y coordinate to calculate the hue
|
||||||
|
# in a matrix style-y.
|
||||||
|
x, y = number_to_xy(i)
|
||||||
|
|
||||||
|
# Calculate the hue.
|
||||||
|
hue = (x + y + (step / 20)) / 8
|
||||||
|
hue = hue - int(hue)
|
||||||
|
hue = hue - math.floor(hue)
|
||||||
|
|
||||||
|
# Convert the hue to RGB values.
|
||||||
|
r, g, b = hsv_to_rgb(hue, 1, 1)
|
||||||
|
|
||||||
|
# Display it on the key!
|
||||||
|
if i == active or states[i]:
|
||||||
|
keys[i].set_led(r, g, b)
|
||||||
|
else:
|
||||||
|
keys[i].set_led(int(r / 10.0), int(g / 10.0), int(b / 10.0))
|
Loading…
Reference in a new issue