mirror of
https://github.com/onyx-and-iris/nvda-voicemeeter.git
synced 2026-04-19 15:53:31 +00:00
Compare commits
3 Commits
v.0.3.0.b1
...
893f9f59ff
| Author | SHA1 | Date | |
|---|---|---|---|
| 893f9f59ff | |||
| 3ca9e14e96 | |||
| 4ca64f94bc |
@@ -143,6 +143,9 @@ You may also enter slider modes which allow for control of the channels sliders
|
||||
- `Control + G` will enter Gain mode
|
||||
- `Control + T` will enter Gate mode
|
||||
- `Control + L` will enter Limit mode
|
||||
- `Control + B` will enter Bass mode
|
||||
- `Control + I` will enter Mid mode
|
||||
- `Control + R` will enter Treble mode
|
||||
|
||||
To exit any of the slider modes press `Escape`.
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "nvda_voicemeeter"
|
||||
version = "0.3.0b1"
|
||||
version = "0.3.1"
|
||||
description = "A Voicemeeter app compatible with NVDA"
|
||||
authors = [
|
||||
{ name = "onyx-and-iris", email = "code@onyxandiris.online" },
|
||||
|
||||
@@ -220,7 +220,9 @@ class Builder:
|
||||
[
|
||||
psg.Checkbox(
|
||||
text=channel,
|
||||
default=self.vm.patch.insert[util.get_insert_checkbox_index(self.kind, j, i)].on,
|
||||
default=self.window.cache["insert"][
|
||||
f"INSERT CHECKBOX||{util.get_insert_checkbox_index(self.kind, j, i)}"
|
||||
],
|
||||
enable_events=True,
|
||||
key=f"INSERT CHECKBOX||IN{i} {j}",
|
||||
)
|
||||
@@ -233,7 +235,9 @@ class Builder:
|
||||
[
|
||||
psg.Checkbox(
|
||||
text=channel,
|
||||
default=self.vm.patch.insert[util.get_insert_checkbox_index(self.kind, j, i)].on,
|
||||
default=self.window.cache["insert"][
|
||||
f"INSERT CHECKBOX||{util.get_insert_checkbox_index(self.kind, j, i)}"
|
||||
],
|
||||
enable_events=True,
|
||||
key=f"INSERT CHECKBOX||IN{i} {j}",
|
||||
)
|
||||
@@ -323,7 +327,7 @@ class Builder:
|
||||
)
|
||||
|
||||
def add_param_sliders(layout):
|
||||
layout.append([LabelSlider(self.window, i, param) for param in util.get_slider_params(i, self.vm)])
|
||||
layout.append([LabelSlider(self.window, i, param) for param in util.get_slider_params(i, self.kind)])
|
||||
|
||||
def add_limit_slider(layout):
|
||||
layout.append(
|
||||
@@ -416,13 +420,13 @@ class Builder:
|
||||
|
||||
def add_param_sliders(layout):
|
||||
if self.kind.name in ("basic", "banana"):
|
||||
for param in util.get_slider_params(i, self.vm):
|
||||
for param in util.get_slider_params(i, self.kind):
|
||||
layout.append([LabelSlider(self.window, i, param, range_=(-12, 12))])
|
||||
else:
|
||||
layout.append(
|
||||
[
|
||||
LabelSlider(self.window, i, param, range_=(-12, 12))
|
||||
for param in util.get_slider_params(i, self.vm)
|
||||
for param in util.get_slider_params(i, self.kind)
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
@@ -141,12 +141,19 @@ def check_bounds(val, bounds: tuple) -> int | float:
|
||||
return val
|
||||
|
||||
|
||||
def get_slider_params(i, vm) -> Iterable:
|
||||
if i < vm.kind.phys_in:
|
||||
if vm.kind.name == "basic":
|
||||
def get_slider_params(i, kind) -> Iterable:
|
||||
if i < kind.phys_in:
|
||||
if kind.name == "basic":
|
||||
return ("AUDIBILITY",)
|
||||
if vm.kind.name == "banana":
|
||||
if kind.name == "banana":
|
||||
return ("COMP", "GATE")
|
||||
if vm.kind.name == "potato":
|
||||
if kind.name == "potato":
|
||||
return ("COMP", "GATE", "DENOISER")
|
||||
return ("BASS", "MID", "TREBLE")
|
||||
|
||||
|
||||
def get_full_slider_params(i, kind) -> Iterable:
|
||||
params = list(get_slider_params(i, kind) + ("GAIN", "LIMIT"))
|
||||
if kind.name == "basic":
|
||||
params.remove("LIMIT")
|
||||
return params
|
||||
|
||||
@@ -50,13 +50,17 @@ class NVDAVMWindow(psg.Window):
|
||||
[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}
|
||||
for i in range(self.kind.num_strip):
|
||||
for param in util.get_slider_params(i, self.vm):
|
||||
for param in util.get_slider_params(i, self.kind):
|
||||
self[f"STRIP {i}||SLIDER {param}"].Widget.config(**slider_opts)
|
||||
self[f"STRIP {i}||SLIDER GAIN"].Widget.config(**slider_opts)
|
||||
if self.kind.name != "basic":
|
||||
self[f"STRIP {i}||SLIDER LIMIT"].Widget.config(**slider_opts)
|
||||
for i in range(self.kind.num_bus):
|
||||
self[f"BUS {i}||SLIDER GAIN"].Widget.config(**slider_opts)
|
||||
if self.kind.name != "basic":
|
||||
for i in range(self.kind.phys_out):
|
||||
self[f"ASIO CHECKBOX||IN{i + 1} 0"].Widget.config(state="readonly")
|
||||
self[f"ASIO CHECKBOX||IN{i + 1} 1"].Widget.config(state="readonly")
|
||||
|
||||
self.register_events()
|
||||
self["tabgroup"].set_focus()
|
||||
@@ -109,7 +113,7 @@ class NVDAVMWindow(psg.Window):
|
||||
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):
|
||||
for param in util.get_slider_params(i, self.kind):
|
||||
if param in ("AUDIBILITY", "BASS", "MID", "TREBLE"):
|
||||
val = getattr(self.vm.strip[i], param.lower())
|
||||
else:
|
||||
@@ -148,16 +152,18 @@ class NVDAVMWindow(psg.Window):
|
||||
self.bind("<Control-o>", "CTRL-O")
|
||||
self.bind("<Control-s>", "CTRL-S")
|
||||
self.bind("<Control-m>", "CTRL-M")
|
||||
|
||||
self.bind("<Control-g>", "GAIN MODE")
|
||||
self.bind("<Control-b>", "BASS MODE")
|
||||
self.bind("<Control-i>", "MID MODE")
|
||||
self.bind("<Control-r>", "TREBLE MODE")
|
||||
if self.kind.name == "basic":
|
||||
self.bind("<Control-u>", "AUDIBILITY MODE")
|
||||
self.bind("<Control-g>", "GAIN MODE")
|
||||
elif self.kind.name == "banana":
|
||||
self.bind("<Control-g>", "GAIN MODE")
|
||||
self.bind("<Control-c>", "COMP MODE")
|
||||
self.bind("<Control-t>", "GATE MODE")
|
||||
self.bind("<Control-l>", "LIMIT MODE")
|
||||
else:
|
||||
self.bind("<Control-g>", "GAIN MODE")
|
||||
self.bind("<Control-c>", "COMP MODE")
|
||||
self.bind("<Control-t>", "GATE MODE")
|
||||
self.bind("<Control-d>", "DENOISER MODE")
|
||||
@@ -205,8 +211,11 @@ class NVDAVMWindow(psg.Window):
|
||||
if i < self.kind.phys_in:
|
||||
self[f"INSERT CHECKBOX||IN{i + 1} 0"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"INSERT CHECKBOX||IN{i + 1} 1"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"INSERT CHECKBOX||IN{i + 1} 0"].bind("<Return>", "||KEY ENTER")
|
||||
self[f"INSERT CHECKBOX||IN{i + 1} 1"].bind("<Return>", "||KEY ENTER")
|
||||
else:
|
||||
[self[f"INSERT CHECKBOX||IN{i + 1} {j}"].bind("<FocusIn>", "||FOCUS IN") for j in range(8)]
|
||||
[self[f"INSERT CHECKBOX||IN{i + 1} {j}"].bind("<Return>", "||KEY ENTER") for j in range(8)]
|
||||
|
||||
# Advanced Settings
|
||||
self["ADVANCED SETTINGS"].bind("<FocusIn>", "||FOCUS IN")
|
||||
@@ -231,9 +240,7 @@ class NVDAVMWindow(psg.Window):
|
||||
|
||||
# Strip Sliders
|
||||
for i in range(self.kind.num_strip):
|
||||
for param in util.get_slider_params(i, self.vm) + ("GAIN", "LIMIT"):
|
||||
if self.kind.name == "basic" and param == "LIMIT":
|
||||
continue
|
||||
for param in util.get_full_slider_params(i, self.kind):
|
||||
self[f"STRIP {i}||SLIDER {param}"].bind("<FocusIn>", "||FOCUS IN")
|
||||
self[f"STRIP {i}||SLIDER {param}"].bind("<FocusOut>", "||FOCUS OUT")
|
||||
self[f"STRIP {i}||SLIDER {param}"].bind("<Left>", "||KEY LEFT")
|
||||
@@ -291,12 +298,12 @@ class NVDAVMWindow(psg.Window):
|
||||
self.logger.debug(f"values::{values}")
|
||||
if event in (psg.WIN_CLOSED, "Exit"):
|
||||
break
|
||||
elif event in ("GAIN MODE", "COMP MODE", "GATE MODE", "DENOISER MODE", "LIMIT MODE"):
|
||||
elif event.endswith("MODE"):
|
||||
mode = event
|
||||
self.nvda.speak(f"{mode} enabled")
|
||||
elif event == "Escape:27":
|
||||
if mode:
|
||||
self.nvda.speak(f"{mode.split()[0]} mode disabled")
|
||||
self.nvda.speak(f"{mode} disabled")
|
||||
mode = None
|
||||
|
||||
if mode:
|
||||
@@ -380,13 +387,15 @@ class NVDAVMWindow(psg.Window):
|
||||
| "SLIDER-MODE-CTRL-LEFT"
|
||||
| "SLIDER-MODE-CTRL-RIGHT" as op
|
||||
]:
|
||||
op = op.removeprefix("SLIDER-MODE-").split("-")
|
||||
if values["tabgroup"] not in ("tab||Physical Strip", "tab||Virtual Strip", "tab||Buses"):
|
||||
continue
|
||||
param = values[event]
|
||||
if focus := self.find_element_with_focus():
|
||||
identifier, partial = focus.Key.split("||")
|
||||
_, index = identifier.split()
|
||||
if param in util.get_full_slider_params(int(index), self.kind):
|
||||
if "SLIDER" not in partial:
|
||||
op = op.removeprefix("SLIDER-MODE-").split("-")
|
||||
self.write_event_value(f"{identifier}||SLIDER {param}||KEY {' '.join(op)}", None)
|
||||
|
||||
# Rename popups
|
||||
@@ -577,7 +586,7 @@ class NVDAVMWindow(psg.Window):
|
||||
)
|
||||
val = values[f"INSERT CHECKBOX||{in_num} {channel}"]
|
||||
self.vm.patch.insert[index].on = val
|
||||
self.nvda.speak(f"{'on' if val else 'off'}")
|
||||
self.nvda.speak("on" if val else "off")
|
||||
case [["INSERT", "CHECKBOX"], [in_num, channel], ["FOCUS", "IN"]]:
|
||||
if self.find_element_with_focus() is not None:
|
||||
index = util.get_insert_checkbox_index(
|
||||
@@ -589,6 +598,9 @@ class NVDAVMWindow(psg.Window):
|
||||
channel = util._patch_insert_channels[int(channel)]
|
||||
num = int(in_num[-1])
|
||||
self.nvda.speak(f"Patch INSERT IN#{num} {channel} {'on' if val else 'off'}")
|
||||
case [["INSERT", "CHECKBOX"], [in_num, channel], ["KEY", "ENTER"]]:
|
||||
val = not values[f"INSERT CHECKBOX||{in_num} {channel}"]
|
||||
self.write_event_value(f"INSERT CHECKBOX||{in_num} {channel}", val)
|
||||
|
||||
# Advanced Settings
|
||||
case ["ADVANCED SETTINGS"] | ["CTRL-A"]:
|
||||
|
||||
Reference in New Issue
Block a user