This commit adds support for the Raspberry Pi, which allows users to create a completely standalone music visualization system. The Raspberry Pi should be connected directly to a ws2812b LED strip. A PWM-capable GPIO pin should be connected to the data line of the LED strip. A USB audio input device should be connected to one of the Raspberry Pi's USB ports. It is recommended that the GUI and FPS output be disabled when running the visualization on the Raspberry Pi. These features can degrade performance on the already computationally limited Raspberry Pi.
90 lines
3.1 KiB
Python
90 lines
3.1 KiB
Python
"""Settings for audio reactive LED strip"""
|
|
from __future__ import print_function
|
|
from __future__ import division
|
|
import os
|
|
|
|
DEVICE = 'pi'
|
|
"""Device used to control LED strip. Must be 'pi' or 'esp8266'"""
|
|
|
|
if DEVICE == 'esp8266':
|
|
UDP_IP = '192.168.137.150'
|
|
"""IP address of the ESP8266. Must match IP in ws2812_controller.ino"""
|
|
UDP_PORT = 7777
|
|
"""Port number used for socket communication between Python and ESP8266"""
|
|
|
|
if DEVICE == 'pi':
|
|
LED_PIN = 18
|
|
"""GPIO pin connected to the LED strip pixels (must support PWM)"""
|
|
LED_FREQ_HZ = 800000
|
|
"""LED signal frequency in Hz (usually 800kHz)"""
|
|
LED_DMA = 5
|
|
"""DMA channel used for generating PWM signal (try 5)"""
|
|
BRIGHTNESS = 255
|
|
"""Brightness of LED strip between 0 and 255"""
|
|
LED_INVERT = True
|
|
"""Set True if using an inverting logic level converter"""
|
|
|
|
USE_GUI = False
|
|
"""Whether or not to display a PyQtGraph GUI plot of visualization"""
|
|
|
|
DISPLAY_FPS = False
|
|
"""Whether to display the FPS when running (can reduce performance)"""
|
|
|
|
N_PIXELS = 60
|
|
"""Number of pixels in the LED strip (must match ESP8266 firmware)"""
|
|
|
|
GAMMA_TABLE_PATH = os.path.join(os.path.dirname(__file__), 'gamma_table.npy')
|
|
"""Location of the gamma correction table"""
|
|
|
|
GAMMA_CORRECTION = True
|
|
"""Whether to correct LED brightness for nonlinear brightness perception"""
|
|
|
|
MIC_RATE = 44100
|
|
"""Sampling frequency of the microphone in Hz"""
|
|
|
|
FPS = 60
|
|
"""Desired refresh rate of the visualization (frames per second)
|
|
|
|
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.
|
|
"""
|
|
_max_led_FPS = int(((N_PIXELS * 30e-6) + 50e-6)**-1.0)
|
|
assert FPS <= _max_led_FPS, 'FPS must be <= {}'.format(_max_led_FPS)
|
|
|
|
MIN_FREQUENCY = 200
|
|
"""Frequencies below this value will be removed during audio processing"""
|
|
|
|
MAX_FREQUENCY = 12000
|
|
"""Frequencies above this value will be removed during audio processing"""
|
|
|
|
N_FFT_BINS = 15
|
|
"""Number of frequency bins to use when transforming audio to frequency domain
|
|
|
|
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.
|
|
|
|
There is no point using more bins than there are pixels on the LED strip.
|
|
"""
|
|
|
|
N_ROLLING_HISTORY = 2
|
|
"""Number of past audio frames to include in the rolling window"""
|
|
|
|
MIN_VOLUME_THRESHOLD = 1e-7
|
|
"""No music visualization displayed if recorded audio volume below threshold"""
|