diff --git a/README.md b/README.md index b8fdc78..52cc439 100644 --- a/README.md +++ b/README.md @@ -107,12 +107,30 @@ All sliders may be controlled in three different ways: - `Shift + Left|Right arrow` to move a slider by 0.1 steps. - `Control + Left|Right arrow` to move a slider by 3 steps. +To reset a slider back to its default value you may use `Control + Shift + R`. + To rename a strip/bus channel focus on the channel in question and press `F2`. Then enter the new channel name into the text input widget and press the `Ok` button. Pressing the `OK` button with an empty text input will clear the label. In this case the label will be read as a default value for that channel. For example, if the leftmost Strip label were cleared, the screen reader will now read `Hardware Input 1`. Pressing `Cancel` will close the popup window with no affect on the label. +#### `Advanced Compressor|Gate` + +For potato version only, you may access advanced Compressor and Gate sliders. Simply focus any Gate or Compressor slider and press `Control + A`. This will open a popup window where you can navigate between the different sliders with `TAB`. Move the sliders with the same binds you would for normal sliders. However, there are a couple of extra binds for certain controls. + +For Compressor Release you may use: + +- `Alt + Left|Right arrow` to move the slider by 10 steps. +- `Alt + Control + Left|Right arrow` to move the slider by 50 steps. + +For Gate BP Sidechain, Attack, Hold, Release you may use: + +- `Alt + Left|Right arrow` to move the slider by 10 steps. +- `Alt + Control + Left|Right arrow` to move the slider by 50 steps. + +To reset a slider back to its default value you may use `Control + Shift + R`. + #### `Menu` A single menu item `Voicemeeter` can be opened using `Alt` and then `v`. The menu allows you to: diff --git a/pyproject.toml b/pyproject.toml index d9182b6..48b5ee1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "nvda_voicemeeter" -version = "0.5.0a2" +version = "0.5.0b1" description = "A Voicemeeter app compatible with NVDA" authors = [ { name = "onyx-and-iris", email = "code@onyxandiris.online" }, diff --git a/src/nvda_voicemeeter/popup.py b/src/nvda_voicemeeter/popup.py index 1549416..050de1b 100644 --- a/src/nvda_voicemeeter/popup.py +++ b/src/nvda_voicemeeter/popup.py @@ -212,6 +212,7 @@ class Popup: self.popup[f"COMPRESSOR||SLIDER {param}"].bind( f"", f"||KEY CTRL ALT {direction.upper()} {event_id}" ) + self.popup[f"COMPRESSOR||SLIDER {param}"].bind("", "||KEY CTRL SHIFT R") self.popup["MAKEUP"].bind("", "||FOCUS IN") self.popup["MAKEUP"].bind("", "||KEY ENTER") self.popup["Exit"].bind("", "||FOCUS IN") @@ -458,6 +459,33 @@ class Popup: else: self.window.vm.event.pdirty = True + case [ + ["COMPRESSOR"], + ["SLIDER", "INPUT" | "OUTPUT" as direction, "GAIN"], + ["KEY", "CTRL", "SHIFT", "R"], + ]: + if direction == "INPUT": + self.window.vm.strip[index].comp.gainin = 0 + else: + self.window.vm.strip[index].comp.gainout = 0 + self.popup[f"COMPRESSOR||SLIDER {direction} GAIN"].update(value=0) + self.window.nvda.speak(str(0)) + case [["COMPRESSOR"], ["SLIDER", param], ["KEY", "CTRL", "SHIFT", "R"]]: + match param: + case "RATIO": + val = 1 + case "THRESHOLD": + val = -20 + case "ATTACK": + val = 10 + case "RELEASE": + val = 50 + case "KNEE": + val = 0.5 + setattr(self.window.vm.strip[index].comp, param.lower(), val) + self.popup[f"COMPRESSOR||SLIDER {param}"].update(value=val) + self.window.nvda.speak(str(round(val, 1))) + case ["MAKEUP"]: val = not self.window.vm.strip[index].comp.makeup self.window.vm.strip[index].comp.makeup = val @@ -516,6 +544,7 @@ class Popup: self.popup[f"GATE||SLIDER {param}"].bind( f"", f"||KEY CTRL ALT {direction.upper()} {event_id}" ) + self.popup[f"GATE||SLIDER {param}"].bind("", "||KEY CTRL SHIFT R") self.popup["Exit"].bind("", "||FOCUS IN") self.popup["Exit"].bind("", "||KEY ENTER") self.window.vm.observer.add(self.on_pdirty) @@ -658,6 +687,23 @@ class Popup: self.window.nvda.speak(str(round(val, 1))) else: self.window.vm.event.pdirty = True + case [["GATE"], ["SLIDER", param], ["KEY", "CTRL", "SHIFT", "R"]]: + match param: + case "THRESHOLD": + val = -60 + case "DAMPING": + val = -60 + case "BPSIDECHAIN": + val = 100 + case "ATTACK": + val = 0 + case "HOLD": + val = 500 + case "RELEASE": + val = 1000 + setattr(self.window.vm.strip[index].gate, param.lower(), val) + self.popup[f"GATE||SLIDER {param}"].update(value=val) + self.window.nvda.speak(str(round(val, 1))) case [[button], ["FOCUS", "IN"]]: self.window.nvda.speak(button) diff --git a/src/nvda_voicemeeter/window.py b/src/nvda_voicemeeter/window.py index a0c63e4..53ad034 100644 --- a/src/nvda_voicemeeter/window.py +++ b/src/nvda_voicemeeter/window.py @@ -452,6 +452,8 @@ class NVDAVMWindow(psg.Window): case "tab||Settings": self.write_event_value("ADVANCED SETTINGS", None) case "tab||Physical Strip": + if self.kind.name != "potato": + continue if values["tabgroup||Physical Strip"] == "tab||Physical Strip||sliders": if focus := self.find_element_with_focus(): identifier, partial = focus.key.split("||") @@ -973,7 +975,7 @@ class NVDAVMWindow(psg.Window): case "LIMIT": self.vm.strip[int(index)].limit = 12 self[f"STRIP {index}||SLIDER {param}"].update(value=12) - self.nvda.speak(f"{param} {12 if param == 'LABEL' else 0}") + self.nvda.speak(f"{12 if param == 'LIMIT' else 0}") # Bus Params case [["BUS", index], [param]]: @@ -1106,7 +1108,7 @@ class NVDAVMWindow(psg.Window): case [["BUS", index], ["SLIDER", "GAIN"], ["KEY", "CTRL", "SHIFT", "R"]]: self.vm.bus[int(index)].gain = 0 self[f"BUS {index}||SLIDER GAIN"].update(value=0) - self.nvda.speak(str(val)) + self.nvda.speak(str(0)) # Unknown case _: