FastLED 3.10.8
Loading...
Searching...
No Matches
buildup.h
Go to the documentation of this file.
1// BuildupDetector.h - EDM buildup detection for FastLED audio system
2// Detects rising energy and tension patterns typical of EDM buildups
3
4#pragma once
5
8#include "fl/stl/function.h"
9#include "fl/stl/noexcept.h"
10
11namespace fl {
12namespace audio {
13namespace detector {
14
15// Forward declarations
16
17// Buildup event structure
18struct Buildup {
19 float intensity; // Buildup intensity (0.0 to 1.0)
20 float progress; // Progress through buildup (0.0 to 1.0)
21 u32 duration; // Duration in milliseconds
22 u32 timestamp; // When buildup started
23 bool active; // Whether buildup is currently active
24
26 : intensity(0.0f)
27 , progress(0.0f)
28 , duration(0)
29 , timestamp(0)
30 , active(false) {}
31};
32
33// BuildupDetector - Detects rising energy and tension patterns in EDM music
34//
35// EDM buildups are characterized by:
36// 1. Rising energy over time (energy ramp)
37// 2. Increasing high-frequency content (filter sweeps)
38// 3. Increasing spectral complexity (layering)
39// 4. Sustained duration (typically 4-16 seconds)
40//
41// The detector tracks multiple indicators and combines them to detect buildups
42// with high confidence. It's optimized for EDM, trap, dubstep, and similar genres.
43//
44// Usage:
45// BuildupDetector buildup;
46// buildup.onBuildupStart([]() { /* React to buildup start */ });
47// buildup.onBuildupProgress([](float progress) { /* Update UI */ });
48// buildup.onBuildupPeak([]() { /* Trigger drop effect */ });
49//
50class BuildupDetector : public Detector {
51public:
54
55 // Detector interface
56 void update(shared_ptr<Context> context) FL_NO_EXCEPT override;
57 void fireCallbacks() FL_NO_EXCEPT override;
58 bool needsFFT() const FL_NO_EXCEPT override { return true; }
59 bool needsFFTHistory() const FL_NO_EXCEPT override { return false; }
60 const char* getName() const FL_NO_EXCEPT override { return "BuildupDetector"; }
61 void reset() FL_NO_EXCEPT override;
62
63 // Event callbacks (multiple listeners supported)
64 function_list<void()> onBuildupStart; // Fired when buildup starts
65 function_list<void(float progress)> onBuildupProgress; // Fired during buildup (0.0-1.0)
66 function_list<void()> onBuildupPeak; // Fired at peak (just before drop)
67 function_list<void()> onBuildupEnd; // Fired when buildup ends (cancelled)
68 function_list<void(const Buildup&)> onBuildup; // Fired every frame during buildup
69
70 // State access
71 bool isBuilding() const FL_NO_EXCEPT { return mBuildupActive; }
72 float getIntensity() const FL_NO_EXCEPT { return mCurrentBuildup.intensity; }
73 float getProgress() const FL_NO_EXCEPT { return mCurrentBuildup.progress; }
75
76 // Configuration
79 void setIntensityThreshold(float threshold) FL_NO_EXCEPT { mIntensityThreshold = threshold; }
80 void setEnergyRiseThreshold(float threshold) FL_NO_EXCEPT { mEnergyRiseThreshold = threshold; }
81
82private:
83 // Current buildup state
87
88 // Energy tracking for rise detection
89 float mEnergyHistory[32]; // Last 32 frames (~0.7s at 44.1kHz, 512 samples)
92
93 // High-frequency content tracking
94 float mTrebleHistory[16]; // Last 16 frames (~0.35s)
97
98 // SavitzkyGolay filters for smooth trend estimation (preserves peaks)
101
102 // Previous frame state
106
107 // Configuration
108 u32 mMinDuration; // Minimum buildup duration (ms)
109 u32 mMaxDuration; // Maximum buildup duration (ms)
110 float mIntensityThreshold; // Minimum intensity to start buildup
111 float mEnergyRiseThreshold; // Minimum energy rise rate
112
114
115 // Analysis methods
116 float calculateEnergyTrend() const FL_NO_EXCEPT; // Calculate energy rise trend
117 float calculateTrebleTrend() const FL_NO_EXCEPT; // Calculate treble rise trend
118 float calculateBuildupIntensity(float energyTrend, float trebleTrend, float rms) const FL_NO_EXCEPT;
119 bool shouldStartBuildup(float intensity) const FL_NO_EXCEPT;
120 bool shouldEndBuildup() const FL_NO_EXCEPT;
121 bool shouldPeak() const FL_NO_EXCEPT;
122 void updateEnergyHistory(float energy) FL_NO_EXCEPT;
123 void updateTrebleHistory(float treble) FL_NO_EXCEPT;
124 float getTrebleEnergy(const fft::Bins& fft) const FL_NO_EXCEPT;
125
126 // Pending callback flags
127 bool mFireBuildupStart = false;
128 bool mFireBuildupPeak = false;
129 bool mFireBuildupEnd = false;
131 bool mFireBuildup = false;
132};
133
134} // namespace detector
135} // namespace audio
136} // namespace fl
float rms(fl::span< const int16_t > data)
Definition simple.h:104
SavitzkyGolayFilter< float, 7 > mEnergySG
Definition buildup.h:99
bool needsFFTHistory() const FL_NO_EXCEPT override
Definition buildup.h:59
float getIntensity() const FL_NO_EXCEPT
Definition buildup.h:72
void updateTrebleHistory(float treble) FL_NO_EXCEPT
float calculateBuildupIntensity(float energyTrend, float trebleTrend, float rms) const FL_NO_EXCEPT
float calculateEnergyTrend() const FL_NO_EXCEPT
void update(shared_ptr< Context > context) FL_NO_EXCEPT override
SavitzkyGolayFilter< float, 7 > mTrebleSG
Definition buildup.h:100
void fireCallbacks() FL_NO_EXCEPT override
bool shouldEndBuildup() const FL_NO_EXCEPT
function_list< void()> onBuildupEnd
Definition buildup.h:67
void updateEnergyHistory(float energy) FL_NO_EXCEPT
bool shouldPeak() const FL_NO_EXCEPT
bool shouldStartBuildup(float intensity) const FL_NO_EXCEPT
~BuildupDetector() FL_NO_EXCEPT override
const Buildup & getBuildup() const FL_NO_EXCEPT
Definition buildup.h:74
float getTrebleEnergy(const fft::Bins &fft) const FL_NO_EXCEPT
function_list< void(float progress)> onBuildupProgress
Definition buildup.h:65
void setIntensityThreshold(float threshold) FL_NO_EXCEPT
Definition buildup.h:79
float getProgress() const FL_NO_EXCEPT
Definition buildup.h:73
void setMaxDuration(u32 ms) FL_NO_EXCEPT
Definition buildup.h:78
function_list< void(const Buildup &)> onBuildup
Definition buildup.h:68
shared_ptr< const fft::Bins > mRetainedFFT
Definition buildup.h:113
function_list< void()> onBuildupStart
Definition buildup.h:64
float calculateTrebleTrend() const FL_NO_EXCEPT
void reset() FL_NO_EXCEPT override
function_list< void()> onBuildupPeak
Definition buildup.h:66
void setEnergyRiseThreshold(float threshold) FL_NO_EXCEPT
Definition buildup.h:80
void setMinDuration(u32 ms) FL_NO_EXCEPT
Definition buildup.h:77
bool isBuilding() const FL_NO_EXCEPT
Definition buildup.h:71
const char * getName() const FL_NO_EXCEPT override
Definition buildup.h:60
bool needsFFT() const FL_NO_EXCEPT override
Definition buildup.h:58
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
Base definition for an LED controller.
Definition crgb.hpp:179
Buildup() FL_NO_EXCEPT
Definition buildup.h:25