34#define FASTLED_ESP32_USE_CLOCKLESS_SPI
40#if defined(FL_IS_TEENSY)
70#define LED_DIAMETER 0.15f
79 "A ring that listens to the room and lights the room back. Grant mic "
80 "access, or drag in a .wav.");
130 auto input =
audio.audioInput();
135 fl::printf(
"MoodRing: audio routed via FastLED.add() (auto-pump)\n");
141 fl::printf(
"MoodRing: audio using manual pump (fallback)\n");
147 Serial.println(
"MoodRing setup complete");
169 fl::printf(
"MoodRing %s c/f/g=%.2f/%.2f/%.2f pres=%.2f en=%.2f tr=%+.2f "
170 "punch=%.2f shim=%.2f bands=%.2f/%.2f/%.2f bpm=%.0f conf=%.2f "
171 "warm=%.2f ar=%.2f pulses=%d\n",
179 const fl::u32 now = millis();
184 if (sample.isValid() &&
listen.value()) {
203 static const char *sLastRegime =
"";
204 const char *regime =
gListener->regimeName();
205 if (regime != sLastRegime) {
206 sLastRegime = regime;
207 fl::printf(
"MoodRing: regime -> %s\n", regime);
210 static fl::u32 sFrame = 0;
225 FastLED.setBrightness(finalBrightness);
fl::UIAudio audio("Audio Input")
fl::UIDescription description("Demo of the Animatrix effects. @author of fx is StefanPetrick")
fl::UISlider brightness("Brightness", BRIGHTNESS, 0, 255)
uint8_t applyBrightnessCompression(float inputBrightnessPercent, uint8_t maxBrightness, float lowThreshold, float highThreshold)
float getAverageBrightness(fl::span< const CRGB > leds)
fl::ScreenMap makeRingScreenMap(int numLeds, int gridWidth, int gridHeight, float diameter)
fl::UISlider autoBrightnessLowThreshold("Auto Brightness Low Threshold", 8, 0, 100, 1)
fl::UICheckbox autoBrightness("Auto Brightness", true)
fl::UISlider autoBrightnessHighThreshold("Auto Brightness High Threshold", 22, 0, 100, 1)
fl::UISlider autoBrightnessMax("Auto Brightness Max", 84, 0, 255, 1)
FL_DISABLE_WARNING_PUSH FL_DISABLE_WARNING_GLOBAL_CONSTRUCTORS CFastLED FastLED
Global LED strip management instance.
fl::UIAudio audio("Audio Input")
fl::UICheckbox pulses("Beat Pulses", true)
fl::UISlider pulseOrigin("Pulse Origin (turns)", 0.0f, 0.0f, 1.0f, 0.01f)
fl::UISlider presenceReleaseMs("Settle Into Calm (ms)", 900, 200, 4000, 50)
fl::shared_ptr< mood_ring::RoomListener > gListener
mood_ring::MoodPainter gPainter
fl::UICheckbox listen("Listen", true)
fl::UISlider grooveGain("Layer: Groove", 1.0f, 0.0f, 1.0f, 0.05f)
fl::UISlider brightness("Brightness", BRIGHTNESS, 0, 255, 1)
fl::UISlider grooveEnter("Groove Enter Confidence", 0.60f, 0.1f, 1.0f, 0.01f)
fl::UISlider trailOverride("Trail Keep Override", -1.0f, -1.0f, 0.98f, 0.02f)
fl::UISlider breathGain("Layer: Breath", 1.0f, 0.0f, 1.0f, 0.05f)
fl::UISlider autoBrightnessLowThreshold("Auto Brightness Low Threshold", 8, 0, 100, 1)
fl::UICheckbox autoBrightness("Auto Brightness", true)
static void applyUiTuning()
fl::shared_ptr< fl::audio::Processor > gProcessor
fl::UICheckbox trails("Trails", true)
fl::UICheckbox debugPrint("Debug: Print Sense", false)
fl::UISlider grooveExit("Groove Exit Confidence", 0.35f, 0.0f, 0.9f, 0.01f)
fl::UISlider autoBrightnessHighThreshold("Auto Brightness High Threshold", 22, 0, 100, 1)
fl::UISlider punchGain("Punch Gain", 1.5f, 0.0f, 3.0f, 0.05f)
static void printSense(const mood_ring::RoomSense &s)
FASTLED_TITLE("MoodRing")
fl::UISlider autoBrightnessMax("Auto Brightness Max", 84, 0, 255, 1)
fl::UISlider flowGain("Layer: Flow", 1.0f, 0.0f, 1.0f, 0.05f)
fl::UISlider grooveAttackMs("Trust A Beat After (ms)", 800, 100, 4000, 50)
@ TypicalLEDStrip
Typical values for SMD5050 LEDs.
void printf(const char *format) FL_NO_EXCEPT
shared_ptr< T > make_shared(Args &&... args) FL_NO_EXCEPT
float shimmer
treble transient
float punchGain
scales the bass transient
float arousal
0 calm .. 1 energetic
float punch
bass transient (a hit, not loudness)
float grooveAttackMs
how slowly we start trusting a beat
float presenceReleaseMs
how slowly silence settles in
float energy
smoothed loudness
float trend
[-1, 1] falling .. rising
float grooveExit
confidence where groove is fully off
float presence
sound is present (silence -> 0)
float warmth
0 cool .. 1 warm, from valence
float grooveEnter
confidence where groove is fully on
float trailOverride
< 0 follows the regime blend
Everything a visual is allowed to react to.
Everything the UI is allowed to tune on the listening side.
Aggregator header for the fl/ui/ family of per-element UI types.