FastLED 3.9.15
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) override;
57 void fireCallbacks() override;
58 bool needsFFT() const override { return true; }
59 bool needsFFTHistory() const override { return false; }
60 const char* getName() const override { return "BuildupDetector"; }
61 void reset() 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 { return mBuildupActive; }
72 float getIntensity() const { return mCurrentBuildup.intensity; }
73 float getProgress() const { return mCurrentBuildup.progress; }
74 const Buildup& getBuildup() const { return mCurrentBuildup; }
75
76 // Configuration
77 void setMinDuration(u32 ms) { mMinDuration = ms; }
78 void setMaxDuration(u32 ms) { mMaxDuration = ms; }
79 void setIntensityThreshold(float threshold) { mIntensityThreshold = threshold; }
80 void setEnergyRiseThreshold(float threshold) { 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; // Calculate energy rise trend
117 float calculateTrebleTrend() const; // Calculate treble rise trend
118 float calculateBuildupIntensity(float energyTrend, float trebleTrend, float rms) const;
119 bool shouldStartBuildup(float intensity) const;
120 bool shouldEndBuildup() const;
121 bool shouldPeak() const;
122 void updateEnergyHistory(float energy);
123 void updateTrebleHistory(float treble);
124 float getTrebleEnergy(const fft::Bins& fft) const;
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 override
Definition buildup.h:59
SavitzkyGolayFilter< float, 7 > mTrebleSG
Definition buildup.h:100
bool needsFFT() const override
Definition buildup.h:58
function_list< void()> onBuildupEnd
Definition buildup.h:67
const char * getName() const override
Definition buildup.h:60
const Buildup & getBuildup() const
Definition buildup.h:74
function_list< void(float progress)> onBuildupProgress
Definition buildup.h:65
function_list< void(const Buildup &)> onBuildup
Definition buildup.h:68
void update(shared_ptr< Context > context) override
~BuildupDetector() FL_NOEXCEPT override
shared_ptr< const fft::Bins > mRetainedFFT
Definition buildup.h:113
void setIntensityThreshold(float threshold)
Definition buildup.h:79
function_list< void()> onBuildupStart
Definition buildup.h:64
float getTrebleEnergy(const fft::Bins &fft) const
float calculateBuildupIntensity(float energyTrend, float trebleTrend, float rms) const
function_list< void()> onBuildupPeak
Definition buildup.h:66
void setEnergyRiseThreshold(float threshold)
Definition buildup.h:80
bool shouldStartBuildup(float intensity) const
Base definition for an LED controller.
Definition crgb.hpp:179
#define FL_NOEXCEPT