3个不稳定版本
0.1.2 | 2021年9月12日 |
---|---|
0.1.0 | 2021年5月11日 |
0.0.0 | 2021年4月5日 |
#504 在 音频
2MB
610 代码行
节拍检测器 - 使用Rust编写的音频节拍检测库
这是一个Rust库,它能够在实时音频数据输入上实现节拍检测。一个用例是在您的计算机上有一个音频/辅助分割器,其中一端进入音响系统,而另一端进入树莓派的麦克风输入。
该库提供了多种策略,您可以将其连接到音频源。到目前为止,它提供了两种策略
- 简单低通滤波器
- 并不很好,必须更加精确
- 简单频谱分析
- 对于大多数“简单”的歌曲来说足够好,比如90年代的流行歌曲或“MGMT”的“Kids”
- 超级无敌分析(待办事项) - 欢迎代码贡献
我不是音频分析专家,但我为我目前使用频谱策略所取得的成果感到自豪。这个库需要一个更加“牢不可破”的策略,以应对复杂和节奏快的歌曲。
这是我在房间里录制的演示。当然,我在录制它时已经将其与音乐同步了。 :)
如何使用
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