fn main() { let input = include_bytes!("../sweep_short.raw"); let min = input.iter().min().unwrap(); let max = input.iter().max().unwrap(); let step_size = 0x3; println!("len:\t\t{} samples", input.len()); println!("initial:\t0x{:02x}", input[0]); println!("min:\t\t0x{:02x}", min); println!("max:\t\t0x{:02x}", max); println!("step size:\t0x{:02x}", step_size); let mut output: Vec = Vec::new(); // let mut max_diff = 0; // let prev = input[0]; // for byte in input { // } let mut sample_pair: u8 = 0; let mut index = 0; let mut prev = input[0]; for byte in &input[1..] { let (diff, dir) = match byte >= &prev { true => ({byte - prev}, 0x1), false => ({prev - byte}, 0x0), }; let steps = (diff / step_size) & 0x0E; sample_pair |= ((steps << 1) | dir) << 4 * (index % 2); if (index % 2) == 1 { output.push(sample_pair); sample_pair = 0; } // println!("0x{:01x} | {}", steps, dir); prev = match dir { 0x1 => prev + (steps * step_size), 0x0 => prev - (steps * step_size), _ => prev + (steps * step_size), }; index += 1; } // for sample in &output { // println!("0x{:02x}", sample); // } std::fs::write("./sweep_dpcm_u4.raw", &output).unwrap(); }