use audio_visualizer::dynamic::live_input::AudioDevAndCfg;
use audio_visualizer::dynamic::window_top_btm::{open_window_connect_audio, TransformFn};
use spectrum_analyzer::scaling::divide_by_N;
use spectrum_analyzer::windows::hann_window;
use spectrum_analyzer::{samples_fft_to_spectrum, FrequencyLimit, FrequencyValue};
use std::cell::RefCell;
use std::cmp::max;
fn main() {
let visualize_spectrum: RefCell<Vec<(f64, f64)>> = RefCell::new(vec![(0.0, 0.0); 1024]);
let to_spectrum_fn = move |audio: &[f32], sampling_rate| {
let skip_elements = audio.len() - 2048;
let relevant_samples = &audio[skip_elements..skip_elements + 2048];
let hann_window = hann_window(relevant_samples);
let latest_spectrum = samples_fft_to_spectrum(
&hann_window,
sampling_rate as u32,
FrequencyLimit::All,
Some(÷_by_N),
)
.unwrap();
latest_spectrum
.data()
.iter()
.zip(visualize_spectrum.borrow_mut().iter_mut())
.for_each(|((fr_new, fr_val_new), (fr_old, fr_val_old))| {
*fr_old = fr_new.val() as f64;
let old_val = *fr_val_old * 0.84;
let max = max(
*fr_val_new * 5000.0_f32.into(),
FrequencyValue::from(old_val as f32),
);
*fr_val_old = max.val() as f64;
});
visualize_spectrum.borrow().clone()
};
open_window_connect_audio(
"Live Spectrum View",
None,
None,
Some(0.0..22050.0),
Some(0.0..500.0),
"x-axis",
"y-axis",
AudioDevAndCfg::new(None, None),
TransformFn::Complex(&to_spectrum_fn),
);
}