2023-09-06 00:42:49 +01:00
[![pdm-managed ](https://img.shields.io/badge/pdm-managed-blueviolet )](https://pdm.fming.dev)
[![Code style: black ](https://img.shields.io/badge/code%20style-black-000000.svg )](https://github.com/psf/black)
[![Imports: isort ](https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336 )](https://pycqa.github.io/isort/)
2023-09-06 00:33:59 +01:00
# NVDA Voicemeeter
2023-09-06 05:29:23 +01:00
A remote control app for [Voicemeeter][voicemeeter], designed to be used with the [NVDA screen reader][nvda].
2023-09-06 00:33:59 +01:00
2023-09-14 08:43:15 +01:00
For an outline of this projects goals see the [SPECIFICATION][spec].
2023-09-06 00:33:59 +01:00
2023-09-06 15:07:59 +01:00
< img src = "./img/settings.png" width = 350 alt = "Image of Voicemeeter NVDA app settings tab" >
2023-09-06 00:33:59 +01:00
## Requirements
- [NVDA screen reader][nvda]
- [NVDA's Controller Client files][controller_client]
- Python 3.10 or greater
2023-09-06 15:07:59 +01:00
### Installation
2023-09-06 00:33:59 +01:00
2023-09-14 08:43:15 +01:00
#### `From Source`
2023-09-06 00:33:59 +01:00
2023-09-14 08:43:15 +01:00
First clone the source files from this repository and install the dependencies.
2023-09-06 15:07:59 +01:00
2023-09-14 08:43:15 +01:00
```
git clone https://github.com/onyx-and-iris/nvda-voicemeeter.git
cd nvda-voicemeeter
pip install .
```
Then download the [Controller Client][controller_client] and place the dll files into the directory `controllerClient` .
Your directory structure should look like this:
├── `controllerClient/`
├── `x64/`
├── nvdaControllerClient64.dll
├── `x86/`
├── nvdaControllerClient32.dll
#### `From Releases`
2023-09-06 00:33:59 +01:00
If you want to get started quickly and easily I have uploaded some compiled versions of the app in the [Releases][releases] section.
2023-09-06 15:07:59 +01:00
### Run
Once the repository is downloaded and the controller client files in place you can launch the GUI with the following `__main__.py` :
```python
import voicemeeterlib
import nvda_voicemeeter
KIND_ID = "potato"
with voicemeeterlib.api(KIND_ID, sync=True) as vm:
with nvda_voicemeeter.draw(KIND_ID, vm) as window:
window.run()
```
2023-09-07 07:29:04 +01:00
### KIND_ID
2023-09-06 15:07:59 +01:00
May be one of the following:
- `basic`
- `banana`
- `potato`
2023-09-06 00:33:59 +01:00
### Use
2023-09-14 08:43:15 +01:00
#### `Tabs`
The app presents four tabs `Settings` , `Physical Strip` , `Virtual Strip` and `Buses` . Navigate between the tabs with `Control + TAB` and `Control + SHIFT + TAB` or once focused on any tab, `Left` and `Right` arrow keys.
2023-09-06 15:07:59 +01:00
All controls within the tabs may be navigated between using `TAB` .
2023-09-06 00:33:59 +01:00
2023-09-14 08:43:15 +01:00
#### `Settings`
2023-09-06 00:33:59 +01:00
The following controls offer context menus accessed by pressing `SPACE` or `ENTER` :
- Hardware In
- Hardware Out
- Patch Composite
2023-09-14 08:43:15 +01:00
Press `ESCAPE` to exit any context menu.
2023-09-06 00:33:59 +01:00
All other buttons can be triggered by pressing `SPACE` or `ENTER` .
To adjust Patch Asio Inputs to Strips and Patch Insert values use `UP` and `DOWN` arrows when in focus.
2023-09-14 08:43:15 +01:00
To access Advanced Settings you may press the Advanced Settings button or use `Control + A` when in the `Settings` tab.
#### `Strip/Bus`
2023-09-06 00:33:59 +01:00
To rename a strip/bus channel navigate to the relevant tab, then press `F2` . This will open a popup window where you can set the channel index (with a spinbox) and set the new label using a text input box.
2023-09-14 08:43:15 +01:00
2023-09-06 00:33:59 +01:00
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` .
2023-09-14 08:43:15 +01:00
2023-09-06 00:33:59 +01:00
Pressing `Cancel` will close the popup window with no affect on the label.
2023-09-14 08:43:15 +01:00
#### `Menu`
2023-09-06 00:33:59 +01:00
A single menu item `Voicemeeter` can be opened using `Alt` and then `v` . The menu allows you to:
- Restart Voicemeeter audio engine
- Save/Load current settings (as an xml file)
- Set a config to load automatically on app startup.
The `Save Settings` option opens a popup window with two buttons, `Browse` and `Cancel` . Browse opens a Save As dialog, Cancel returns to the main app window.
2023-09-06 15:07:59 +01:00
2023-09-06 00:33:59 +01:00
`Load Settings` and `Load on Startup` both open an Open dialog box immediately.
### Issues
If you have any questions/suggestions feel free to raise an issue or open a new discussion.
2023-09-07 07:29:04 +01:00
### Special Thanks
[Mario Loreti ](https://www.marioloreti.net/en/ ) for his help in testing and offering feedback during development.
[NVAccess ](https://www.nvaccess.org/ ) for creating the open source NVDA screen reader and its controller client.
[Vincent Burel ](https://github.com/vburel2018 ) for creating Voicemeeter and its SDK.
[PySimpleGUI ](https://github.com/PySimpleGUI ) team for creating an awesome GUI framework.
2023-09-14 08:43:15 +01:00
[spec]: ./SPECIFICATION.md
2023-09-06 05:29:23 +01:00
[voicemeeter]: https://voicemeeter.com/
2023-09-06 00:33:59 +01:00
[nvda]: https://www.nvaccess.org/
[controller_client]: https://github.com/nvaccess/nvda/tree/master/extras/controllerClient
[releases]: https://github.com/onyx-and-iris/nvda-voicemeeter/releases