mirror of
https://github.com/onyx-and-iris/nvda-voicemeeter.git
synced 2026-04-07 18:03:35 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c385476cc4 | |||
| 1c09556c61 | |||
| 421688eff8 | |||
| bdd570738a | |||
| 71b137a9c2 | |||
| 912eb8c14d |
6
pdm.lock
generated
6
pdm.lock
generated
@@ -251,13 +251,13 @@ files = [
|
||||
|
||||
[[package]]
|
||||
name = "voicemeeter-api"
|
||||
version = "2.4.10"
|
||||
version = "2.4.11"
|
||||
requires_python = ">=3.10,<4.0"
|
||||
summary = "A Python wrapper for the Voiceemeter API"
|
||||
dependencies = [
|
||||
"tomli<3.0.0,>=2.0.1; python_version < \"3.11\"",
|
||||
]
|
||||
files = [
|
||||
{file = "voicemeeter_api-2.4.10-py3-none-any.whl", hash = "sha256:2f75acb7b472e56b6bd8d4f1141f32d948c55ef9b30d5a08e085a1c8e76e2464"},
|
||||
{file = "voicemeeter_api-2.4.10.tar.gz", hash = "sha256:1d8dfc1e8922179f8b97c90b90b9ed051082018c6af5feb1d48250140a02d40c"},
|
||||
{file = "voicemeeter_api-2.4.11-py3-none-any.whl", hash = "sha256:7a1b290d90c851204438c18e2d343e568c242fcd1e664c5b88d4019a553d44e1"},
|
||||
{file = "voicemeeter_api-2.4.11.tar.gz", hash = "sha256:875591ad326a7a13ef141536cca83953edcda81da256191bab3844bac46a0e70"},
|
||||
]
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "nvda_voicemeeter"
|
||||
version = "0.5.1"
|
||||
version = "0.5.5"
|
||||
description = "A Voicemeeter app compatible with NVDA"
|
||||
authors = [
|
||||
{ name = "onyx-and-iris", email = "code@onyxandiris.online" },
|
||||
@@ -8,7 +8,7 @@ authors = [
|
||||
dependencies = [
|
||||
"pysimplegui>=4.60.5",
|
||||
"pyparsing>=3.1.1",
|
||||
"voicemeeter-api>=2.4.10",
|
||||
"voicemeeter-api>=2.4.11",
|
||||
]
|
||||
requires-python = ">=3.10,<3.12"
|
||||
readme = "README.md"
|
||||
|
||||
@@ -197,16 +197,16 @@ class Builder:
|
||||
"""tab0 row3 represents patch composite"""
|
||||
|
||||
def add_physical_device_opts(layout):
|
||||
outputs = util.get_patch_composite_list(self.vm.kind)
|
||||
outputs = util.get_patch_composite_list(self.kind)
|
||||
layout.append(
|
||||
[
|
||||
psg.ButtonMenu(
|
||||
f"PC{i + 1}",
|
||||
size=(6, 2),
|
||||
size=(5, 2),
|
||||
menu_def=["", outputs],
|
||||
key=f"PATCH COMPOSITE||PC{i + 1}",
|
||||
)
|
||||
for i in range(self.kind.phys_out)
|
||||
for i in range(self.kind.composite)
|
||||
]
|
||||
)
|
||||
|
||||
@@ -381,7 +381,7 @@ class Builder:
|
||||
if i == self.kind.phys_in + 1:
|
||||
layout.append(
|
||||
[
|
||||
psg.Button("K", size=(6, 2), key=f"STRIP {i}||MONO"),
|
||||
psg.Button("K", size=(6, 2), key=f"STRIP {i}||KARAOKE"),
|
||||
psg.Button("Solo", size=(6, 2), key=f"STRIP {i}||SOLO"),
|
||||
psg.Button("Mute", size=(6, 2), key=f"STRIP {i}||MUTE"),
|
||||
],
|
||||
@@ -389,7 +389,7 @@ class Builder:
|
||||
else:
|
||||
layout.append(
|
||||
[
|
||||
psg.Button("MC", size=(6, 2), key=f"STRIP {i}||MONO"),
|
||||
psg.Button("MC", size=(6, 2), key=f"STRIP {i}||MC"),
|
||||
psg.Button("Solo", size=(6, 2), key=f"STRIP {i}||SOLO"),
|
||||
psg.Button("Mute", size=(6, 2), key=f"STRIP {i}||MUTE"),
|
||||
],
|
||||
@@ -479,7 +479,7 @@ class Builder:
|
||||
|
||||
def add_strip_outputs(layout):
|
||||
params = ["MONO", "EQ", "MUTE"]
|
||||
if self.vm.kind.name == "basic":
|
||||
if self.kind.name == "basic":
|
||||
params.remove("EQ")
|
||||
busmodes = [util._bus_mode_map[mode] for mode in util.get_bus_modes(self.vm)]
|
||||
layout.append(
|
||||
|
||||
@@ -38,10 +38,15 @@ def _make_param_cache(vm, channel_type) -> dict:
|
||||
**{f"STRIP {i}||B3": vm.strip[i].B3 for i in range(vm.kind.num_strip)},
|
||||
}
|
||||
params |= {
|
||||
**{f"STRIP {i}||MONO": vm.strip[i].mono for i in range(vm.kind.num_strip)},
|
||||
**{f"STRIP {i}||MONO": vm.strip[i].mono for i in range(vm.kind.phys_in)},
|
||||
**{f"STRIP {i}||SOLO": vm.strip[i].solo for i in range(vm.kind.num_strip)},
|
||||
**{f"STRIP {i}||MUTE": vm.strip[i].mute for i in range(vm.kind.num_strip)},
|
||||
}
|
||||
for i in range(vm.kind.phys_in, vm.kind.phys_in + vm.kind.virt_in):
|
||||
if i == vm.kind.phys_in + 1:
|
||||
params[f"STRIP {i}||KARAOKE"] = vm.strip[i].k
|
||||
else:
|
||||
params[f"STRIP {i}||MC"] = vm.strip[i].mc
|
||||
else:
|
||||
params |= {
|
||||
**{f"BUS {i}||MONO": vm.bus[i].mono for i in range(vm.kind.num_bus)},
|
||||
|
||||
@@ -192,3 +192,7 @@ def get_slider_modes() -> Iterable:
|
||||
"DENOISER MODE",
|
||||
"LIMIT MODE",
|
||||
)
|
||||
|
||||
|
||||
def _get_bus_assignments(kind) -> list:
|
||||
return [f"A{i}" for i in range(1, kind.phys_out + 1)] + [f"B{i}" for i in range(1, kind.virt_out + 1)]
|
||||
|
||||
@@ -47,7 +47,7 @@ class NVDAVMWindow(psg.Window):
|
||||
if self.kind.name == "basic":
|
||||
self["HARDWARE OUT||A2"].Widget.config(**buttonmenu_opts)
|
||||
if self.kind.name != "basic":
|
||||
[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.composite)]
|
||||
slider_opts = {"takefocus": 1, "highlightthickness": 1}
|
||||
for i in range(self.kind.num_strip):
|
||||
for param in util.get_slider_params(i, self.kind):
|
||||
@@ -180,17 +180,17 @@ class NVDAVMWindow(psg.Window):
|
||||
self.bind(f"<Alt-Control-{event}-{direction}>", f"ALT CTRL {direction.upper()}||{event_id}")
|
||||
|
||||
# Hardware In
|
||||
for i in range(self.vm.kind.phys_in):
|
||||
for i in range(self.kind.phys_in):
|
||||
self[f"HARDWARE IN||{i + 1}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"HARDWARE IN||{i + 1}"].bind("<space>", "||KEY SPACE", propagate=False)
|
||||
self[f"HARDWARE IN||{i + 1}"].bind("<Return>", "||KEY ENTER", propagate=False)
|
||||
|
||||
# Hardware Out
|
||||
for i in range(self.vm.kind.phys_out):
|
||||
for i in range(self.kind.phys_out):
|
||||
self[f"HARDWARE OUT||A{i + 1}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"HARDWARE OUT||A{i + 1}"].bind("<space>", "||KEY SPACE", propagate=False)
|
||||
self[f"HARDWARE OUT||A{i + 1}"].bind("<Return>", "||KEY ENTER", propagate=False)
|
||||
if self.vm.kind.name == "basic":
|
||||
if self.kind.name == "basic":
|
||||
self["HARDWARE OUT||A2"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self["HARDWARE OUT||A2"].bind("<space>", "||KEY SPACE", propagate=False)
|
||||
self["HARDWARE OUT||A2"].bind("<Return>", "||KEY ENTER", propagate=False)
|
||||
@@ -203,7 +203,7 @@ class NVDAVMWindow(psg.Window):
|
||||
|
||||
# Patch Composite
|
||||
if self.kind.name != "basic":
|
||||
for i in range(self.vm.kind.phys_out):
|
||||
for i in range(self.kind.composite):
|
||||
self[f"PATCH COMPOSITE||PC{i + 1}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"PATCH COMPOSITE||PC{i + 1}"].bind("<space>", "||KEY SPACE", propagate=False)
|
||||
self[f"PATCH COMPOSITE||PC{i + 1}"].bind("<Return>", "||KEY ENTER", propagate=False)
|
||||
@@ -237,9 +237,14 @@ class NVDAVMWindow(psg.Window):
|
||||
self[f"STRIP {i}||{param}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"STRIP {i}||{param}"].bind("<Return>", "||KEY ENTER")
|
||||
else:
|
||||
for param in ("MONO", "SOLO", "MUTE"):
|
||||
self[f"STRIP {i}||{param}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"STRIP {i}||{param}"].bind("<Return>", "||KEY ENTER")
|
||||
if i == self.kind.phys_in + 1:
|
||||
for param in ("KARAOKE", "SOLO", "MUTE"):
|
||||
self[f"STRIP {i}||{param}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"STRIP {i}||{param}"].bind("<Return>", "||KEY ENTER")
|
||||
else:
|
||||
for param in ("MC", "SOLO", "MUTE"):
|
||||
self[f"STRIP {i}||{param}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"STRIP {i}||{param}"].bind("<Return>", "||KEY ENTER")
|
||||
|
||||
# Strip Sliders
|
||||
for i in range(self.kind.num_strip):
|
||||
@@ -262,7 +267,7 @@ class NVDAVMWindow(psg.Window):
|
||||
|
||||
# Bus Params
|
||||
params = ["MONO", "EQ", "MUTE"]
|
||||
if self.vm.kind.name == "basic":
|
||||
if self.kind.name == "basic":
|
||||
params.remove("EQ")
|
||||
for i in range(self.kind.num_bus):
|
||||
for param in params:
|
||||
@@ -605,14 +610,20 @@ class NVDAVMWindow(psg.Window):
|
||||
val = values[f"PATCH COMPOSITE||{key}"]
|
||||
index = int(key[-1]) - 1
|
||||
self.vm.patch.composite[index].set(util.get_patch_composite_list(self.kind).index(val) + 1)
|
||||
self.TKroot.after(200, self.nvda.speak, f"PATCH COMPOSITE {key[-1]} set {val}")
|
||||
self.TKroot.after(200, self.nvda.speak, val)
|
||||
case [["PATCH", "COMPOSITE"], [key], ["FOCUS", "IN"]]:
|
||||
if self.find_element_with_focus() is not None:
|
||||
if values[f"PATCH COMPOSITE||{key}"]:
|
||||
val = values[f"PATCH COMPOSITE||{key}"]
|
||||
else:
|
||||
index = int(key[-1]) - 1
|
||||
val = util.get_patch_composite_list(self.kind)[self.vm.patch.composite[index].get() - 1]
|
||||
comp_index = self.vm.patch.composite[index].get()
|
||||
comp_list = util.get_patch_composite_list(self.kind)
|
||||
try:
|
||||
val = comp_list[comp_index - 1]
|
||||
except IndexError as e:
|
||||
val = comp_list[-1]
|
||||
self.logger.error(f"{type(e).__name__}: {e}")
|
||||
self.nvda.speak(f"Patch COMPOSITE {key[-1]} {val}")
|
||||
case [["PATCH", "COMPOSITE"], [key], ["KEY", "SPACE" | "ENTER"]]:
|
||||
util.open_context_menu_for_buttonmenu(self, f"PATCH COMPOSITE||{key}")
|
||||
@@ -653,54 +664,36 @@ class NVDAVMWindow(psg.Window):
|
||||
|
||||
# Strip Params
|
||||
case [["STRIP", index], [param]]:
|
||||
label = self.cache["labels"][f"STRIP {index}||LABEL"]
|
||||
match param:
|
||||
case "MONO":
|
||||
if int(index) < self.kind.phys_in:
|
||||
actual = param.lower()
|
||||
elif int(index) == self.kind.phys_in + 1:
|
||||
actual = "k"
|
||||
else:
|
||||
actual = "mc"
|
||||
phonetic = {"k": "karaoke"}
|
||||
if actual == "k":
|
||||
next_val = self.vm.strip[int(index)].k + 1
|
||||
if next_val == 4:
|
||||
next_val = 0
|
||||
setattr(self.vm.strip[int(index)], actual, next_val)
|
||||
self.cache["strip"][f"STRIP {index}||{param}"] = next_val
|
||||
self.nvda.speak(["off", "k m", "k 1", "k 2"][next_val])
|
||||
else:
|
||||
val = not self.cache["strip"][f"STRIP {index}||{param}"]
|
||||
setattr(self.vm.strip[int(index)], actual, val)
|
||||
self.cache["strip"][f"STRIP {index}||{param}"] = val
|
||||
self.nvda.speak("on" if val else "off")
|
||||
case "KARAOKE":
|
||||
opts = ["off", "k m", "k 1", "k 2", "k v"]
|
||||
next_val = self.vm.strip[int(index)].k + 1
|
||||
if next_val == len(opts):
|
||||
next_val = 0
|
||||
self.vm.strip[int(index)].k = next_val
|
||||
self.cache["strip"][f"STRIP {index}||{param}"] = next_val
|
||||
self.nvda.speak(opts[next_val])
|
||||
case output if param in util._get_bus_assignments(self.kind):
|
||||
val = not self.cache["strip"][f"STRIP {index}||{output}"]
|
||||
setattr(self.vm.strip[int(index)], output, val)
|
||||
self.cache["strip"][f"STRIP {index}||{output}"] = val
|
||||
self.nvda.speak("on" if val else "off")
|
||||
case _:
|
||||
val = not self.cache["strip"][f"STRIP {index}||{param}"]
|
||||
setattr(self.vm.strip[int(index)], param if param[0] in ("A", "B") else param.lower(), val)
|
||||
setattr(self.vm.strip[int(index)], param.lower(), val)
|
||||
self.cache["strip"][f"STRIP {index}||{param}"] = val
|
||||
self.nvda.speak("on" if val else "off")
|
||||
case [["STRIP", index], [param], ["FOCUS", "IN"]]:
|
||||
if self.find_element_with_focus() is not None:
|
||||
val = self.cache["strip"][f"STRIP {index}||{param}"]
|
||||
match param:
|
||||
case "MONO":
|
||||
if int(index) < self.kind.phys_in:
|
||||
actual = param.lower()
|
||||
elif int(index) == self.kind.phys_in + 1:
|
||||
actual = "k"
|
||||
else:
|
||||
actual = "mc"
|
||||
case _:
|
||||
actual = param
|
||||
phonetic = {"k": "karaoke"}
|
||||
phonetic = {"KARAOKE": "karaoke"}
|
||||
label = self.cache["labels"][f"STRIP {index}||LABEL"]
|
||||
if actual == "k":
|
||||
if param == "KARAOKE":
|
||||
self.nvda.speak(
|
||||
f"{label} {phonetic.get(actual, actual)} {['off', 'k m', 'k 1', 'k 2'][self.cache['strip'][f'STRIP {int(index)}||{param}']]}"
|
||||
f"{label} {phonetic.get(param, param)} {['off', 'k m', 'k 1', 'k 2', 'k v'][self.cache['strip'][f'STRIP {int(index)}||{param}']]}"
|
||||
)
|
||||
else:
|
||||
self.nvda.speak(f"{label} {phonetic.get(actual, actual)} {'on' if val else 'off'}")
|
||||
self.nvda.speak(f"{label} {phonetic.get(param, param)} {'on' if val else 'off'}")
|
||||
case [["STRIP", index], [param], ["KEY", "ENTER"]]:
|
||||
self.find_element_with_focus().click()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user