#节拍 #节拍检测

节拍检测器

音频节拍检测库,支持不同的音频输入设备作为源。您可以将每个找到的节拍传递给库的回调

3个不稳定版本

0.1.2 2021年9月12日
0.1.0 2021年5月11日
0.0.0 2021年4月5日

#504音频

MIT 许可证

2MB
610 代码行

节拍检测器 - 使用Rust编写的音频节拍检测库

这是一个Rust库,它能够在实时音频数据输入上实现节拍检测。一个用例是在您的计算机上有一个音频/辅助分割器,其中一端进入音响系统,而另一端进入树莓派的麦克风输入。

该库提供了多种策略,您可以将其连接到音频源。到目前为止,它提供了两种策略

  • 简单低通滤波器
    • 并不很好,必须更加精确
  • 简单频谱分析
    • 对于大多数“简单”的歌曲来说足够好,比如90年代的流行歌曲或“MGMT”的“Kids”
  • 超级无敌分析(待办事项) - 欢迎代码贡献

我不是音频分析专家,但我为我目前使用频谱策略所取得的成果感到自豪。这个库需要一个更加“牢不可破”的策略,以应对复杂和节奏快的歌曲。

这是我在房间里录制的演示。当然,我在录制它时已经将其与音乐同步了。 :)

Beat Detection Demo With WS2812 RGBs

如何使用

Cargo.toml

beat-detector = "<latest version>"

code.rs(也请参阅仓库中的examples/!)

//! Minimum example on how to use this library. Sets up the "callback loop".

use cpal::Device;
use beat_detector::StrategyKind;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;

/// Minimum example on how to use this library. Sets up the "callback loop".
fn main() {
    let recording = Arc::new(AtomicBool::new(true));

    let recording_cpy = recording.clone();
    ctrlc::set_handler(move || {
        eprintln!("Stopping recording");
        recording_cpy.store(false, Ordering::SeqCst);
    }).unwrap();

    let dev = select_input_device();
    let strategy = select_strategy();
    let on_beat = |info| {
        println!("Found beat at {:?}ms", info);
    };
    // actually start listening in thread
    let handle = beat_detector::record::start_listening(
        on_beat,
        Some(dev),
        strategy,
        recording,
    ).unwrap();

    handle.join().unwrap();
}

fn select_input_device() -> Device {
    // todo implement user selection
    beat_detector::record::audio_input_device_list().into_iter().next().expect("At least one audio input device must be available.").1
}

fn select_strategy() -> StrategyKind {
    // todo implement user selection
    StrategyKind::Spectrum
}

MSRV(最低支持的Rust版本)

1.52.1 稳定版

依赖项

~3–7.5MB
~199K SLoC