beat_timing/
beat_timing.rs

1//! Example: Real-time BPM and beat timing detection
2//!
3//! This example demonstrates how to use the BPM analyzer to detect
4//! both tempo and individual beat timings in real-time.
5
6use bpm_analyzer::{AnalyzerConfig, begin};
7
8fn main() -> Result<(), bpm_analyzer::Error> {
9    // Configure the analyzer for electronic music
10    let config = AnalyzerConfig::electronic();
11
12    println!("Starting BPM analyzer...");
13    println!("Listening for beats and tempo...\n");
14
15    // Start the analyzer
16    let receiver = begin(config)?;
17
18    // Process detections
19    for detection in receiver.iter() {
20        // Print BPM if detected
21        if let Some(bpm) = detection.bpm() {
22            println!("🎵 Detected BPM: {:.1}", bpm);
23        }
24
25        // Print beat timings
26        if let Some(last_beat) = detection.last_beat() {
27            print!(
28                "🥁 Beat at {:.2}s (strength: {:.2})",
29                last_beat.time_seconds, last_beat.strength
30            );
31
32            // Show beat interval if we have at least 2 beats
33            if let Some(interval) = detection.last_beat_interval() {
34                let instant_bpm = 60.0 / interval;
35                print!(" | Interval: {:.3}s ({:.1} BPM)", interval, instant_bpm);
36            }
37            println!();
38        }
39
40        // Print all recent beat timings
41        let beats = detection.beat_timings();
42        if beats.len() >= 4 {
43            println!("📊 Recent beats: {} detected", beats.len());
44            for (i, beat) in beats.iter().rev().take(4).enumerate() {
45                println!(
46                    "   {} {:.2}s ago (strength: {:.2})",
47                    if i == 0 { "•" } else { " " },
48                    beats.last().unwrap().time_seconds - beat.time_seconds,
49                    beat.strength
50                );
51            }
52        }
53
54        println!();
55    }
56
57    Ok(())
58}