FastLED 3.9.15
Loading...
Searching...
No Matches

◆ begin()

void fl::audio::Reactive::begin ( const ReactiveConfig & config = ReactiveConfig{})

Definition at line 40 of file audio_reactive.cpp.hpp.

40 {
41 setConfig(config);
42
43 // Reset state
44 mCurrentData = Data{};
45 mSmoothedData = Data{};
46 mLastBeatTime = 0;
47 mPreviousVolume = 0.0f;
48
49 // Configure signal conditioning components
50 SignalConditionerConfig scConfig;
51 scConfig.enableDCRemoval = config.enableSignalConditioning;
52 scConfig.enableSpikeFilter = config.enableSignalConditioning;
53 scConfig.enableNoiseGate = config.noiseGate && config.enableSignalConditioning;
54 mSignalConditioner.configure(scConfig);
55 mSignalConditioner.reset();
56
57 NoiseFloorTrackerConfig nfConfig;
58 nfConfig.enabled = config.enableNoiseFloorTracking;
59 mNoiseFloorTracker.configure(nfConfig);
60 mNoiseFloorTracker.reset();
61
62 // Configure frequency bin mapper (obligatory - fixes hardcoded sample rate)
63 FrequencyBinMapperConfig fbmConfig;
64 fbmConfig.mode = FrequencyBinMode::Bins16;
65 fbmConfig.sampleRate = config.sampleRate;
66 fbmConfig.useLogSpacing = config.enableLogBinSpacing;
67 fbmConfig.minFrequency = 20.0f;
68 fbmConfig.maxFrequency = static_cast<float>(config.sampleRate) / 2.0f; // Nyquist
69 // fftBinCount will be set when we know the fft::FFT size (after first processSample)
70 fbmConfig.fftBinCount = 256; // Default, overridden when actual fft::FFT size known
71 mFrequencyBinMapper.configure(fbmConfig);
72
73 // Compute pink noise compensation gains from log-spaced CQ bin centers.
74 // CQ bins are log-spaced from fmin to fmax (default: 90-14080 Hz),
75 // matching Bins::binToFreq().
76 {
77 const float fmin = fft::Args::DefaultMinFrequency();
78 const float fmax = fft::Args::DefaultMaxFrequency();
79 const float m = fl::logf(fmax / fmin);
80 float binCenters[16];
81 for (int i = 0; i < 16; ++i) {
82 binCenters[i] = fmin * fl::expf(m * static_cast<float>(i) / 15.0f);
83 }
85 mPinkNoiseComputed = true;
86 }
87
88 // Reset enhanced beat detection components
90 mSpectralFluxDetector->reset();
91 mSpectralFluxDetector->setThreshold(config.spectralFluxThreshold);
92 }
93
94 // Configure musical beat detection (Phase 3 middleware - lazy creation)
95 if (config.enableMusicalBeatDetection) {
98 }
99 detector::MusicalBeatDetectorConfig mbdConfig;
100 mbdConfig.minBPM = config.musicalBeatMinBPM;
101 mbdConfig.maxBPM = config.musicalBeatMaxBPM;
102 mbdConfig.minBeatConfidence = config.musicalBeatConfidence;
103 mbdConfig.sampleRate = config.sampleRate;
104 mbdConfig.samplesPerFrame = 512; // Typical fft::FFT frame size
105 mMusicalBeatDetector->configure(mbdConfig);
106 mMusicalBeatDetector->reset();
107 } else {
108 mMusicalBeatDetector.reset();
109 }
110
111 if (config.enableMultiBandBeats) {
114 }
115 detector::MultiBandBeatDetectorConfig mbbdConfig;
116 mbbdConfig.bassThreshold = config.bassThreshold;
117 mbbdConfig.midThreshold = config.midThreshold;
118 mbbdConfig.trebleThreshold = config.trebleThreshold;
119 mMultiBandBeatDetector->configure(mbbdConfig);
120 mMultiBandBeatDetector->reset();
121 } else {
123 }
124
125 // Configure spectral equalizer (optional - lazy creation)
126 if (config.enableSpectralEqualizer) {
127 if (!mSpectralEqualizer) {
129 }
130 SpectralEqualizerConfig seConfig;
131 seConfig.curve = EqualizationCurve::AWeighting;
132 seConfig.numBands = 16;
133 mSpectralEqualizer->configure(seConfig);
134 } else {
135 mSpectralEqualizer.reset();
136 }
137
138 // Reset previous magnitudes
139 for (fl::size i = 0; i < mPreviousMagnitudes.size(); ++i) {
140 mPreviousMagnitudes[i] = 0.0f;
141 }
142
143 // Reset silence envelopes for spectral metrics.
144 mDominantFrequencyEnvelope.reset(0.0f);
145 mMagnitudeEnvelope.reset(0.0f);
146 mSpectralFluxEnvelope.reset(0.0f);
147
148 // Update Context sample rate
149 mContext->setSampleRate(config.sampleRate);
150
151 // Ensure internal Processor exists and is configured.
152 // Eager creation so processSample() can always source volume from it.
154 mAudioProcessor->setSampleRate(config.sampleRate);
155 mAudioProcessor->reset();
156 // Force EnergyAnalyzer detector registration so updateFromContext() updates it
157 mAudioProcessor->getEnergy();
158}
fl::unique_ptr< SpectralFluxDetector > mSpectralFluxDetector
SilenceEnvelope mDominantFrequencyEnvelope
fl::unique_ptr< SpectralEqualizer > mSpectralEqualizer
fl::unique_ptr< detector::MultiBandBeat > mMultiBandBeatDetector
shared_ptr< Context > mContext
fl::unique_ptr< Processor > mAudioProcessor
Processor & ensureAudioProcessor()
SilenceEnvelope mMagnitudeEnvelope
void setConfig(const ReactiveConfig &config)
SignalConditioner mSignalConditioner
NoiseFloorTracker mNoiseFloorTracker
fl::unique_ptr< detector::MusicalBeat > mMusicalBeatDetector
fl::array< float, 16 > mPreviousMagnitudes
SilenceEnvelope mSpectralFluxEnvelope
FrequencyBinMapper mFrequencyBinMapper
void computePinkNoiseGains(const float *binCenters, int numBins, float *out)
Compute pink noise compensation gains for all bins.
float expf(float value) FL_NOEXCEPT
Definition math.h:398
fl::enable_if<!fl::is_array< T >::value, unique_ptr< T > >::type make_unique(Args &&... args) FL_NOEXCEPT
Definition unique_ptr.h:261
float logf(float value) FL_NOEXCEPT
Definition math.h:418
static float DefaultMaxFrequency() FL_NOEXCEPT
Definition fft.h:128
static float DefaultMinFrequency() FL_NOEXCEPT
Definition fft.h:127

