use std::f64::consts::TAU;
pub fn harmonic_wave(len: usize) -> Vec<u8> {
let mut out = Vec::with_capacity(len);
for i in 0..len {
let phase = i as f64 / 64.0;
let fundamental = (phase * TAU).sin() * 44.0;
let overtone = (phase * TAU * 2.0).cos() * 17.0;
let value = (128.0 + fundamental + overtone).round().clamp(0.0, 255.0) as u8;
out.push(value);
}
out
}
pub fn pulse_train(len: usize) -> Vec<u8> {
let mut out = Vec::with_capacity(len);
for i in 0..len {
let block = (i / 256) % 4;
let value = match block {
0 => 15,
1 => 240,
2 => 96,
_ => 180,
};
out.push(value);
}
out
}
pub fn pseudo_random(len: usize, seed: u32) -> Vec<u8> {
let mut out = Vec::with_capacity(len);
let mut state = seed;
for _ in 0..len {
state ^= state << 13;
state ^= state >> 17;
state ^= state << 5;
out.push((state & 0xff) as u8);
}
out
}
pub fn mixed_signal(len: usize, seed: u32) -> Vec<u8> {
let harmonic = harmonic_wave(len);
let noise = pseudo_random(len, seed);
harmonic
.into_iter()
.zip(noise)
.enumerate()
.map(|(i, (h, n))| {
if i % 32 < 4 {
n
} else {
let blended = (h as u16 * 3 + n as u16) / 4;
blended as u8
}
})
.collect()
}