Arduino and Go project for controlling application volumes on Windows and Linux PCs with physical sliders (like a DJ!)
New: deej
has been re-written as a Go application! More details | Download
New: join the deej Discord server if you need help or have any questions!
Video demonstration on YouTube
See some awesome versions built by people around the world!
- What's new
- How it works
- Slider mapping (configuration)
- Build your own!
- How to run
- Community
- Long-ish term roadmap
- License
deej
is now written in Go, and distributed as a single executable (of course you can still build from source if that's your thing).
This means you no longer have to maintain a Python environment. You can even build one for your friends, give them a simple download link and they'll be good to go!
In addition, check out these features:
- Fully backwards-compatible with your existing
config.yaml
and Arduino sketch - Faster and more lightweight, consuming around 10MB of memory
- Control your microphone's input level by assigning
mic
to a slider (experimental support) - Runs from your system tray
- Helpful notifications will let you know if something isn't working
- New
system
flag lets you assign the "system sounds" volume level (Windows-only) - Supports everything the Python version did
Migrating from the Python version? Great! You only need to keep your
config.yaml
file. Download the executable from the releases page, place it alongside the configuration file and you're done.
Prefer to stick with Python? That's totally fine. It will no longer be maintained, but you can always find it in the
legacy-python
branch.
- The sliders are connected to 5 (or as many as you like) analog pins on an Arduino Nano/Uno board. They're powered from the board's 5V output (see schematic)
- The board connects via a USB cable to the PC
- The code running on the Arduino board is a C program constantly writing current slider values over its Serial interface
deej-arduino.ino
- The PC runs a lightweight Go client
cmd/main.go
in the background. This client reads the serial stream and adjusts app volumes according to the given configuration file
deej
uses a simple YAML-formatted configuration file named config.yaml
, placed alongside the deej executable.
The config file determines which applications are mapped to which sliders, and which COM port/baud rate to use for the connection to the Arduino board.
This file auto-reloads when its contents are changed, so you can change application mappings on-the-fly without restarting deej
.
It looks like this:
slider_mapping:
0: master
1: chrome.exe
2: spotify.exe
3:
- pathofexile_x64.exe
- rocketleague.exe
4: discord.exe
# set this to true if you want the controls inverted (i.e. top is 0%, bottom is 100%)
invert_sliders: false
# settings for connecting to the arduino board
com_port: COM4
baud_rate: 9600
# limits how often deej will look for new processes
process_refresh_frequency: 5
master
is a special option to control the master volume of the system (uses the default playback device)- New:
mic
is a special option to control your microphone's input level (uses the default recording device). Please note: this is an experimental feature that might not suit every hardware set-up out there. system
is a special option on Windows to control the "System sounds" volume in the Windows mixer- Process names aren't case-sensitive, meaning both
chrome.exe
andCHROME.exe
will work - You can create groups of process names (using a list) to either:
- control more than one app with a single slider
- choose whichever process in the group that's currently running (i.e. to have one slider control any game you're playing)
Building deej
is very simple. You only need a few cheap parts - it's an excellent starter project (and my first Arduino project, personally). Remember that if you need any help or have a question that's not answered here, you can always join the deej Discord server.
Build deej
for yourself, or as an awesome gift for your gaming buddies!
- An Arduino Nano or Uno board
- I officially recommend using a Nano as it offers a smaller form-factor, a friendlier USB connector and more analog pins. Plus it's cheaper
- A few slider potentiometers, up to your number of free analog pins (they're around 1-2 USD each, and come with a standard 10K Ohm variable resistor)
- Important: make sure to get linear sliders, not logarithmic ones! Check the product description
- You can also use circular knobs if you like
- Some wires
- Any kind of box to hold everything together
- Connect everything according to the schematic
- Test with a multimeter to be sure your sliders are hooked up correctly
- Flash the Arduino chip with the sketch in
arduino\deej-5-sliders-vanilla
- Important: If you have more or less than 5 sliders, you must edit the sketch to match what you have
- After flashing, check the serial monitor. You should see a constant stream of values separated by a pipe (
|
) character, e.g.0|240|1023|0|483
- When you move a slider, its corresponding value should move between 0 and 1023
- Congratulations, you're now ready to run the
deej
executable!
- Windows. That's it
- Install
libgtk-3-dev
,libappindicator3-dev
andlibwebkit2gtk-4.0-dev
for system tray support
- Head over to the releases page and download the latest version's executable and configuration file (
deej.exe
andconfig.yaml
) - Place them in the same directory anywhere on your machine
- (Optional) Create a shortcut to
deej.exe
and copy it to%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
to havedeej
run on boot
If you'd rather not download a compiled executable, or want to extend deej
or modify it to your needs, feel free to clone the repository and build it yourself. All you need is a somewhat recent (v1.12-ish+) Go environment on your machine.
Like other Go packages, you can also use the go get
tool: go get -u github.com/omriharel/deej
.
If you need any help with this, please join our Discord server.
While deej
is still a very new project, a vibrant community has already started to grow around it. Come hang out with us in the deej Discord server, or check out awesome builds made by our members in the community showcase.
The server is also a great place to ask questions, suggest features or report bugs (but of course, feel free to use GitHub if you prefer).
- Serial communications rework to support two-way data flows for better extensibility
- Basic GUI to replace manual configuration editing
- Feel free to open an issue if you feel like something else is missing
deej
is released under the MIT license.