rosa 0.1.0

Audio feature extraction library matching librosa output
Documentation
mod common;

use rosa::onset::{onset_detect, onset_strength};

#[test]
fn test_onset_strength_matches_librosa() {
    let ref_data = common::load_audio_reference("onset.json");
    let sr = ref_data["sample_rate"].as_u64().unwrap() as f64;
    let expected: Vec<f64> = serde_json::from_value(ref_data["onset_strength"].clone()).unwrap();

    let wav = common::wav_path("20_Pink Noise mono 500Hz_2kHz -20dBFS 48k.wav");
    let (samples, _) = common::read_wav_mono(&wav);

    let params = rosa::onset::OnsetStrengthParams::new(sr);
    let result = onset_strength(&samples, &params);

    assert_eq!(
        result.len(),
        expected.len(),
        "onset_strength length mismatch: got {}, expected {}",
        result.len(),
        expected.len()
    );
    common::assert_approx_eq(&result, &expected, 1e-4, "onset_strength");
}

#[test]
fn test_onset_detect_matches_librosa() {
    let ref_data = common::load_audio_reference("onset.json");
    let sr = ref_data["sample_rate"].as_u64().unwrap() as f64;
    let expected: Vec<usize> = serde_json::from_value(ref_data["onset_detect"].clone()).unwrap();

    let wav = common::wav_path("20_Pink Noise mono 500Hz_2kHz -20dBFS 48k.wav");
    let (samples, _) = common::read_wav_mono(&wav);

    let params = rosa::onset::OnsetStrengthParams::new(sr);
    let envelope = onset_strength(&samples, &params);
    let result = onset_detect(&envelope, sr, 512, true, false);

    assert_eq!(
        result,
        expected,
        "onset_detect mismatch:\ngot:      {:?}\nexpected: {:?}",
        &result[..result.len().min(20)],
        &expected[..expected.len().min(20)]
    );
}

#[test]
fn test_onset_detect_backtrack_matches_librosa() {
    let ref_data = common::load_audio_reference("onset.json");
    let sr = ref_data["sample_rate"].as_u64().unwrap() as f64;
    let expected: Vec<usize> =
        serde_json::from_value(ref_data["onset_detect_backtrack"].clone()).unwrap();

    let wav = common::wav_path("20_Pink Noise mono 500Hz_2kHz -20dBFS 48k.wav");
    let (samples, _) = common::read_wav_mono(&wav);

    let params = rosa::onset::OnsetStrengthParams::new(sr);
    let envelope = onset_strength(&samples, &params);
    let result = onset_detect(&envelope, sr, 512, true, true);

    assert_eq!(
        result,
        expected,
        "onset_detect_backtrack mismatch:\ngot:      {:?}\nexpected: {:?}",
        &result[..result.len().min(20)],
        &expected[..expected.len().min(20)]
    );
}