Code Monkey home page Code Monkey logo

deej's Introduction

deej

deej is an open-source hardware volume mixer for Windows and Linux PCs. It lets you use real-life sliders (like a DJ!) to seamlessly control the volumes of different apps (such as your music player, the game you're playing and your voice chat session) without having to stop what you're doing.

Join the deej Discord server if you need help or have any questions!

Discord

New: work-in-progress deej FAQ!

deej consists of a lightweight desktop client written in Go, and an Arduino-based hardware setup that's simple and cheap to build. Check out some versions built by members of our community!

Download the latest release | Video demonstration | Build video by Tech Always

deej

Psst! No 3D printer? No problem! You can build deej on some cardboard, a shoebox or even a breadboard :)

Table of contents

Features

deej is written in Go and distributed as a portable (no installer needed) executable.

  • Bind apps to different sliders
    • Bind multiple apps per slider (i.e. one slider for all your games)
    • Bind the master channel
    • Bind "system sounds" (on Windows)
    • Bind specific audio devices by name (on Windows)
    • Bind currently active app (on Windows)
    • Bind all other unassigned apps
  • Control your microphone's input level
  • Lightweight desktop client, consuming around 10MB of memory
  • Runs from your system tray
  • Helpful notifications to let you know if something isn't working

Looking for the older Python version? It's no longer maintained, but you can always find it in the legacy-python branch.

How it works

Hardware

  • 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

Schematic

Hardware schematic

Software

  • The code running on the Arduino board is a C program constantly writing current slider values over its serial interface
  • The PC runs a lightweight Go client in the background. This client reads the serial stream and adjusts app volumes according to the given configuration file

Slider mapping (configuration)

deej uses a simple YAML-formatted configuration file named config.yaml, placed alongside the deej executable.

The config file determines which applications (and devices) are mapped to which sliders, and which parameters to use for the connection to the Arduino board, as well as other user preferences.

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

# adjust the amount of signal noise reduction depending on your hardware quality
# supported values are "low" (excellent hardware), "default" (regular hardware) or "high" (bad, noisy hardware)
noise_reduction: default
  • master is a special option to control the master volume of the system (uses the default playback device)
  • mic is a special option to control your microphone's input level (uses the default recording device)
  • deej.unmapped is a special option to control all apps that aren't bound to any slider ("everything else")
  • On Windows, deej.current is a special option to control whichever app is currently in focus
  • On Windows, you can specify a device's full name, i.e. Speakers (Realtek High Definition Audio), to bind that device's level to a slider. This doesn't conflict with the default master and mic options, and works for both input and output devices.
    • Be sure to use the full device name, as seen in the menu that comes up when left-clicking the speaker icon in the tray menu
  • system is a special option on Windows to control the "System sounds" volume in the Windows mixer
  • All names are case-insensitive, meaning both chrome.exe and CHROME.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)

Build your own!

Building deej is very simple. You only need a few relatively 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!

FAQ

I've started a highly focused effort of writing a proper FAQ page for deej, covering many basic and advanced topics.

It is still very much a work-in-progress, but I'm happy to share it in its current state in hopes that it at least covers some questions you might have.

FAQ feedback in our community Discord is strongly encouraged :)

Build video

In case you prefer watching to reading, Charles from the Tech Always YouTube channel has made a fantastic video that covers the basics of building deej for yourself, including parts, costs, assembly and software. I highly recommend checking it out!

Bill of Materials

  • An Arduino Nano, Pro Micro or Uno board
    • I officially recommend using a Nano or a Pro Micro for their smaller form-factor, friendlier USB connectors and more analog pins. Plus they're cheaper
    • You can also use any other development board that has a Serial over USB interface
  • A few slider potentiometers, up to your number of free analog pins (the cheaper ones cost around 1-2 USD each, and come with a standard 10K Ohm variable resistor. These should work just fine for this project)
    • 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. You don't need a 3D printer for this project! It works fantastically with just a piece of cardboard or a shoebox. That being said, if you do have one, read on...

Thingiverse collection

With many different 3D-printed designs being added to our community showcase, it felt right to gather all of them in a Thingiverse collection for you to browse. If you have access to a 3D printer, feel free to use one of the designs in your build.

Visit our community-created design collection on Thingiverse!

You can also submit your own design to be added to the collection. Regardless, if you do upload your design to Thingiverse, please add a deej tag to it so that others can find it more easily.

Build procedure

  • 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!

How to run

Requirements

Windows

  • Windows. That's it

Linux

  • Install libgtk-3-dev, libappindicator3-dev and libwebkit2gtk-4.0-dev for system tray support. Pre-built Linux binaries aren't currently released, so you'll need to build from source. If there's demand for pre-built binaries, please let me know!

Download and installation

  • Head over to the releases page and download the latest version's executable and configuration file (deej.exe and config.yaml)
  • Place them in the same directory anywhere on your machine
  • (Optional, on Windows) Create a shortcut to deej.exe and copy it to %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup to have deej run on boot

Building from source

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 Go 1.14 (or above) environment on your machine. If you go this route, make sure to check out the developer scripts.

Like other Go packages, you can also use the go get tool: go get -u github.com/omriharel/deej. Please note that the package code now resides in the pkg/deej directory, and needs to be imported from there if used inside another project.

If you need any help with this, please join our Discord server.

Community

Discord

deej is a relatively new project, but a vibrant and awesome community is rapidly growing around it. Come hang out with us in the deej Discord server, or check out a whole bunch of cool and creative 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).

Donations

If you love deej and want to show your support for this project, you can do so using the link below. Please don't feel obligated to donate - building the project and telling your friends about it goes a very long way! Thank you very much.

ko-fi

Contributing

Please see docs/CONTRIBUTING.md.

License

deej is released under the MIT license.

deej's People

Contributors

medusalix avatar omriharel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

deej's Issues

If deej starts too fast on windows startup it sometimes fails to detect sliders

My PC boots quick and about half of the time, the application starts before it can detect the sliders and I have to manually close/restart deej so it detects them.

Maybe a check to see if sliders were detected could be added and if they were not, put in a retry-loop to try for 5 times every x seconds to prevent this?
image

Volume not changing for Windows Media Player

I can see the slide going up and down in the volume mixer of Windows 10, but the volume doesn't change. Inside Windows Media Player there is also slider which is at the same position as the W0. But when changing the W10 slider it doesn't change the WMP slider.

Therefore the volume won't change.

It does work for the "master" volume

Volume Increasing in Step of Three (3)

When monitoring application volumes with Volume Mixer while changing with Deej, each application is increasing in volume in steps of three (3). Is there anyway to change to increase in single (1) steps?

Linux USB Initialization at Login Screen

I compiled deej to run on Linux.
OS: PopOS! 21.04

Bug: Having the Arduino Nano running the deejSW plugged into the PC is preventing the mouse and keyboard from initializing on the login screen.
Result: Unable to use mouse and keyboard while Arduino Nano is plugged in

[Feature]Deej remember setting after reboot

Is it possible to make deej remember the settings after a reboot?, eg if I have the microphone muted or volume set to a specific level it should automatically remember that setting during the next startup.

"mic" slider doesn't affect capture level with some microphones

Hey,

Amazing project ! I love it !

Theres a small issue i'm having, the mic mapping doesnt seem to work for me.

Here's my slider mapping :

slider_mapping:
  0: chrome.exe
  1: 
    - discord.exe
    - skype.exe
    - zoom.exe
    - teams.exe
  2: 
    - tidal.exe
    - tidalplayer.exe
    - spotify.exe
  3: 
    - rustclient.exe
    - planetside2_x64.exe
    - planetside2_x64_BE.exe
  4: vlc.exe
  5: deej.unmapped
  6: mic

All is working fine, but the mic volume doesn't move. I've also tried the following mapping, without success :

slider_mapping:
  0: chrome.exe
  1: 
    - discord.exe
    - skype.exe
    - zoom.exe
    - teams.exe
  2: 
    - tidal.exe
    - tidalplayer.exe
    - spotify.exe
  3: 
    - rustclient.exe
    - planetside2_x64.exe
    - planetside2_x64_BE.exe
  4: vlc.exe
  5: deej.unmapped
  6: Microphone (AUKEY PC-LM1 USB Microphone)

Anything I should check ? This is what I've already checked:

  • Running release-v0.9.10
  • Value for the corresponding slider is well received on the serial port
  • When running deej in debug mode and moving the mic slider, i receive the following lines in the console :
    2021-01-06 22:40:02.375 DEBUG deej.sessions.mic Adjusting session volume {"to": "1.00"}
  • Audio sessions seem to be found for the mic, as stated by the following console output :
    2021-01-06 22:42:08.930 DEBUG deej.session_finder Enumerated device info {"deviceIdx": 4, "deviceDescription": "microphone", "deviceFriendlyName": "Microphone (AUKEY PC-LM1 USB Microphone)", "dataFlow": 1}
    2021-01-06 22:42:08.931 DEBUG deej.sessions.device.microphone Created audio session instance {"session": "<session: Microphone (AUKEY PC-LM1 USB Microphone), vol: 1.00>"}
  • Microphone (AUKEY PC-LM1 USB Microphone) is set as my default audio input

