40 u32 timestamp = context->getTimestamp();
62 size numBins =
fl::min(
static_cast<size
>(8),
fft.raw().size());
86 const bool isSilent = context->isSilent();
136 size numBins =
fl::min(
static_cast<size
>(8),
fft.raw().size());
139 for (size i = 0; i < numBins; i++) {
146 return flux /
static_cast<float>(numBins);
163 u32 timeSinceLastOnset = timestamp -
mOnsetTimes.back();
164 if (timeSinceLastOnset < 50) {
184 float bpm = 60000.0f /
static_cast<float>(interval);
192 bool foundExisting =
false;
195 if (bpmDiff < 3.0f) {
201 foundExisting =
true;
233 for (size j = i + 1; j <
mHypotheses.size(); j++) {
279 float mean = sum /
static_cast<float>(
mBPMHistory.size());
281 float variance = 0.0f;
284 variance += diff * diff;
286 variance /=
static_cast<float>(
mBPMHistory.size());
305 float bpm = 60000.0f /
static_cast<float>(interval);
320 float normalizedDist = distOutside / range;
321 return fl::max(0.1f, 1.0f - normalizedDist);
330 float scoreComponent =
fl::min(1.0f, hyp.score);
331 float onsetComponent =
fl::min(1.0f,
static_cast<float>(hyp.onsetCount) / 10.0f);
334 return (scoreComponent * 0.4f + onsetComponent * 0.3f + stabilityComponent * 0.3f);
void updateHypotheses(u32 timestamp) FL_NO_EXCEPT
vector< float > mPreviousMagnitudes
function_list< void()> onTempoUnstable
vector< TempoHypothesis > mHypotheses
function_list< void()> onTempoStable
function_list< void(float bpm, float confidence)> onTempoWithConfidence
deque< float > mBPMHistory
static constexpr size BPM_HISTORY_SIZE
void update(shared_ptr< Context > context) FL_NO_EXCEPT override
void updateCurrentTempo() FL_NO_EXCEPT
static constexpr size MAX_ONSET_HISTORY
~TempoAnalyzer() FL_NO_EXCEPT override
static constexpr u32 MAX_BEAT_INTERVAL_MS
float mStabilityThreshold
void fireCallbacks() FL_NO_EXCEPT override
void updateStability() FL_NO_EXCEPT
function_list< void(float bpm)> onTempoChange
void pruneHypotheses() FL_NO_EXCEPT
float calculateSpectralFlux(const fft::Bins &fft) FL_NO_EXCEPT
void reset() FL_NO_EXCEPT override
float calculateIntervalScore(u32 interval) FL_NO_EXCEPT
void updateAdaptiveThreshold() FL_NO_EXCEPT
TempoAnalyzer() FL_NO_EXCEPT
MovingAverage< float, 43 > mFluxAvg
MedianFilter< float, 21 > mBPMMedian
float calculateTempoConfidence(const TempoHypothesis &hyp) FL_NO_EXCEPT
bool detectOnset(u32 timestamp) FL_NO_EXCEPT
shared_ptr< const fft::Bins > mRetainedFFT
SilenceEnvelope mConfidenceEnvelope
function_list< void(float bpm)> onTempo
static constexpr u32 STABLE_FRAMES_REQUIRED
static constexpr size MAX_HYPOTHESES
void fill(Iterator first, Iterator last, const T &value) FL_NO_EXCEPT
constexpr common_type_t< T, U > max(T a, U b) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type sqrt(T x) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NO_EXCEPT
Base definition for an LED controller.