paracletics-hypercube 0.1.0

General-purpose paracletic hyper cube compression toolkit.
Documentation
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()
}