commit c72c5aee87fd96fa12d6c7e10b049335fd4ab654 Author: sigil-03 Date: Thu Oct 16 09:38:28 2025 -0600 initial commit of cursed encoder project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..8c7458c --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "dpcm-encoder-decoder" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..e82ff01 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "dpcm-encoder-decoder" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/README.md b/README.md new file mode 100644 index 0000000..530bded --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# DPCM ENCODER / DECODER + +goal: +- [ ] CLI application to encode PCM_u8 audio to DPCM audo with a given step size \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..05fa1e8 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,51 @@ +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(); +}