pub fn begin(config: AnalyzerConfig) -> Result<Receiver<BpmDetection>>Expand description
Starts the BPM analyzer with the given configuration using the default device.
This automatically selects an audio input device, preferring BlackHole on macOS, then falling back to the system default input device.
§Arguments
config- The analyzer configuration
§Returns
A Receiver that yields BpmDetection results containing up to 5 BPM candidates
sorted by confidence (highest first).
§Errors
Returns an error if:
- The configuration is invalid
- No suitable audio input device is found
- The audio stream cannot be configured or started
- The device’s sample format is unsupported
§Example
use bpm_analyzer::{AnalyzerConfig, begin};
let config = AnalyzerConfig::electronic();
let receiver = begin(config)?;
for detection in receiver.iter() {
if let Some(bpm) = detection.bpm() {
println!("Detected BPM: {:.1}", bpm);
}
}Examples found in repository?
examples/beat_timing.rs (line 16)
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}