use cute_dsp::mix::{Hadamard, Householder, StereoMultiMixer, cheap_energy_crossfade};
fn main() {
println!("Mix Example");
println!("===========");
hadamard_example();
householder_example();
stereo_multi_mixer_example();
crossfade_example();
}
fn hadamard_example() {
println!("\nHadamard Transform Example:");
let hadamard = Hadamard::<f32>::new(4);
let mut data = [1.0, 2.0, 3.0, 4.0];
print!("Original data: ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
hadamard.in_place(&mut data);
print!("Transformed data: ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
hadamard.in_place(&mut data);
print!("Reconstructed data (scaled): ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
let scaling = hadamard.scaling_factor();
for val in data.iter_mut() {
*val /= scaling;
}
print!("Reconstructed data (unscaled): ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
let mut data = [1.0, 2.0, 3.0, 4.0];
hadamard.unscaled_in_place(&mut data);
print!("Unscaled transform: ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
}
fn householder_example() {
println!("\nHouseholder Transform Example:");
let householder = Householder::<f32>::new(4);
let mut data = [1.0, 2.0, 3.0, 4.0];
print!("Original data: ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
householder.in_place(&mut data);
print!("Transformed data: ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
householder.in_place(&mut data);
print!("Reconstructed data (scaled): ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
let scaling = householder.scaling_factor();
for val in data.iter_mut() {
*val /= scaling;
}
print!("Reconstructed data (unscaled): ");
for val in data.iter() {
print!("{:.1} ", val);
}
println!();
}
fn stereo_multi_mixer_example() {
println!("\nStereo Multi Mixer Example:");
let mixer = StereoMultiMixer::<f32>::new(4);
let stereo_input = [0.7, 0.3];
let mut multi_output = [0.0; 5];
mixer.stereo_to_multi(&stereo_input, &mut multi_output);
println!("Stereo input: [{:.1}, {:.1}]", stereo_input[0], stereo_input[1]);
print!("Multi-channel output: ");
for val in multi_output.iter() {
print!("{:.3} ", val);
}
println!();
let multi_input = [0.2, 0.4, 0.6, 0.8, 1.0];
let mut stereo_output = [0.0, 0.0];
mixer.multi_to_stereo(&multi_input, &mut stereo_output);
print!("Multi-channel input: ");
for val in multi_input.iter() {
print!("{:.1} ", val);
}
println!();
println!("Stereo output: [{:.3}, {:.3}]", stereo_output[0], stereo_output[1]);
println!("Scaling factor 1: {:.3}", mixer.scaling_factor1());
println!("Scaling factor 2: {:.3}", mixer.scaling_factor2());
}
fn crossfade_example() {
println!("\nCheap Energy Crossfade Example:");
let signal1 = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
let signal2 = [0.0, 0.0, 0.0, 0.0, 0.0, 2.0, 2.0, 2.0, 2.0, 2.0];
let mut output = [0.0; 10];
println!("Crossfading from signal1 to signal2:");
for i in 0..10 {
let x = i as f32 / 9.0;
let mut from_coeff = 0.0;
let mut to_coeff = 0.0;
cheap_energy_crossfade(x, &mut to_coeff, &mut from_coeff);
output[i] = from_coeff * signal1[i] + to_coeff * signal2[i];
println!("Step {}: x={:.2}, from_coeff={:.3}, to_coeff={:.3}, output={:.3}",
i, x, from_coeff, to_coeff, output[i]);
}
print!("Crossfaded output: ");
for val in output.iter() {
print!("{:.3} ", val);
}
println!();
}