Add beat detection Rust POC
This commit is contained in:
56
libpulse_aubio/src/main.rs
Normal file
56
libpulse_aubio/src/main.rs
Normal 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()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user