autopitch 0.1.0

A modular pitch detection library
Documentation
use crate::detect::PitchDetector;

use super::Autocorrelation;

#[test]
fn test_detect() {
    use std::f32::consts::PI;
    let sample_rate = 44100.0;
    let frame_len = (sample_rate * 0.1) as usize; // 100 ms
    let mut detector = Autocorrelation::default();

    let freqs = [
        27.5, 55.0, 110.0, 123.47, 220.0, 261.63, 440.0, 659.25, 880.0, 1760.0, 2093.0,
    ];

    for freq in freqs {
        let samples: Vec<f32> = (0..frame_len)
            .map(|i| (2.0 * PI * freq * i as f32 / sample_rate).sin())
            .collect();

        let result = detector.detect(&samples, sample_rate).unwrap();

        assert!(
            (result - freq).abs() < 1.0,
            "{result} and {freq} don't match"
        );
    }
}

#[test]
fn test_detect_constant_signal() {
    let mut detector = Autocorrelation::default();
    let samples: Vec<f32> = vec![0.1; 500]; // constant signal = no variance
    let sample_rate = 44100.0;

    assert!(detector.detect(&samples, sample_rate).is_none());
}

#[test]
fn test_detect_short_buffer_handles_gracefully() {
    let mut detector = Autocorrelation::new(0, 2000);
    let short_samples = vec![0.1; 500]; // only 500 samples, less than max_lag

    let result = detector.detect(&short_samples, 44100.0);
    assert!(result.is_none());
}