mirror of
https://github.com/onyx-and-iris/nvda-voicemeeter.git
synced 2025-04-19 03:53:46 +01:00
Compare commits
9 Commits
c248808c7b
...
ac14b7ad0d
Author | SHA1 | Date | |
---|---|---|---|
ac14b7ad0d | |||
78b7e01fa6 | |||
42fad86905 | |||
6c54d28210 | |||
d958167ded | |||
0570138963 | |||
1fdb39a041 | |||
3d7b33c8be | |||
cf5c8f81aa |
@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "nvda_voicemeeter"
|
name = "nvda_voicemeeter"
|
||||||
version = "0.2.1a3"
|
version = "0.2.1b2"
|
||||||
description = "A Voicemeeter app compatible with NVDA"
|
description = "A Voicemeeter app compatible with NVDA"
|
||||||
authors = [
|
authors = [
|
||||||
{ name = "onyx-and-iris", email = "code@onyxandiris.online" },
|
{ name = "onyx-and-iris", email = "code@onyxandiris.online" },
|
||||||
|
@ -10,13 +10,17 @@ class LabelSlider(psg.Frame):
|
|||||||
size = 7
|
size = 7
|
||||||
else:
|
else:
|
||||||
size = 4
|
size = 4
|
||||||
|
if param == "LIMIT":
|
||||||
|
resolution = 1
|
||||||
|
else:
|
||||||
|
resolution = 0.1
|
||||||
layout = [
|
layout = [
|
||||||
[
|
[
|
||||||
psg.Text(param.capitalize(), size=size),
|
psg.Text(param.capitalize(), size=size),
|
||||||
psg.Slider(
|
psg.Slider(
|
||||||
range=range_,
|
range=range_,
|
||||||
default_value=self.default_value(i, param),
|
default_value=self.default_value(i, param),
|
||||||
resolution=0.1,
|
resolution=resolution,
|
||||||
disable_number_display=True,
|
disable_number_display=True,
|
||||||
size=(12, 16),
|
size=(12, 16),
|
||||||
expand_x=True,
|
expand_x=True,
|
||||||
|
@ -48,12 +48,8 @@ class NVDAVMWindow(psg.Window):
|
|||||||
[self[f"PATCH COMPOSITE||PC{i + 1}"].Widget.config(**buttonmenu_opts) for i in range(self.kind.phys_out)]
|
[self[f"PATCH COMPOSITE||PC{i + 1}"].Widget.config(**buttonmenu_opts) for i in range(self.kind.phys_out)]
|
||||||
slider_opts = {"takefocus": 1, "highlightthickness": 1}
|
slider_opts = {"takefocus": 1, "highlightthickness": 1}
|
||||||
for i in range(self.kind.num_strip):
|
for i in range(self.kind.num_strip):
|
||||||
if i < self.kind.phys_in:
|
for param in util.get_slider_params(i, self.vm):
|
||||||
for param in util.get_slider_params(i, self.vm):
|
self[f"STRIP {i}||SLIDER {param}"].Widget.config(**slider_opts)
|
||||||
self[f"STRIP {i}||SLIDER {param}"].Widget.config(**slider_opts)
|
|
||||||
else:
|
|
||||||
for param in ("BASS", "MID", "TREBLE"):
|
|
||||||
self[f"STRIP {i}||SLIDER {param}"].Widget.config(**slider_opts)
|
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].Widget.config(**slider_opts)
|
self[f"STRIP {i}||SLIDER GAIN"].Widget.config(**slider_opts)
|
||||||
if self.kind.name != "basic":
|
if self.kind.name != "basic":
|
||||||
self[f"STRIP {i}||SLIDER LIMIT"].Widget.config(**slider_opts)
|
self[f"STRIP {i}||SLIDER LIMIT"].Widget.config(**slider_opts)
|
||||||
@ -109,6 +105,15 @@ class NVDAVMWindow(psg.Window):
|
|||||||
self[f"{key}||SLIDER"].update(value=value)
|
self[f"{key}||SLIDER"].update(value=value)
|
||||||
for i in range(self.kind.num_strip):
|
for i in range(self.kind.num_strip):
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].update(value=self.vm.strip[i].gain)
|
self[f"STRIP {i}||SLIDER GAIN"].update(value=self.vm.strip[i].gain)
|
||||||
|
if self.kind.name != "basic":
|
||||||
|
self[f"STRIP {i}||SLIDER LIMIT"].update(value=self.vm.strip[i].limit)
|
||||||
|
for param in util.get_slider_params(i, self.vm):
|
||||||
|
if param in ("AUDIBILITY", "BASS", "MID", "TREBLE"):
|
||||||
|
val = getattr(self.vm.strip[i], param.lower())
|
||||||
|
else:
|
||||||
|
target = getattr(self.vm.strip[i], param.lower())
|
||||||
|
val = target.knob
|
||||||
|
self[f"STRIP {i}||SLIDER {param}"].update(value=val)
|
||||||
for i in range(self.kind.num_bus):
|
for i in range(self.kind.num_bus):
|
||||||
self[f"BUS {i}||SLIDER GAIN"].update(value=self.vm.bus[i].gain)
|
self[f"BUS {i}||SLIDER GAIN"].update(value=self.vm.bus[i].gain)
|
||||||
if self.kind.name != "basic":
|
if self.kind.name != "basic":
|
||||||
@ -194,20 +199,23 @@ class NVDAVMWindow(psg.Window):
|
|||||||
|
|
||||||
# Strip Sliders
|
# Strip Sliders
|
||||||
for i in range(self.kind.num_strip):
|
for i in range(self.kind.num_strip):
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<FocusIn>", "||FOCUS IN")
|
for param in util.get_slider_params(i, self.vm) + ("GAIN", "LIMIT"):
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<FocusOut>", "||FOCUS OUT")
|
if self.kind.name == "basic" and param == "LIMIT":
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Left>", "||KEY LEFT")
|
continue
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Right>", "||KEY RIGHT")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<FocusIn>", "||FOCUS IN")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Shift-KeyPress-Left>", "||KEY SHIFT LEFT")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<FocusOut>", "||FOCUS OUT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Shift-KeyPress-Right>", "||KEY SHIFT RIGHT")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Left>", "||KEY LEFT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Control-KeyPress-Left>", "||KEY CTRL LEFT")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Right>", "||KEY RIGHT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Control-KeyPress-Right>", "||KEY CTRL RIGHT")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Shift-KeyPress-Left>", "||KEY SHIFT LEFT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Up>", "||KEY UP")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Shift-KeyPress-Right>", "||KEY SHIFT RIGHT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Down>", "||KEY DOWN")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Control-KeyPress-Left>", "||KEY CTRL LEFT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Shift-KeyPress-Up>", "||KEY SHIFT UP")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Control-KeyPress-Right>", "||KEY CTRL RIGHT")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Shift-KeyPress-Down>", "||KEY SHIFT DOWN")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Up>", "||KEY UP")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Control-KeyPress-Up>", "||KEY CTRL UP")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Down>", "||KEY DOWN")
|
||||||
self[f"STRIP {i}||SLIDER GAIN"].bind("<Control-KeyPress-Down>", "||KEY CTRL DOWN")
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Shift-KeyPress-Up>", "||KEY SHIFT UP")
|
||||||
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Shift-KeyPress-Down>", "||KEY SHIFT DOWN")
|
||||||
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Control-KeyPress-Up>", "||KEY CTRL UP")
|
||||||
|
self[f"STRIP {i}||SLIDER {param}"].bind("<Control-KeyPress-Down>", "||KEY CTRL DOWN")
|
||||||
|
|
||||||
# Bus Params
|
# Bus Params
|
||||||
params = ["MONO", "EQ", "MUTE", "MODE"]
|
params = ["MONO", "EQ", "MUTE", "MODE"]
|
||||||
@ -669,54 +677,232 @@ class NVDAVMWindow(psg.Window):
|
|||||||
self.find_element_with_focus().click()
|
self.find_element_with_focus().click()
|
||||||
|
|
||||||
# Strip Sliders
|
# Strip Sliders
|
||||||
case [["STRIP", index], ["SLIDER", "GAIN"]]:
|
case [
|
||||||
|
["STRIP", index],
|
||||||
|
[
|
||||||
|
"SLIDER",
|
||||||
|
"GAIN"
|
||||||
|
| "COMP"
|
||||||
|
| "GATE"
|
||||||
|
| "DENOISER"
|
||||||
|
| "AUDIBILITY"
|
||||||
|
| "LIMIT"
|
||||||
|
| "BASS"
|
||||||
|
| "MID"
|
||||||
|
| "TREBLE" as param,
|
||||||
|
],
|
||||||
|
]:
|
||||||
label = self.cache["labels"][f"STRIP {index}||LABEL"]
|
label = self.cache["labels"][f"STRIP {index}||LABEL"]
|
||||||
val = values[event]
|
val = values[event]
|
||||||
self.vm.strip[int(index)].gain = val
|
match param:
|
||||||
self.nvda.speak(f"{label} gain slider {val}")
|
case "GAIN":
|
||||||
case [["STRIP", index], ["SLIDER", "GAIN"], ["FOCUS", "IN"]]:
|
self.vm.strip[int(index)].gain = val
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
target = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
target.knob = val
|
||||||
|
case "AUDIBILITY":
|
||||||
|
self.vm.strip[int(index)].audibility = val
|
||||||
|
case "LIMIT":
|
||||||
|
val = int(val)
|
||||||
|
self.vm.strip[int(index)].limit = val
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
setattr(self.vm.strip[int(index)], param.lower(), val)
|
||||||
|
self.nvda.speak(f"{label} {param} slider {val}")
|
||||||
|
case [
|
||||||
|
["STRIP", index],
|
||||||
|
[
|
||||||
|
"SLIDER",
|
||||||
|
"GAIN"
|
||||||
|
| "COMP"
|
||||||
|
| "GATE"
|
||||||
|
| "DENOISER"
|
||||||
|
| "AUDIBILITY"
|
||||||
|
| "LIMIT"
|
||||||
|
| "BASS"
|
||||||
|
| "MID"
|
||||||
|
| "TREBLE" as param,
|
||||||
|
],
|
||||||
|
["FOCUS", "IN"],
|
||||||
|
]:
|
||||||
if self.find_element_with_focus() is not None:
|
if self.find_element_with_focus() is not None:
|
||||||
self.vm.event.pdirty = False
|
self.vm.event.pdirty = False
|
||||||
label = self.cache["labels"][f"STRIP {index}||LABEL"]
|
label = self.cache["labels"][f"STRIP {index}||LABEL"]
|
||||||
val = values[f"STRIP {index}||SLIDER GAIN"]
|
val = values[f"STRIP {index}||SLIDER {param}"]
|
||||||
self.nvda.speak(f"{label} gain slider {val}")
|
self.nvda.speak(f"{label} {param} slider {int(val) if param == 'LIMIT' else val}")
|
||||||
case [["STRIP", index], ["SLIDER", "GAIN"], ["FOCUS", "OUT"]]:
|
case [
|
||||||
|
["STRIP", index],
|
||||||
|
[
|
||||||
|
"SLIDER",
|
||||||
|
"GAIN" | "COMP" | "GATE" | "DENOISER" | "AUDIBILITY" | "LIMIT" | "BASS" | "MID" | "TREBLE",
|
||||||
|
],
|
||||||
|
["FOCUS", "OUT"],
|
||||||
|
]:
|
||||||
self.vm.event.pdirty = True
|
self.vm.event.pdirty = True
|
||||||
case [["STRIP", index], ["SLIDER", "GAIN"], ["KEY", "LEFT" | "RIGHT" | "UP" | "DOWN" as direction]]:
|
case [
|
||||||
val = self.vm.strip[int(index)].gain
|
["STRIP", index],
|
||||||
|
[
|
||||||
|
"SLIDER",
|
||||||
|
"GAIN"
|
||||||
|
| "COMP"
|
||||||
|
| "GATE"
|
||||||
|
| "DENOISER"
|
||||||
|
| "AUDIBILITY"
|
||||||
|
| "LIMIT"
|
||||||
|
| "BASS"
|
||||||
|
| "MID"
|
||||||
|
| "TREBLE" as param,
|
||||||
|
],
|
||||||
|
["KEY", "LEFT" | "RIGHT" | "UP" | "DOWN" as direction],
|
||||||
|
]:
|
||||||
|
match param:
|
||||||
|
case "GAIN":
|
||||||
|
val = self.vm.strip[int(index)].gain
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
target = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
val = target.knob
|
||||||
|
case "AUDIBILITY":
|
||||||
|
val = self.vm.strip[int(index)].audibility
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
val = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
case "LIMIT":
|
||||||
|
val = self.vm.strip[int(index)].limit
|
||||||
|
|
||||||
match direction:
|
match direction:
|
||||||
case "RIGHT" | "UP":
|
case "RIGHT" | "UP":
|
||||||
val += 1
|
val += 1
|
||||||
case "LEFT" | "DOWN":
|
case "LEFT" | "DOWN":
|
||||||
val -= 1
|
val -= 1
|
||||||
self.vm.strip[int(index)].gain = util.check_bounds(val, (-60, 12))
|
|
||||||
self[f"STRIP {index}||SLIDER GAIN"].update(value=val)
|
match param:
|
||||||
|
case "GAIN":
|
||||||
|
self.vm.strip[int(index)].gain = util.check_bounds(val, (-60, 12))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-60, 12)))
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
setattr(target, "knob", util.check_bounds(val, (0, 10)))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (0, 10)))
|
||||||
|
case "AUDIBILITY":
|
||||||
|
self.vm.strip[int(index)].audibility = util.check_bounds(val, (0, 10))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (0, 10)))
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
setattr(self.vm.strip[int(index)], param.lower(), util.check_bounds(val, (-12, 12)))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-12, 12)))
|
||||||
|
case "LIMIT":
|
||||||
|
self.vm.strip[int(index)].limit = util.check_bounds(val, (-40, 12))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-40, 12)))
|
||||||
case [
|
case [
|
||||||
["STRIP", index],
|
["STRIP", index],
|
||||||
["SLIDER", "GAIN"],
|
[
|
||||||
|
"SLIDER",
|
||||||
|
"GAIN"
|
||||||
|
| "COMP"
|
||||||
|
| "GATE"
|
||||||
|
| "DENOISER"
|
||||||
|
| "AUDIBILITY"
|
||||||
|
| "LIMIT"
|
||||||
|
| "BASS"
|
||||||
|
| "MID"
|
||||||
|
| "TREBLE" as param,
|
||||||
|
],
|
||||||
["KEY", "CTRL", "LEFT" | "RIGHT" | "UP" | "DOWN" as direction],
|
["KEY", "CTRL", "LEFT" | "RIGHT" | "UP" | "DOWN" as direction],
|
||||||
]:
|
]:
|
||||||
val = self.vm.strip[int(index)].gain
|
match param:
|
||||||
|
case "GAIN":
|
||||||
|
val = self.vm.strip[int(index)].gain
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
target = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
val = target.knob
|
||||||
|
case "AUDIBILITY":
|
||||||
|
val = self.vm.strip[int(index)].audibility
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
val = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
case "LIMIT":
|
||||||
|
val = self.vm.strip[int(index)].limit
|
||||||
|
|
||||||
match direction:
|
match direction:
|
||||||
case "RIGHT" | "UP":
|
case "RIGHT" | "UP":
|
||||||
val += 3
|
if param in ("COMP", "GATE", "DENOISER", "AUDIBILITY", "BASS", "MID", "TREBLE"):
|
||||||
|
val += 1
|
||||||
|
else:
|
||||||
|
val += 3
|
||||||
case "LEFT" | "DOWN":
|
case "LEFT" | "DOWN":
|
||||||
val -= 3
|
if param in ("COMP", "GATE", "DENOISER", "AUDIBILITY", "BASS", "MID", "TREBLE"):
|
||||||
self.vm.strip[int(index)].gain = util.check_bounds(val, (-60, 12))
|
val -= 1
|
||||||
self[f"STRIP {index}||SLIDER GAIN"].update(value=val)
|
else:
|
||||||
|
val -= 3
|
||||||
|
|
||||||
|
match param:
|
||||||
|
case "GAIN":
|
||||||
|
self.vm.strip[int(index)].gain = util.check_bounds(val, (-60, 12))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-60, 12)))
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
setattr(target, "knob", util.check_bounds(val, (0, 10)))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (0, 10)))
|
||||||
|
case "AUDIBILITY":
|
||||||
|
self.vm.strip[int(index)].audibility = util.check_bounds(val, (0, 10))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (0, 10)))
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
setattr(self.vm.strip[int(index)], param.lower(), util.check_bounds(val, (-12, 12)))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-12, 12)))
|
||||||
|
case "LIMIT":
|
||||||
|
self.vm.strip[int(index)].limit = util.check_bounds(val, (-40, 12))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-40, 12)))
|
||||||
case [
|
case [
|
||||||
["STRIP", index],
|
["STRIP", index],
|
||||||
["SLIDER", "GAIN"],
|
[
|
||||||
|
"SLIDER",
|
||||||
|
"GAIN"
|
||||||
|
| "COMP"
|
||||||
|
| "GATE"
|
||||||
|
| "DENOISER"
|
||||||
|
| "AUDIBILITY"
|
||||||
|
| "LIMIT"
|
||||||
|
| "BASS"
|
||||||
|
| "MID"
|
||||||
|
| "TREBLE" as param,
|
||||||
|
],
|
||||||
["KEY", "SHIFT", "LEFT" | "RIGHT" | "UP" | "DOWN" as direction],
|
["KEY", "SHIFT", "LEFT" | "RIGHT" | "UP" | "DOWN" as direction],
|
||||||
]:
|
]:
|
||||||
val = self.vm.strip[int(index)].gain
|
match param:
|
||||||
|
case "GAIN":
|
||||||
|
val = self.vm.strip[int(index)].gain
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
target = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
val = target.knob
|
||||||
|
case "AUDIBILITY":
|
||||||
|
val = self.vm.strip[int(index)].audibility
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
val = getattr(self.vm.strip[int(index)], param.lower())
|
||||||
|
case "LIMIT":
|
||||||
|
val = self.vm.strip[int(index)].limit
|
||||||
|
|
||||||
match direction:
|
match direction:
|
||||||
case "RIGHT" | "UP":
|
case "RIGHT" | "UP":
|
||||||
val += 0.1
|
if param == "LIMIT":
|
||||||
|
val += 1
|
||||||
|
else:
|
||||||
|
val += 0.1
|
||||||
case "LEFT" | "DOWN":
|
case "LEFT" | "DOWN":
|
||||||
val -= 0.1
|
if param == "LIMIT":
|
||||||
self.vm.strip[int(index)].gain = util.check_bounds(val, (-60, 12))
|
val -= 1
|
||||||
self[f"STRIP {index}||SLIDER GAIN"].update(value=val)
|
else:
|
||||||
|
val -= 0.1
|
||||||
|
|
||||||
|
match param:
|
||||||
|
case "GAIN":
|
||||||
|
self.vm.strip[int(index)].gain = util.check_bounds(val, (-60, 12))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-60, 12)))
|
||||||
|
case "COMP" | "GATE" | "DENOISER":
|
||||||
|
setattr(target, "knob", util.check_bounds(val, (0, 10)))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (0, 10)))
|
||||||
|
case "AUDIBILITY":
|
||||||
|
self.vm.strip[int(index)].audibility = util.check_bounds(val, (0, 10))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (0, 10)))
|
||||||
|
case "BASS" | "MID" | "TREBLE":
|
||||||
|
setattr(self.vm.strip[int(index)], param.lower(), util.check_bounds(val, (-12, 12)))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-12, 12)))
|
||||||
|
case "LIMIT":
|
||||||
|
self.vm.strip[int(index)].limit = util.check_bounds(val, (-40, 12))
|
||||||
|
self[f"STRIP {index}||SLIDER {param}"].update(value=util.check_bounds(val, (-40, 12)))
|
||||||
|
|
||||||
# Bus Params
|
# Bus Params
|
||||||
case [["BUS", index], [param]]:
|
case [["BUS", index], [param]]:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user