use image_array::ImageArray;
use sample_buffer::SampleBuffer;
+use lowpass_filter::LowpassFilter;
+
const WINDOW_SIZE: usize = 128;
const CHUNK_SIZE: usize = 72;
const SPECTOGRAM_AREA: usize = WINDOW_SIZE * CHUNK_SIZE;
const DEBUG_MODE: bool = true;
const CALIBRATION_PATH: &str = "./test/calibration.jpg";
-const AUDIO_PATH: &str = "/home/will/Downloads/Adducci - Around the Horn.wav";
+const AUDIO_PATH: &str = "./test/example.wav";
+
+// feedback config
+const WET: f32 = 0.0;
+const DRY: f32 = 1.0;
+
+// audio effects and filtering
+const MAIN_LOWPASS: f32 = 20000.0;
+const FEEDBACK_LOWPASS: f32 = 20000.0;
+const FILTER_SCALING: f32 = 1. / 65535.; // to bring any signal down to +-1
extern "C" {
fn GetHomography(camera_ptr: usize, homography_ptr: usize);
let mut reader = hound::WavReader::open(audio_path).unwrap();
let file_rate = reader.spec().sample_rate;
+ // setup the lowpass filters
+ let main_lowpass = LowpassFilter::new(file_rate, MAIN_LOWPASS);
+ let feedback_lowpass = LowpassFilter::new(file_rate, FEEDBACK_LOWPASS);
+
// setup audio output and build output stream
let host = cpal::default_host();
let device = host.default_output_device().expect("No output device available");
if rx.recv().unwrap() {
let mut write_buffer = sample_buffer.lock().unwrap();
for (i, x) in write_buffer[SPECTOGRAM_AREA..].iter_mut().enumerate() {
- *x = buffer[i].re as i16;
+ let value = main_lowpass.run(buffer[i].re / i16::MAX as f32);
+ *x = (value * i16::MAX) as i16;
}
}
i = 0;
}
- let value = sample.unwrap_or_default();
// if buffer is not full convert value and add to buffer
- buffer[i] = Complex{re: value as f32, im: 0f32};
+ let mut value = sample.unwrap_or_default() as f32;
+ let feedback_value = feedback_lowpass.run(buffer[i].re / i16::MAX as f32);
+ value = (value * DRY) + (feedback_value * i16::MAX * WET);
+
+ buffer[i] = Complex{re: value, im: 0f32};
i += 1;
}