Volume stop at about 80% and wrong Arduino voltage.

Hi and thanks for this software. I really like it.
Here is what happened
I'm using an Arduino Nano and plug slider to Arduino's 5V.
With this setup volume won't go up to 100%, it stops at about 80%.
Checking voltage Arduino's 5V give me around 4.6V. I've found many source on internet saying this is normal when USB powered. So calculation of voltage from potentiometer is wrong.
I check 3.3v and voltage is 3.6V (yes that's not very calibrated) and will make false calculations.

So my solution is to use AREF pin which supports 0 to 5V. Not knowing if arduino's 5V won't exceed 5V (depending of input 5V from USB), I choose to connect Arduino's 3.3v to sliders and to AREF.
I've also add "analogReference(EXTERNAL)" to setup.

void setup() {
analogReference(EXTERNAL); // set the analog reference to the AREF pin
for (int i = 0; i < NUM_SLIDERS; i++) {
pinMode(analogInputs[i], INPUT);
}

Now whatever is real value of 3v3, measurement are correct.

I don't know if code and documentation should be modified or if I'm the onlyone having this issue but I wanted to report it.

Add support for Discord and other hotkey apps

I recently built a deej and love it. However, it cant mute my mic, only change the volume up and down (kinda muting but not really). I was wondering if your able to add support for deej to emulate a keyboard button press when you press a button. This would allow you to set up hotkeys in apps such as Discord and have the deej press that key for you when you hit a button, effectively creating an irl mute button.

Feature Request: Push-to-Talk

Many of us have to use a variety of voice channels. On my work PC, I have slack, skype, teams, discord, zoom and gotomeeting installed, and over the course of a week, I use all of them. Some of these apps don't support PTT, and they certainly do not all use the same hotkey.

There seem to be two standards in play for this:

  • Push-to-Talk (i.e.: discord, ham radio, &c.) -- Mic is active while the button is pressed.
  • Cough Switch (i.e.: DJs, podcasters) -- Mic is muted while the button is pressed.

Volume doesn't go all the way to 0 or 100%

I have some cheap sliders so the values in serial monitor don't go all the way. The lowest I can get it is 22 and the top sometimes barely makes it to 950. Is there a value I can change that accounts for that? It shouldn't be a problem but it turns out that even at 2% volume in Volume mixer stuff applications are still audible.

Accomodating PCPanel

Hello,

I have a PCPanel, the app is in Java and doesn't work much for windows 10.
https://www.getpcpanel.com/

I think your python code would work for this device as you are utilizing serial, detecting the baud rate(this device is 9600), and creating the connection. But the format of your output over serial looks to be the following depending on the outputs? I have not built your device

"### | ### | ### | ###"

PCPanel outputs restfully instead of polling, with no updates over serial with no changes. With one update per line in the following format without the "- description", there are 4 buttons, and 4 volume knobs. b = button, v = volume

b0 1 - button 0 pressed
b0 0 - button 0 not pressed
v3 31
v3 32
v3 34
v3 35 - turning the volume knob 4 up to 35, each line is a separate update
v0 4
v0 3
v0 2
v0 1 - turning knob 1 down to 0

Would I be correct in saying I would need to assign a value to each volume knob that persisted the loop? As if your code is only reading one line per cycle here at line 69 in deej.py in Deej.start

ensure we start clean

    ser.readline()

    while not self._stopped:

        # read a single line from the serial stream, has values between 0 and 1023 separated by "|"
        line = ser.readline()

        # empty lines are a thing i guess
        if not line:
            attempt_print('Empty line')
            continue

        # split on '|'
        split_line = line.split('|')

And then this last line above, line 89, the rest of your code is expecting a list from this split?

Thanks, I wished to send you an email, but was unsure how to contact you.

Configurable Firmware

Background

I think this project is great. It looks like a lot of fun, and I will end up with a pretty useful
device.

I use Linux and I have some experience with 3D printing and embedded software. I have extensive
experience in C++ and I've contributed to some projects like Marlin Firmware.

I see there is a vanilla firmware for 5 sliders and that seems very extensible. But I suspect a lot
of people would like to stretch the capability of the arduino pro micro without writing any software.

What I'd propose we do is to write a firmware that can have it's inputs and outputs generally
configurable over the serial port. This would make the firmware 20x more complicated, but we would
have confidence the code would be error free (ish) and users could add an LED, a knob, or a button
without editing the arduino C code.

Detailed Example

There are similar systems that I am taking inspiration from. The blink firmware, for example. Or the
klipper 3D printing firmware.

The idea is that we write firmware for a specific arduino, like the arduino pro micro. In that firmware,
we enable features like toggling an LED, reading a button, a knob or an encoder.

Then when the firmware connects to the golang process via serial, it is given configuration settings
for which components to enable and which pins they should be enabled on.

For example, the first serial messages to the arduino might look like this:

config_add_digital_output pin=10 id=0 inverted=true
config_add_analog_input pin=A4 id=1 inverted=false
config_add_digital_input pin=9 id=2
config_send period=30

Then there might be a message like this to the firmware:

set_binary_output id=0 state=1

And the periodic status from the firmware might look like this:

1:185|2:8,8

Which would mean the id=1 had an analog value of 185, and the digital input has read 8 presses and 8
releases.

I think the firmware would be pretty easy to build for something like this. The devil is in the
details. Can we easily configure a port from a String? How do we handle mistakes, like having two
things with the same id? What happens when a message is lost?

The golang part (which I know very little about) would then need to be able to have that
communication channel handle these flexible message lengths and be able to configure the firmware to
handle whatever the user wanted.

Once we have the basics done, we can more easily add in features like having a button responsible
for muting a mic, or having an LED respond to the muted state of the mic.

In the config file, I could imagine something like this:

volume:
 - pin: A4
   signal: master
 - pin: A1
   signal:
    - rocketleague.exe
    - pathofexile_x64.exe
   inverted: true
   noise_reduction: high
 - encoder: [D4, D5]
   signal:
   - spotify.exe
   resolution: 4

status:
 - pin: D6
   signal: mic.mute
 - pin: D7
   signal: master.mute

mute:
 - pin: D9
   signal: master
 - pin: D10
   signal: mic

connection:
  port: COM4
  baud_rate: 9600

Other benefits

This would mean that the firmware would stay relatively close to the same in most builds. The
advantages of that are:

  • A lot of people using the same software build would make it more robust.
  • Effort spent on improving the firmware would be useful to more people.
  • A lot more flexability without needing to spend much time in the firmware.
  • Some enterprising individual could sell the pro micros with the firmware already flashed. That would
    help a lot of people get started who are intimidated by the firmware. I wouldn't do that (I am too busy anyway).
  • You could add even more complicated firmware features, such as keyboard emulation, encoder knobs,
    or displays. Even input or output matrices, such as the ones used in LED cubes or olkb keyboards would be possible.
  • After defining a generic serial port interface, new boards would be able to be built with new
    firmware and concrete requirements.

How do we get there?

I think this is a lot of stuff to add. I personally am most interested in defining the serial
communications and writing the firmware for the arduino. But it won't work without the golang serial
support. And there won't be much benefit until there are new features added to the golang software
for these extra types of controls.

Add current EXE to list

It would be great if with a keyboard shortcut (or a right clic on the deej tray icon) we can add the current (or list the current apps) to a pot in the config.yaml
With the deej.unmapped you can use all the apps not bound and with the deej.current the full screen one. But I don't want any of that.
with the deej.shortcut (for exemple) and a key bind (found in the config.yaml) I can quickly add another exe to the list

Mac Support

Deej seems really cool/useful, but I use a mac as my main computer. Are there any plans to get Mac Support on the roadmap?

Having deej open instantly wakes PC from sleep.

Hello!
I have an issue where having deej open instantly wakes my PC from sleep, having the Arduino plugged in doesn't matter.

From what I've read from previous threads(#17 and #21) this is what you might need:
Power options
image
Time it takes to wake after sleeping - about 2 seconds after everything turns off.
Chipset - not sure what this means, but the motherboard is a ASRock Z97 Anniversary, the wake is from

   Instance Path: PCI\VEN_8086&DEV_8CB1&SUBSYS_8CB11849&REV_00\3&11583659&0&A0
    Friendly Name: Intel(R) USB 3.0 eXtensible Host Controller - 1.0 (Microsoft)
    Description: USB xHCI Compliant Host Controller
    Manufacturer: Generic USB xHCI Host Controller

And the deej is plugged into a USB 2 port.

Everything's running and an Arduino Leonardo clone, and I have 6 potentiometers, although I'm not sure that matters, as having the program closed doesn't wake the PC.

Feature request: Change output device with switch

HI! This looks awesome & I'm keen to have a go making one ๐Ÿ‘

I use a 2 output audio interface which is super handy as I can have different outputs for my headphones and speakers.

It would be so awesome if i can switch the output devices of my apps on the go with deej.
Ideally I would have a switch below each slider that would choose either my ZEDi10 ST2 or ZEDi10 ST3 device (see picture of my normal app device setup)

image

Is this possible with the Go app? I'm not too familiar with Go, but I know arduino well.
If you can point me in the right direction as to where i could implement this that would be awesome.

Thanks

[Linux] Can't connect the the Arduino because the port is busy

image

So i might need some help.

In Arduino IDE i flashed the software using the /dev/ttyUSB0 port and it worked. I can open the monitor and see the values. When i close everything that communicates with it and start deej i get this message.
How can i get this going?

Thanks in advance!

Support for Raspberry Pi Pico

I recently built a volume control using Deej and a raspberry pi pico, and figured others might find the python code for the pico usefull (if they wanted to build this as well using a pico)

save this code in a file called main.py on the pico and when the pico is plugged in the Deej program will be able to listen to the potentiometers (you will need to adjust the config.yaml to only have 3 sliders)

Note the Pico only has 3 analog pins (26-28) so it only supports up to 3 potentiometers

import machine
import utime

NOISE = 10
POTENTIOMETER_COVERSION = 64.0625610948 #Converts the Pico's 65536 max to match Deej's expected 1023 max
POTENTIOMETERS = [
    machine.ADC(26),
    machine.ADC(27),
    machine.ADC(28)
]
values = [0] * len (POTENTIOMETERS)            

while True:
    results = ""
    for i, potentiometer in enumerate(POTENTIOMETERS):
        
        curr = round(potentiometer.read_u16() / POTENTIOMETER_COVERSION)

        # this check will normalize the results and reduce noise 
        if values[i] > (curr + NOISE) or values[i] < (curr - NOISE):
            values[i] = curr
        
        results = results + str(values[i])
        
        if i != len(POTENTIOMETERS) - 1:
            results = results + "|"
           
    print(results)
    utime.sleep(.2)

Two way communication?

Does deej have the ability to send volume changes to the arduino? I want to build one with motorized potentiometers. I had a look at the go code but I don't have any experience with it and got lost.

Default audio device changed, marking master sessions as stale

I am on a new build with a fresh windows 11 install. If my computer goes into sleep and comes back I get the following error message

2023-10-09 16:46:59.368 DEBUG   deej.session_finder             Default audio device changed, marking master sessions as stale

If I simply stop/restart the exe it connects just fines and starts working immediately.

Let me know what other info I can provide!

Failed to initialize deej

Deej stopped working when I unplugged it from my computer. I plugged it back in, and restarted deej, but still didn't work. Then I tried to reupload the code to the arduino and restart deej, but still didn't work. not even deleting deej and completely reinstalling it worked.

This is the message in the logs folder

2022-04-21 13:56:54.204 info main Version info {"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"} 2022-04-21 13:56:54.209 warn deej.config Viper failed to read user config {"error": "While parsing config: yaml: line 14: could not find expected ':'"} 2022-04-21 13:56:54.209 info deej.notifier Sending toast notification {"title": "Invalid configuration!", "message": "Please make sure config.yaml is in a valid YAML format."} 2022-04-21 13:56:54.555 error deej Failed to load config during initialization {"error": "read user config: While parsing config: yaml: line 14: could not find expected ':'"} github.com/omriharel/deej.(*Deej).Initialize D:/Projects/go/src/github.com/omriharel/deej/deej.go:91 main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:63 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:56:54.555 fatal main Failed to initialize deej {"error": "load config during init: read user config: While parsing config: yaml: line 14: could not find expected ':'"} main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:64 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:04.416 info main Version info {"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"} 2022-04-21 13:57:04.417 warn deej.config Viper failed to read user config {"error": "While parsing config: yaml: line 14: could not find expected ':'"} 2022-04-21 13:57:04.417 info deej.notifier Sending toast notification {"title": "Invalid configuration!", "message": "Please make sure config.yaml is in a valid YAML format."} 2022-04-21 13:57:04.756 error deej Failed to load config during initialization {"error": "read user config: While parsing config: yaml: line 14: could not find expected ':'"} github.com/omriharel/deej.(*Deej).Initialize D:/Projects/go/src/github.com/omriharel/deej/deej.go:91 main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:63 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:04.756 fatal main Failed to initialize deej {"error": "load config during init: read user config: While parsing config: yaml: line 14: could not find expected ':'"} main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:64 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:21.986 info main Version info {"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"} 2022-04-21 13:57:21.987 warn deej.config Viper failed to read user config {"error": "While parsing config: yaml: line 14: could not find expected ':'"} 2022-04-21 13:57:21.987 info deej.notifier Sending toast notification {"title": "Invalid configuration!", "message": "Please make sure config.yaml is in a valid YAML format."} 2022-04-21 13:57:22.333 error deej Failed to load config during initialization {"error": "read user config: While parsing config: yaml: line 14: could not find expected ':'"} github.com/omriharel/deej.(*Deej).Initialize D:/Projects/go/src/github.com/omriharel/deej/deej.go:91 main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:63 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:22.333 fatal main Failed to initialize deej {"error": "load config during init: read user config: While parsing config: yaml: line 14: could not find expected ':'"} main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:64 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:26.903 info main Version info {"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"} 2022-04-21 13:57:26.904 warn deej.config Viper failed to read user config {"error": "While parsing config: yaml: line 14: could not find expected ':'"} 2022-04-21 13:57:26.904 info deej.notifier Sending toast notification {"title": "Invalid configuration!", "message": "Please make sure config.yaml is in a valid YAML format."} 2022-04-21 13:57:27.257 error deej Failed to load config during initialization {"error": "read user config: While parsing config: yaml: line 14: could not find expected ':'"} github.com/omriharel/deej.(*Deej).Initialize D:/Projects/go/src/github.com/omriharel/deej/deej.go:91 main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:63 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:27.257 fatal main Failed to initialize deej {"error": "load config during init: read user config: While parsing config: yaml: line 14: could not find expected ':'"} main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:64 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:40.065 info main Version info {"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"} 2022-04-21 13:57:40.066 warn deej.config Viper failed to read user config {"error": "While parsing config: yaml: line 14: could not find expected ':'"} 2022-04-21 13:57:40.066 info deej.notifier Sending toast notification {"title": "Invalid configuration!", "message": "Please make sure config.yaml is in a valid YAML format."} 2022-04-21 13:57:40.414 error deej Failed to load config during initialization {"error": "read user config: While parsing config: yaml: line 14: could not find expected ':'"} github.com/omriharel/deej.(*Deej).Initialize D:/Projects/go/src/github.com/omriharel/deej/deej.go:91 main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:63 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:57:40.415 fatal main Failed to initialize deej {"error": "load config during init: read user config: While parsing config: yaml: line 14: could not find expected ':'"} main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:64 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:58:21.740 info main Version info {"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"} 2022-04-21 13:58:21.741 warn deej.config Viper failed to read user config {"error": "While parsing config: yaml: line 14: could not find expected ':'"} 2022-04-21 13:58:21.741 info deej.notifier Sending toast notification {"title": "Invalid configuration!", "message": "Please make sure config.yaml is in a valid YAML format."} 2022-04-21 13:58:22.079 error deej Failed to load config during initialization {"error": "read user config: While parsing config: yaml: line 14: could not find expected ':'"} github.com/omriharel/deej.(*Deej).Initialize D:/Projects/go/src/github.com/omriharel/deej/deej.go:91 main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:63 runtime.main c:/go/src/runtime/proc.go:203 2022-04-21 13:58:22.079 fatal main Failed to initialize deej {"error": "load config during init: read user config: While parsing config: yaml: line 14: could not find expected ':'"} main.main D:/Projects/go/src/github.com/omriharel/deej/cmd/main.go:64 runtime.main c:/go/src/runtime/proc.go:203

[Feature] Change the app's devices

As someone who has to juggle/mux my audio quite often to patch certain media to certain apps on the fly (for instance, I'll have someone on Skype and someone on Discord, and route them together, and occasionally want to share the audio from a video to one or both of them) I use a shortcut to the ms-settings:apps-volume URI. It would be great if I could add some buttons to my DEEJ to select the active sources for each slider instead!

"System" function not working

Good morning,

Firstly, thank you so much for this tool; it is exactly what I was hoping it would be and it has completely changed how I manage sound on my computer in the best way.

On to my issue: it seems that the "System" fader is not changing the system volume; I can verify this by looking at the mixer and as I move the fader the System Sound level does not change. I looked at the previous issues and did not see anything that looked like it was the same issue. I can attest that it did previously function as expected, and I have never touched the config or code since I first implemented Deej.

This is not a major issue, in my opinion, and does not change my opinion of the tool, but it would be nice if I could fix it!

Thank you,

Unnecessary Toast notification

Hey man, love your software and all but i'm having some trouble trying to disable the Toast notification without disabling all Powershell notification. Would you mind helping me out ?
This notification keep popping up and blocking it with windows would mean lose all Powershell notification not just the deej.exe one.
I've got two sound card and i'm switching between both for Headset/Speakers so i understand why the Toast notification would popup when i change the volume with my DIY Mixer but sometimes even when i don't change volume the popup come up randomly.
Notification also appear when i open notepad++ sometimes...
Or a sure way to replicate for me is changing volume on Mixer then change default sound card and open the config.yaml from the taskbar menu.
I wouldn't ask you to update your software for this but if you could point me in the right direction to disable even all notification it would be appreciated.
Thanks.

Missing CONTRIBUTING.md

Since you have a pretty clear idea of what you'd like deej to be, it would be helpful to add a CONTRIBUTING.md file in line with other GitHub projects.

This would act as a simple guide to tell developers how to get started with deej development, and could contain a snippet about getting in touch with you before implementing any new features.

A few good examples:

Invalid configiruation

Hi there,

i have the issue that if a add multiple programs to one fader like stated in the manual i get an invalid configruation file error.

If i list the programs with commas, it seems to work but not stable

EDIT: ok i used tab to arange it nicely. Seems like deej doesn`t like this. it works with spaces.

But it takes a long time till changing of volume works

Faders not working

Tried default config as well as alternative assignments, but neither work for any control. Debug shows faders are detected fine, but they won't control any volumes.

after Windows 10 upgrade and restart Deej doesn't launch.

I've restarted my rig a handful of times, tried a few things like reinstalling drivers, etc. but everytime I click to launch Deej it never appears to run. system tray has nothing. task manager shows nothing. wondering how to fix. (I'm a novice at best, please be kind)

[Linux]If run from different folder, config is not found despite being in same directory as executable

I noticed this on Linux Mint, in Windows I never noticed this.
The problem became apparent when I created an autostart entry in .config/autostart and got the "config should be in same directory as executable" error when calling deej from anywhere that is not the deej folder.

A way to fix this could be like I've done in my fork. It's probably not perfect but it does the job for me.

edit: this problem also affects the edit config option from tray menu (not fixed in my fork)

Rotary Encoder

Hi There! Saw another project that would be cool to merge with this one. What about, like on some of the designs, having the master control as a dial that's also a rotary encoder? That way a press of the encoder could mute all, skip songs, etc? Just a thought thanks!

My device generates bluescreens

Hello,

have any1 the same problem? My device generates bluescreens, idk how to stop it. I recognize that because after disconnect device bluescreens stops. I love that device, pls help me.
Windows 11 64-bit.
Bluescreen code: CH341S64.SYS

Deej doesn't reconnect after usb gets unplugged and plugged in again

Maybe a nice addition is to make the Deej hotswappable, so that it automatically connects after you plug in the Deej.
I don't want to keep my Deej on all the time, but also don't like it that I have to start and stop the Deej software everytime I unplug the Deej and plug in it again.
I would prefer to run the Deej software at startup and let it connect to the hardware whenever I plug it in. I hope this could be added in the future. Thanks for the great project!

Deej prevents computer from sleeping?

I have since using Deej noticed my computer no longer stays asleep when I put it to sleep.

I originally thought it was my USB 3.0 controller (and in fact the hardware ID 1 was pointing to that) but have since resolved that. Now when I go to sleep I get a lastwake notification with an "Unknown" and the only way I get it to go away is if I unplug my deej arduino before sleep. Then my computer stays asleep just fine.

I assume the constant polling of the knobs/potentiometers sends signals back to the PC and keeps the computer from successfully staying asleep.

Any suggestions/advice?

Problems with Tidal

When I'm playing music on Tidal and move the slider changes the volume but when changes the song the volume resets until I move the slider again.

Teamspeak 3 client not controllable

Hello,

I discovered deej a few days ago and i love it.

Unfortunately Teamspeak does not work.
According to the task manager the process is called ts3client_win64.exe

I also tried "deej.current", which works fine for all applications except teamspeak.

deej crashes everytime i try to start it

Here is the error message:

Exception occurred: 'NoneType' object has no attribute 'lower'
Traceback: Traceback (most recent call last):
File "deej.py", line 296, in main
deej.start()
File "deej.py", line 100, in start
self._apply_volume_changes()
File "deej.py", line 209, in _apply_volume_changes
sessions = self._acquire_target_sessions(target)
File "deej.py", line 240, in _acquire_target_sessions
if process_name.lower() == name.lower():
AttributeError: 'NoneType' object has no attribute 'lower'

Serial connection frequently stops in Windows

I've found that almost more often than not, when I reach for my Deej mixer, it simply doesn't work until I restart the Deej app. I've worked around the issue by adding a Windows task scheduler item to restart the app every five minutes, but there has to be a better way.

I do know it happens after sleep/resume, but I'm certain it happens at other times as well, and I'm not sure why.

Wondering if it'd be possible to at least raise a flag, make a log entry, or something else in the event that the app can't read from the serial connection. This way I can watch that log for entries and kick off a restart, assuming the app can't recover from whatever is wrong itself.

Pause music for a specific app

is it possible to add an option that sends a pause command when the volume is lower that some %? that would be great when you mute spotify it pauses

deej.unmapped controls master when using bluetooth speakers

Hey there,

I've been using a usb speaker (Pebble V3) as my main desktop speaker. This speaker can operate using USB or Bluetooth.
Today I have switched to using it over Bluetooth, and noticed that when using it as a bluetooth speaker, deej.unmapped control the speakers volume (which is master).

I switched to a wired headset and deej.unmapped worked as expected (does not control master volume).

This is a bit strange, I'm wondering if you came across this issue and have ways to solve it.

Thanks again and again (and again) for this great utility that has been treating me very well for quite some time now :)

deej stop controling volume

Deej stops controling windows mixer when I don't use my computer for some time.
Computer does not go to sleep or screensaver mode.

OS: Win10 Pro ver. 20H2 - 19042.630
deej version: v0.9.10

Here is the attached log. Note that the 2 last lines are me stopping deej to restart it.

2021-01-17 10:16:35.587	info	main                       	Version info	{"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"}
2021-01-17 10:16:35.610	info	deej.config                	Loaded config successfully
2021-01-17 10:16:35.610	info	deej.config                	Config values	{"sliderMapping": "<5 sliders mapped to 14 targets>", "connectionInfo": {"COMPort":"COM6","BaudRate":9600}, "invertSliders": false}
2021-01-17 10:16:35.686	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 10:16:35.723	info	deej                       	Run loop starting
2021-01-17 10:16:35.725	info	deej.serial.com6           	Connected	{"conn": {}}
2021-01-17 10:16:37.246	info	deej.serial.com6           	Detected sliders	{"amount": 5}
2021-01-17 10:19:20.687	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 10:20:44.124	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 12:02:11.714	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 12:02:17.532	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 14:21:01.877	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:29:27.855	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:38:55.588	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:39:00.976	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:39:24.130	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:39:29.219	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:39:51.075	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:50:45.879	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 17:51:38.549	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 17:53:37.918	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 18:08:48.631	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 19:06:09.918	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 19:40:04.107	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 21:59:04.573	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<25 audio sessions>"}
2021-01-17 22:19:18.298	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<23 audio sessions>"}
2021-01-17 22:26:33.639	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-17 22:38:36.662	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-18 13:01:54.799	info	deej.tray                  	Quit menu item clicked, stopping
2021-01-18 13:01:54.799	info	deej                       	Stopping
2021-01-18 13:02:01.077	info	main                       	Version info	{"gitCommit": "7567f83", "versionTag": "v0.9.10", "buildType": "release"}
2021-01-18 13:02:01.100	info	deej.config                	Loaded config successfully
2021-01-18 13:02:01.100	info	deej.config                	Config values	{"sliderMapping": "<5 sliders mapped to 14 targets>", "connectionInfo": {"COMPort":"COM6","BaudRate":9600}, "invertSliders": false}
2021-01-18 13:02:01.174	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-18 13:02:01.212	info	deej                       	Run loop starting
2021-01-18 13:02:01.214	info	deej.serial.com6           	Connected	{"conn": {}}
2021-01-18 13:02:02.736	info	deej.serial.com6           	Detected sliders	{"amount": 5}
2021-01-18 13:23:55.216	info	deej.sessions              	Got all audio sessions successfully	{"sessionMap": "<24 audio sessions>"}
2021-01-19 06:43:16.937	info	deej.tray                  	Quit menu item clicked, stopping
2021-01-19 06:43:16.938	info	deej                       	Stopping

BLE on ESP32

Does someone have some experience with getting this running thru bluetooth on esp32? I'm just getting some dependencies ready but it would be awesome to harvest some more knowlage!

If you can provide some info please go on! Thanks <3

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.