Grebe is an open-source, physical hardware volume mixer designed exclusively for Windows. It bridges a custom hardware controller with a lightweight, portable Windows background daemon, allowing you to control your system's audio using physical rotary encoders. Grebe integrates with the native Windows volume mixer, allowing you to adjust the volume of individual apps.
The project is split into two distinct parts:
- The Daemon: A fast, portable background application written in Rust that runs on your Windows machine.
- The Controller: Microcontroller firmware written in C++ that reads physical inputs and drives the display.
The easiest way to get started is to use the pre-compiled binaries for both the Windows daemon and the microcontroller.
Download the latest compiled binaries from the Releases tab!
Currently, Grebe's firmware is tailored for the ESP32 and a DIYables LCD. Support for other microcontrollers and displays may be added, but is not currently planned.
Required Components:
- 1x ESP32 DEVKIT V1 (or comparable microcontroller)
- 1x DIYables LCD Display (or comparable LCD display)
- 2x EC11 Rotary Encoders (with push-button functionality)
- Jumper wires (or soldered connections)
Grebe is a completely portable application—no installers required.
- Download the
Grebe.exeWindows binary from the Releases tab. - Place the executable in a dedicated folder.
- Run
Grebe.exe. The daemon will automatically generate aconfig.tomlfile on startup. - Close Grebe from the Windows system tray and edit the generated config file.
- The only config option it is critical to change is
port. This must be set to match the COM port your ESP32 is connected to. If you don't know this, review the detailed instructions for flashing your ESP32 below.
- The only config option it is critical to change is
- Download the compiled
.binfile for the ESP32 from the Releases tab. - Connect your ESP32 or comparable microcontroller to your PC via USB and ensure the appropriate driver is installed.
- Flash the binary to your ESP32 using your preferred flashing tool.
Detailed Instructions: If you are not experienced with microcontrollers, follow this step-by-step guide.
-
Download the compiled
.binfile for the ESP32 from the Releases tab. -
Connect your ESP32 DEVKIT V1 to your PC via USB.
-
Install the CP210x USB to UART Bridge VCP Drivers:
- Download the
CP210x Windows Driversfrom the Silicon Labs Website. - Unzip the compressed folder.
- Run the installer (
CP210xVCPInstaller_x64.exe).
- Download the
-
Identify the COM port your ESP32 is connecting to. This can be done by opening the Device Manager, navigating to Ports (COM & LPT), and looking for a device that appears only when your ESP32 is connected. Take note of the COM number (
COM3,COM4, etc). You will need this later. -
Open a terminal and navigate to the folder containing the compiled
.binfile. -
Ensure Python is installed. You can do this with
py --version- If Python is not installed, install it from the Python Website.
-
Install
esptool.pywithpip install esptool --user -
Ensure the Grebe daemon is not running. It can be found and closed in the system tray.
-
Flash the microcontroller. Use the following command, but replace
COM#with the COM port you identified in step 5. Ensure you execute this command in the folder containing the compiled.binfile downloaded in step 1.py -m esptool --chip esp32 --port COM# --baud 921600 write-flash 0x0 .\Grebe_ESP32_Firmware.bin- If you see a
FileNotFoundErrorit is likely that the port is incorrect or your microcontroller is not plugged in. - If you see a
PermissionErrorit is likely that the Grebe daemon is running and must be closed prior to flashing.
- If you see a
-
Your microcontroller should be ready to use. Ensure you have set the
portoption inconfig.tomlto match the COM port you identified in step 5.
If you prefer to tinker, modify the codebase, or adapt the firmware for different microcontrollers, you can easily build Grebe from source.
- Ensure you have Rust and Cargo installed.
- Clone the repository.
- Navigate to the repository directory.
- Use
cargo build --release
- Ensure you have the Arduino IDE installed.
- Clone the repository.
- Navigate to the repository directory.
- Open
Grebe/hardware/ESP32_DEVKITV1/ESP32_DEVKITV1.inowith the Arduino IDE. - In the Arduino IDE, open the Library Manager and install the following libraries with dependencies:
- ESP32Encoder by Kevin Harrington
- DIYables TFT Shield by DIYables.io
- If you are using an ESP32, modify the DIYables TFT Shield library for use with an ESP32:
-
Navigate to
Documents/Arduino/libraries/DIYables_TFT_Shield/srcand openDIYables_TFT_Shield.hin your preferred text editor. -
Locate this code snippet, starting on line 17:
// Control pins #define API_PIN_RD A0 #define API_PIN_WR A1 #define API_PIN_CD A2 #define API_PIN_CS A3 #define API_PIN_RESET A4
Replace the above code with the following code.
// Control pins #define API_PIN_RD 2 #define API_PIN_WR 4 #define API_PIN_CD 15 #define API_PIN_CS 33 #define API_PIN_RESET 32
-
- Select your board and port in the Arduino IDE. If you are using an ESP32, you will need to add the ESP32 boards manager. Open File -> Preferences and add
https://espressif.github.io/arduino-esp32/package_esp32_index.jsonto theAdditional boards manager URLsfield. - Use the Upload button in the Arduino IDE to flash your microcontroller.
Contributions, issues, and feature requests are welcome! If you have adapted the firmware to work with a different microcontroller or display, feel free to open a Pull Request.
This project is open-source and licensed under two separate licenses depending on the asset:
- Source Code: All source code is licensed under the MIT License.
- Project Icon: The Grebe project icon is a derivative work based on a photograph by Steve Garvie, originally uploaded to Flickr on June 21, 2010. In accordance with the original Creative Commons Attribution-ShareAlike 2.0 Generic (CC BY-SA 2.0) license, this derived icon is also distributed under CC BY-SA 2.0.