References Reactive(), fl::audio::AWeighting, fl::audio::detector::MultiBandBeatDetectorConfig::bassThreshold, begin(), fl::audio::Bins16, fl::audio::computePinkNoiseGains(), fl::audio::SpectralEqualizerConfig::curve, fl::audio::fft::Args::DefaultMaxFrequency(), fl::audio::fft::Args::DefaultMinFrequency(), fl::audio::NoiseFloorTrackerConfig::enabled, fl::audio::SignalConditionerConfig::enableDCRemoval, fl::audio::SignalConditionerConfig::enableNoiseGate, fl::audio::SignalConditionerConfig::enableSpikeFilter, ensureAudioProcessor(), fl::expf(), fl::audio::FrequencyBinMapperConfig::fftBinCount, fl::logf(), fl::make_unique(), mAudioProcessor, fl::audio::detector::MusicalBeatDetectorConfig::maxBPM, fl::audio::FrequencyBinMapperConfig::maxFrequency, mContext, mCurrentData, mDominantFrequencyEnvelope, mFrequencyBinMapper, fl::audio::detector::MultiBandBeatDetectorConfig::midThreshold, fl::audio::detector::MusicalBeatDetectorConfig::minBeatConfidence, fl::audio::detector::MusicalBeatDetectorConfig::minBPM, fl::audio::FrequencyBinMapperConfig::minFrequency, mLastBeatTime, mMagnitudeEnvelope, mMultiBandBeatDetector, mMusicalBeatDetector, mNoiseFloorTracker, fl::audio::FrequencyBinMapperConfig::mode, mPinkNoiseComputed, mPinkNoiseGains, mPreviousMagnitudes, mPreviousVolume, mSignalConditioner, mSmoothedData, mSpectralEqualizer, mSpectralFluxDetector, mSpectralFluxEnvelope, fl::audio::SpectralEqualizerConfig::numBands, fl::audio::detector::MusicalBeatDetectorConfig::sampleRate, fl::audio::FrequencyBinMapperConfig::sampleRate, fl::audio::detector::MusicalBeatDetectorConfig::samplesPerFrame, setConfig(), fl::audio::detector::MultiBandBeatDetectorConfig::trebleThreshold, and fl::audio::FrequencyBinMapperConfig::useLogSpacing.

Referenced by ~Reactive(), and begin().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: