MCPcopy Create free account
hub / github.com/FastLED/FastLED / detectMeter

Method detectMeter

src/fl/audio/detector/downbeat.cpp.hpp:313–376  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

311}
312
313void Downbeat::detectMeter() {
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;
370 mPendingMeter = mBeatsPerMeasure;

Callers

nothing calls this directly

Calls 3

sizeMethod · 0.45
pop_frontMethod · 0.45
push_backMethod · 0.45

Tested by

no test coverage detected