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

◆ detectMeter()

void fl::audio::detector::Downbeat::detectMeter ( )
private

Definition at line 313 of file downbeat.cpp.hpp.

313 {
314 // Analyze recent beat patterns to detect time signature
315 // Look for recurring patterns in beat intervals and accents
316
317 // Add current meter candidate based on beat count
318 u8 detectedMeter = mBeatsPerMeasure;
319
320 // Analyze accent patterns to infer meter
321 if (mBeatAccents.size() >= 8) {
322 // Look for recurring strong accents
323 // Common meters: 4/4 (every 4 beats), 3/4 (every 3), 6/8 (every 6)
324
325 size numAccents = mBeatAccents.size();
326 fl::array<u8, 5> candidateMeters = {2, 3, 4, 6, 8};
327 float bestScore = 0.0f;
328 u8 bestMeter = 4;
329
330 for (size m = 0; m < candidateMeters.size(); m++) {
331 u8 meter = candidateMeters[m];
332 float score = 0.0f;
333
334 // Score based on accent pattern matching
335 for (size i = 0; i < numAccents; i++) {
336 if (i % meter == 0) {
337 // Expect strong accent at measure start
338 score += mBeatAccents[i];
339 } else {
340 // Expect weaker accent elsewhere
341 score += (2.0f - mBeatAccents[i]) * 0.5f;
342 }
343 }
344
345 if (score > bestScore) {
346 bestScore = score;
347 bestMeter = meter;
348 }
349 }
350
351 detectedMeter = bestMeter;
352 }
353
354 // Add to meter history
355 if (mMeterCandidates.size() >= METER_HISTORY_SIZE) {
356 mMeterCandidates.pop_front();
357 }
358 mMeterCandidates.push_back(detectedMeter);
359
360 // Find most common meter in recent history
361 u8 consensusMeter = findMostCommonMeter();
362
363 // Update meter if consensus differs and is stable
364 if (consensusMeter != mBeatsPerMeasure && mMeterCandidates.size() >= METER_HISTORY_SIZE / 2) {
365 (void)mBeatsPerMeasure; // Suppress unused warning (used in comparison above)
366 mBeatsPerMeasure = consensusMeter;
367
368 // Set meter change callback flag
369 mFireMeterChange = true;
371
372 // Reset beat counter
373 mCurrentBeat = 1;
375 }
376}
fl::size size() const FL_NOEXCEPT
Definition array.h:90
deque< float > mBeatAccents
Definition downbeat.h:127
static constexpr size METER_HISTORY_SIZE
Definition downbeat.h:132
unsigned char u8
Definition stdint.h:131

References findMostCommonMeter(), mBeatAccents, mBeatsPerMeasure, mBeatsSinceDownbeat, mCurrentBeat, METER_HISTORY_SIZE, mFireMeterChange, mMeterCandidates, mPendingMeter, and fl::array< T, N >::size().

Referenced by update().

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