gaborator 0.1.1

Rust API for Gaborator audio processing library
Documentation
fn main() -> anyhow::Result<()> {
    let inp = hound::WavReader::open("input.wav")?;
    if inp.spec().channels != 1 {
        anyhow::bail!("input.wav should be mono");
    }
    let sr = inp.spec().sample_rate;
    if !(44000..=49000).contains(&sr) {
        anyhow::bail!("Input sample rate should be around 48000")
    }
    let samples : Vec<f32> = if inp.spec().sample_format == hound::SampleFormat::Float {
        inp.into_samples::<f32>().collect::<Result<Vec<_>,_>>()?
    } else {
        inp.into_samples::<i32>().map(|x|x.map(|s|s as f32 / 32768.00)).collect::<Result<Vec<_>,_>>()?
    };

    let g = gaborator::Gaborator::new(&gaborator::GaboratorParams {
        bands_per_octave: 256,
        ff_min: 200.0 / (sr as f64),
        ff_ref: 440.0 / (sr as f64),
        overlap: 0.7,
    });

    let mut coefs = gaborator::Coefs::new(&g);

    g.analyze(&samples, 0, &mut coefs);


    let num_samples = samples.len();

    let so = std::io::stdout();
    let so = so.lock();
    let mut so = std::io::BufWriter::new(so);

    const BUF_SIZE : usize = 24000;

    for i in 0..(num_samples as usize + 1) / BUF_SIZE {
        use std::io::Write;

        coefs.process(
            -100000,
            100000,
            (BUF_SIZE * i) as i64,
            (BUF_SIZE * (i+1)) as i64,
                |meta,coef| {
                    let (magn, mut _phase) = num_complex::Complex::new(coef.re, coef.im).to_polar();
                    let _ = writeln!(so.get_mut(), "{},{},{},{}", meta.sample_time, meta.band, magn, _phase);
                }
            );
    }
    Ok(())
}