Add beat detection Rust POC

This commit is contained in:
2021-09-15 21:03:13 +02:00
parent 95ae89cab7
commit 8573d30d02
4 changed files with 273 additions and 0 deletions

View File

@@ -0,0 +1,56 @@
use anyhow::Result;
use psimple::Simple;
use pulse::sample::{Format, Spec};
use pulse::stream::Direction;
const BUF_SIZE: usize = 1024;
const HOP_SIZE: usize = 512;
const SAMPLE_RATE: u32 = 44100;
fn main() -> Result<()> {
let spec = Spec {
format: Format::F32le,
channels: 2,
rate: 44100,
};
assert!(spec.is_valid());
let s = Simple::new(
None,
"AAAAAAAA",
Direction::Record,
None,
"BBBBBBBB",
&spec,
None,
None,
)?;
let mut tempo = aubio::Tempo::new(aubio::OnsetMode::SpecFlux, BUF_SIZE, HOP_SIZE, SAMPLE_RATE)?;
let mut data = [0u8; 4 * BUF_SIZE];
let mut float_data = [0f32; BUF_SIZE];
loop {
s.read(&mut data)?;
for (i, f) in float_data.iter_mut().enumerate() {
let mut float_bytes = [0u8; 4];
float_bytes.copy_from_slice(&data[4 * i..4 * i + 4]);
*f = f32::from_le_bytes(float_bytes);
}
let r = tempo.do_result(&float_data)?;
if r > 0f32 {
println!(
"{}ms, {}s, frame {}, {} bpm, confidence {}",
tempo.get_last_ms(),
tempo.get_last_s(),
tempo.get_last(),
tempo.get_bpm(),
tempo.get_confidence()
);
}
}
}