use clap::{App, Arg}; use hound::{WavReader, WavWriter}; use phase_vocoder::PhaseVocoder; fn main() { let matches = App::new("WAV file stretcher") .arg( Arg::with_name("INPUT") .help("Path to the input file") .takes_value(true) .required(true), ) .arg( Arg::with_name("OUTPUT") .help("Name of the output file") .takes_value(true) .required(true), ) .arg( Arg::with_name("stretch") .long("stretch") .takes_value(true) .required(true), ) .get_matches(); let samples: Vec = WavReader::open(matches.value_of("INPUT").unwrap()) .unwrap() .samples::() .map(|x| x.unwrap()) .collect(); dbg!(matches.value_of("stretch")); let factor: f32 = matches.value_of("stretch").unwrap().parse().unwrap(); let mut pvoc = PhaseVocoder::new(factor); pvoc.input(&samples[..]); let mut output = vec![0; 2048]; let spec = hound::WavSpec { channels: 1, sample_rate: 44100, bits_per_sample: 16, sample_format: hound::SampleFormat::Int, }; let mut writer = WavWriter::create(matches.value_of("OUTPUT").unwrap(), spec).unwrap(); while pvoc.samples_available() > 0 { let len = pvoc.samples_available().min(output.len()); pvoc.consume_output(&mut output[..len]); for &x in &output[..len] { writer.write_sample(x).unwrap(); } } writer.finalize().unwrap(); }