adpcm-encoder/src/main.rs

51 lines
1.4 KiB
Rust

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<u8> = 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();
}