2018-02-27 21:12:08 +01:00
|
|
|
"""Default settings and configuration for audio reactive LED strip"""
|
2017-12-18 21:50:27 +01:00
|
|
|
from __future__ import print_function
|
|
|
|
from __future__ import division
|
|
|
|
import os
|
|
|
|
|
2018-02-27 21:12:08 +01:00
|
|
|
use_defaults = {"configuration": True, # See notes below for detailed explanation
|
|
|
|
"GUI_opts": False,
|
|
|
|
"devices": True,
|
|
|
|
"colors": True,
|
|
|
|
"gradients": True}
|
|
|
|
|
|
|
|
settings = { # All settings are stored in this dict
|
|
|
|
|
|
|
|
"configuration":{ # Program configuration
|
|
|
|
'USE_GUI': True, # Whether to display the GUI
|
|
|
|
'DISPLAY_FPS': False, # Whether to print the FPS when running (can reduce performance)
|
|
|
|
'MIC_RATE': 48000, # Sampling frequency of the microphone in Hz
|
|
|
|
'FPS': 60, # Desired refresh rate of the visualization (frames per second)
|
|
|
|
'MIN_FREQUENCY': 20, # Frequencies below this value will be removed during audio processing
|
|
|
|
'MAX_FREQUENCY': 18000, # Frequencies above this value will be removed during audio processing
|
|
|
|
'MAX_BRIGHTNESS': 250, # Frequencies above this value will be removed during audio processing
|
|
|
|
'N_ROLLING_HISTORY': 4, # Number of past audio frames to include in the rolling window
|
|
|
|
'MIN_VOLUME_THRESHOLD': 0.01 # No music visualization displayed if recorded audio volume below threshold
|
|
|
|
#'LOGARITHMIC_SCALING': True, # Scale frequencies logarithmically to match perceived pitch of human ear
|
|
|
|
},
|
|
|
|
|
|
|
|
"GUI_opts":{"Graphs":True, # Which parts of the gui to show
|
|
|
|
"Reactive Effect Buttons":True,
|
|
|
|
"Non Reactive Effect Buttons":True,
|
|
|
|
"Frequency Range":True,
|
|
|
|
"Effect Options":True},
|
|
|
|
|
|
|
|
# All devices and their respective settings. Indexed by name, call each one what you want.
|
|
|
|
"devices":{"Desk Strip":{
|
|
|
|
"configuration":{"TYPE": "esp8266", # Device type (see below for all supported boards)
|
|
|
|
# Required configuration for device. See below for all required keys per device
|
|
|
|
"AUTO_DETECT": True, # Set this true if you're using windows hotspot to connect (see below for more info)
|
|
|
|
"MAC_ADDR": "2c-3a-e8-2f-2c-9f", # MAC address of the ESP8266. Only used if AUTO_DETECT is True
|
|
|
|
"UDP_IP": "192.168.1.208", # IP address of the ESP8266. Must match IP in ws2812_controller.ino
|
|
|
|
"UDP_PORT": 7778, # Port number used for socket communication between Python and ESP8266
|
|
|
|
"MAX_BRIGHTNESS": 250, # Max brightness of output (0-255) (my strip sometimes bugs out with high brightness)
|
|
|
|
# Other configuration
|
|
|
|
"N_PIXELS": 58, # Number of pixels in the LED strip (must match ESP8266 firmware)
|
|
|
|
"N_FFT_BINS": 24, # Number of frequency bins to use when transforming audio to frequency domain
|
|
|
|
"current_effect": "Single" # Currently selected effect for this board, used as default when program launches
|
|
|
|
},
|
|
|
|
|
|
|
|
# Configurable options for this board's effects go in this dictionary.
|
|
|
|
# Usage: config.settings["devices"][name]["effect_opts"][effect][option]
|
|
|
|
"effect_opts":{"Energy": {"blur": 1, # Amount of blur to apply
|
|
|
|
"scale":0.9, # Width of effect on strip
|
|
|
|
"r_multiplier": 1.0, # How much red
|
|
|
|
"g_multiplier": 1.0, # How much green
|
|
|
|
"b_multiplier": 1.0}, # How much blue
|
|
|
|
"Wave": {"color_wave": "Red", # Colour of moving bit
|
|
|
|
"color_flash": "White", # Colour of flashy bit
|
|
|
|
"wipe_len":5, # Initial length of colour bit after beat
|
|
|
|
"decay": 0.7, # How quickly the flash fades away
|
|
|
|
"wipe_speed":2}, # Number of pixels added to colour bit every frame
|
|
|
|
"Spectrum": {"r_multiplier": 1.0, # How much red
|
|
|
|
"g_multiplier": 1.0, # How much green
|
|
|
|
"b_multiplier": 1.0}, # How much blue
|
|
|
|
"Wavelength":{"roll_speed": 0, # How fast (if at all) to cycle colour overlay across strip
|
|
|
|
"color_mode": "Spectral", # Colour gradient to display
|
|
|
|
"mirror": False, # Reflect output down centre of strip
|
|
|
|
"reverse_grad": False, # Flip (LR) gradient
|
|
|
|
"reverse_roll": False, # Reverse movement of gradient roll
|
|
|
|
"blur": 3.0, # Amount of blur to apply
|
|
|
|
"flip_lr":False}, # Flip output left-right
|
|
|
|
"Scroll": {"decay": 0.995, # How quickly the colour fades away as it moves
|
|
|
|
"speed": 1, # Speed of scroll
|
|
|
|
"r_multiplier": 1.0, # How much red
|
|
|
|
"g_multiplier": 1.0, # How much green
|
|
|
|
"b_multiplier": 1.0, # How much blue
|
|
|
|
"blur": 0.2}, # Amount of blur to apply
|
|
|
|
"Power": {"color_mode": "Spectral", # Colour gradient to display
|
|
|
|
"s_count": 20, # Initial number of sparks
|
|
|
|
"s_color": "White", # Color of sparks
|
|
|
|
"mirror": True, # Mirror output down central axis
|
|
|
|
"flip_lr":False}, # Flip output left-right
|
|
|
|
"Single": {"color": "Purple"}, # Static color to show
|
|
|
|
"Beat": {"color": "Red", # Colour of beat flash
|
|
|
|
"decay": 0.7}, # How quickly the flash fades away
|
|
|
|
"Bars": {"resolution":4, # Number of "bars"
|
|
|
|
"color_mode":"Spectral", # Multicolour mode to use
|
|
|
|
"roll_speed":0, # How fast (if at all) to cycle colour colours across strip
|
|
|
|
"mirror": False, # Mirror down centre of strip
|
|
|
|
#"reverse_grad": False, # Flip (LR) gradient
|
|
|
|
"reverse_roll": False, # Reverse movement of gradient roll
|
|
|
|
"flip_lr":False}, # Flip output left-right
|
|
|
|
"Gradient": {"color_mode":"Spectral", # Colour gradient to display
|
|
|
|
"roll_speed": 0, # How fast (if at all) to cycle colour colours across strip
|
|
|
|
"mirror": False, # Mirror gradient down central axis
|
|
|
|
"reverse": False}, # Reverse movement of gradient
|
|
|
|
"Fade": {"color_mode":"Spectral", # Colour gradient to fade through
|
|
|
|
"roll_speed": 1, # How fast (if at all) to fade through colours
|
|
|
|
"reverse": False}, # Reverse "direction" of fade (r->g->b or r<-g<-b)
|
|
|
|
"Calibration":{"r": 100,
|
|
|
|
"g": 100,
|
|
|
|
"b": 100}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"Main Strip":{
|
|
|
|
"configuration":{"TYPE": "esp8266", # Device type (see below for all supported boards)
|
|
|
|
# Required configuration for device. See below for all required keys per device
|
|
|
|
"AUTO_DETECT": True, # Set this true if you're using windows hotspot to connect (see below for more info)
|
|
|
|
"MAC_ADDR": "5c-cf-7f-f0-8c-f3", # MAC address of the ESP8266. Only used if AUTO_DETECT is True
|
|
|
|
"UDP_IP": "192.168.1.208", # IP address of the ESP8266. Must match IP in ws2812_controller.ino
|
|
|
|
"UDP_PORT": 7778, # Port number used for socket communication between Python and ESP8266
|
|
|
|
"MAX_BRIGHTNESS": 180, # Max brightness of output (0-255) (my strip sometimes bugs out with high brightness)
|
|
|
|
# Other configuration
|
|
|
|
"N_PIXELS": 226, # Number of pixels in the LED strip (must match ESP8266 firmware)
|
|
|
|
"N_FFT_BINS": 24, # Number of frequency bins to use when transforming audio to frequency domain
|
|
|
|
"current_effect": "Single" # Currently selected effect for this board, used as default when program launches
|
|
|
|
},
|
|
|
|
|
|
|
|
# Configurable options for this board's effects go in this dictionary.
|
|
|
|
# Usage: config.settings["devices"][name]["effect_opts"][effect][option]
|
|
|
|
"effect_opts":{"Energy": {"blur": 1, # Amount of blur to apply
|
|
|
|
"scale":0.9, # Width of effect on strip
|
|
|
|
"r_multiplier": 1.0, # How much red
|
|
|
|
"g_multiplier": 1.0, # How much green
|
|
|
|
"b_multiplier": 1.0}, # How much blue
|
|
|
|
"Wave": {"color_wave": "Red", # Colour of moving bit
|
|
|
|
"color_flash": "White", # Colour of flashy bit
|
|
|
|
"wipe_len":5, # Initial length of colour bit after beat
|
|
|
|
"decay": 0.7, # How quickly the flash fades away
|
|
|
|
"wipe_speed":2}, # Number of pixels added to colour bit every frame
|
|
|
|
"Spectrum": {"r_multiplier": 1.0, # How much red
|
|
|
|
"g_multiplier": 1.0, # How much green
|
|
|
|
"b_multiplier": 1.0}, # How much blue
|
|
|
|
"Wavelength":{"roll_speed": 0, # How fast (if at all) to cycle colour overlay across strip
|
|
|
|
"color_mode": "Spectral", # Colour gradient to display
|
|
|
|
"mirror": False, # Reflect output down centre of strip
|
|
|
|
"reverse_grad": False, # Flip (LR) gradient
|
|
|
|
"reverse_roll": False, # Reverse movement of gradient roll
|
|
|
|
"blur": 3.0, # Amount of blur to apply
|
|
|
|
"flip_lr":False}, # Flip output left-right
|
|
|
|
"Scroll": {"decay": 0.995, # How quickly the colour fades away as it moves
|
|
|
|
"speed": 1, # Speed of scroll
|
|
|
|
"r_multiplier": 1.0, # How much red
|
|
|
|
"g_multiplier": 1.0, # How much green
|
|
|
|
"b_multiplier": 1.0, # How much blue
|
|
|
|
"blur": 0.2}, # Amount of blur to apply
|
|
|
|
"Power": {"color_mode": "Spectral", # Colour gradient to display
|
|
|
|
"s_count": 20, # Initial number of sparks
|
|
|
|
"s_color": "White", # Color of sparks
|
|
|
|
"mirror": True, # Mirror output down central axis
|
|
|
|
"flip_lr":False}, # Flip output left-right
|
|
|
|
"Single": {"color": "Purple"}, # Static color to show
|
|
|
|
"Beat": {"color": "Red", # Colour of beat flash
|
|
|
|
"decay": 0.7}, # How quickly the flash fades away
|
|
|
|
"Bars": {"resolution":4, # Number of "bars"
|
|
|
|
"color_mode":"Spectral", # Multicolour mode to use
|
|
|
|
"roll_speed":0, # How fast (if at all) to cycle colour colours across strip
|
|
|
|
"mirror": False, # Mirror down centre of strip
|
|
|
|
#"reverse_grad": False, # Flip (LR) gradient
|
|
|
|
"reverse_roll": False, # Reverse movement of gradient roll
|
|
|
|
"flip_lr":False}, # Flip output left-right
|
|
|
|
"Gradient": {"color_mode":"Spectral", # Colour gradient to display
|
|
|
|
"roll_speed": 0, # How fast (if at all) to cycle colour colours across strip
|
|
|
|
"mirror": False, # Mirror gradient down central axis
|
|
|
|
"reverse": False}, # Reverse movement of gradient
|
|
|
|
"Fade": {"color_mode":"Spectral", # Colour gradient to fade through
|
|
|
|
"roll_speed": 1, # How fast (if at all) to fade through colours
|
|
|
|
"reverse": False}, # Reverse "direction" of fade (r->g->b or r<-g<-b)
|
|
|
|
"Calibration":{"r": 100,
|
|
|
|
"g": 100,
|
|
|
|
"b": 100}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Collection of different colours in RGB format
|
|
|
|
"colors":{"Red":(255,0,0),
|
|
|
|
"Orange":(255,40,0),
|
|
|
|
"Yellow":(255,255,0),
|
|
|
|
"Green":(0,255,0),
|
|
|
|
"Blue":(0,0,255),
|
|
|
|
"Light blue":(1,247,161),
|
|
|
|
"Purple":(80,5,252),
|
|
|
|
"Pink":(255,0,178),
|
|
|
|
"White":(255,255,255)},
|
|
|
|
|
|
|
|
# Multicolour gradients. Colours must be in list above
|
|
|
|
"gradients":{"Spectral" : ["Red", "Orange", "Yellow", "Green", "Light blue", "Blue", "Purple", "Pink"],
|
|
|
|
"Dancefloor": ["Red", "Pink", "Purple", "Blue"],
|
|
|
|
"Sunset" : ["Red", "Orange", "Yellow"],
|
|
|
|
"Ocean" : ["Green", "Light blue", "Blue"],
|
|
|
|
"Jungle" : ["Green", "Red", "Orange"],
|
|
|
|
"Sunny" : ["Yellow", "Light blue", "Orange", "Blue"]
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
"""
|
|
|
|
~~ NOTES ~~
|
|
|
|
|
|
|
|
[use_defaults]
|
|
|
|
|
|
|
|
For any dicts in this file (config.py), you can add them into the use_defaults
|
|
|
|
dict to force the program to use these values over any stored in settings.ini
|
|
|
|
that you would have set using the GUI. At runtime, settings.ini is used to update
|
|
|
|
the above dicts with custom set values.
|
|
|
|
|
|
|
|
If you're running a headless RPi, you may want to edit settings in this file, then
|
|
|
|
specify to use the dict you wrote, rather than have the program overwrite from
|
|
|
|
settings.ini at runtime. You could also run the program with the gui, set the
|
|
|
|
settings that you want, then disable the gui and the custom settings will still
|
|
|
|
be loaded. Basically it works as you would expect it to.
|
|
|
|
|
|
|
|
[DEVICE TYPE]
|
|
|
|
|
|
|
|
Device used to control LED strip.
|
2017-12-18 21:50:27 +01:00
|
|
|
|
|
|
|
'esp8266' means that you are using an ESP8266 module to control the LED strip
|
2018-02-27 21:12:08 +01:00
|
|
|
and commands will be sent to the ESP8266 over WiFi. You can have as many of
|
|
|
|
these as your computer is able to handle.
|
2017-12-18 21:50:27 +01:00
|
|
|
|
|
|
|
'pi' means that you are using a Raspberry Pi as a standalone unit to process
|
|
|
|
audio input and control the LED strip directly.
|
|
|
|
|
|
|
|
'blinkstick' means that a BlinkstickPro is connected to this PC which will be used
|
|
|
|
to control the leds connected to it.
|
|
|
|
|
2018-02-27 21:12:08 +01:00
|
|
|
'fadecandy' means that a fadecandy server is running on your computer and is connected
|
|
|
|
via usb to a fadecandy board connected to LEDs
|
|
|
|
|
|
|
|
'dotstar' creates an APA102-based output device. LMK if you have any success
|
|
|
|
getting this to work becuase i have no clue if it will.
|
|
|
|
|
2017-12-18 21:50:27 +01:00
|
|
|
'stripless' means that the program will run without sending data to a strip.
|
|
|
|
Useful for development etc, but doesn't look half as good ;)
|
|
|
|
|
2018-02-27 21:12:08 +01:00
|
|
|
[REQUIRED CONFIGURATION KEYS]
|
|
|
|
|
|
|
|
===== 'esp8266'
|
|
|
|
"AUTO_DETECT" # Set this true if you're using windows hotspot to connect (see below for more info)
|
|
|
|
"MAC_ADDR" # MAC address of the ESP8266. Only used if AUTO_DETECT is True
|
|
|
|
"UDP_IP" # IP address of the ESP8266. Must match IP in ws2812_controller.ino
|
|
|
|
"UDP_PORT" # Port number used for socket communication between Python and ESP8266
|
|
|
|
===== 'pi'
|
|
|
|
"LED_PIN" # GPIO pin connected to the LED strip pixels (must support PWM)
|
|
|
|
"LED_FREQ_HZ" # LED signal frequency in Hz (usually 800kHz)
|
|
|
|
"LED_DMA" # DMA channel used for generating PWM signal (try 5)
|
|
|
|
"BRIGHTNESS" # Brightness of LED strip between 0 and 255
|
|
|
|
"LED_INVERT" # Set True if using an inverting logic level converter
|
|
|
|
===== 'blinkstick'
|
|
|
|
No required configuration keys
|
|
|
|
===== 'fadecandy'
|
|
|
|
"SERVER" # Address of fadecandy server. (usually 'localhost:7890')
|
|
|
|
===== 'dotstar'
|
|
|
|
No required configuration keys
|
|
|
|
===== 'stripless'
|
|
|
|
No required configuration keys (heh)
|
|
|
|
|
|
|
|
[AUTO_DETECT]
|
|
|
|
|
|
|
|
Set to true if the ip address of the device changes. This is the case if it's connecting
|
|
|
|
through windows hotspot, for instance. If so, give the mac address of the device. This
|
|
|
|
allows windows to look for the device's IP using "arp -a" and finding the matching
|
|
|
|
mac address. I haven't tested this on Linux or macOS.
|
|
|
|
|
|
|
|
[FPS]
|
2017-12-18 21:50:27 +01:00
|
|
|
|
|
|
|
FPS indicates the desired refresh rate, or frames-per-second, of the audio
|
|
|
|
visualization. The actual refresh rate may be lower if the computer cannot keep
|
|
|
|
up with desired FPS value.
|
|
|
|
|
|
|
|
Higher framerates improve "responsiveness" and reduce the latency of the
|
|
|
|
visualization but are more computationally expensive.
|
|
|
|
|
|
|
|
Low framerates are less computationally expensive, but the visualization may
|
|
|
|
appear "sluggish" or out of sync with the audio being played if it is too low.
|
|
|
|
|
|
|
|
The FPS should not exceed the maximum refresh rate of the LED strip, which
|
|
|
|
depends on how long the LED strip is.
|
|
|
|
|
2018-02-27 21:12:08 +01:00
|
|
|
[N_FFT_BINS]
|
2017-12-18 21:50:27 +01:00
|
|
|
|
|
|
|
Fast Fourier transforms are used to transform time-domain audio data to the
|
|
|
|
frequency domain. The frequencies present in the audio signal are assigned
|
|
|
|
to their respective frequency bins. This value indicates the number of
|
|
|
|
frequency bins to use.
|
|
|
|
|
|
|
|
A small number of bins reduces the frequency resolution of the visualization
|
|
|
|
but improves amplitude resolution. The opposite is true when using a large
|
|
|
|
number of bins. More bins is not always better!
|
|
|
|
|
|
|
|
There is no point using more bins than there are pixels on the LED strip.
|
|
|
|
"""
|
|
|
|
|
2018-02-27 21:12:08 +01:00
|
|
|
for board in settings["devices"]:
|
|
|
|
if settings["devices"][board]["configuration"]["TYPE"] == 'esp8266':
|
|
|
|
settings["devices"][board]["configuration"]["SOFTWARE_GAMMA_CORRECTION"] = False
|
|
|
|
# Set to False because the firmware handles gamma correction + dither
|
|
|
|
elif settings["devices"][board]["configuration"]["TYPE"] == 'pi':
|
|
|
|
settings["devices"][board]["configuration"]["SOFTWARE_GAMMA_CORRECTION"] = True
|
|
|
|
# Set to True because Raspberry Pi doesn't use hardware dithering
|
|
|
|
elif settings["devices"][board]["configuration"]["TYPE"] == 'blinkstick':
|
|
|
|
settings["devices"][board]["configuration"]["SOFTWARE_GAMMA_CORRECTION"] = True
|
|
|
|
elif settings["devices"][board]["configuration"]["TYPE"] == 'dotstar':
|
|
|
|
settings["devices"][board]["configuration"]["SOFTWARE_GAMMA_CORRECTION"] = False
|
|
|
|
elif settings["devices"][board]["configuration"]["TYPE"] == 'fadecandy':
|
|
|
|
settings["devices"][board]["configuration"]["SOFTWARE_GAMMA_CORRECTION"] = False
|
|
|
|
elif settings["devices"][board]["configuration"]["TYPE"] == 'stripless':
|
|
|
|
settings["devices"][board]["configuration"]["SOFTWARE_GAMMA_CORRECTION"] = False
|
|
|
|
else:
|
|
|
|
raise ValueError("Invalid device selected. Device {} not known.".format(settings["devices"][board]["configuration"]["TYPE"]))
|
|
|
|
settings["devices"][board]["effect_opts"]["Power"]["s_count"] = settings["devices"][board]["configuration"]["N_PIXELS"]//6
|
|
|
|
# Cheeky lil fix in case the user sets an odd number of LEDs
|
|
|
|
if settings["devices"][board]["configuration"]["N_PIXELS"] % 2:
|
|
|
|
settings["devices"][board]["configuration"]["N_PIXELS"] -= 1
|
|
|
|
|
|
|
|
# Ignore these
|
|
|
|
# settings["configuration"]['_max_led_FPS'] = int(((settings["configuration"]["N_PIXELS"] * 30e-6) + 50e-6)**-1.0)
|
2017-12-18 21:50:27 +01:00
|
|
|
|