commit 9db5d76c122f0af43f0d0436b976b8c4d24180c3 Author: sigil-03 Date: Mon Oct 27 16:55:32 2025 -0600 simple wavetable diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..b330586 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "wavetable-synth" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/README.md b/README.md new file mode 100644 index 0000000..d00e421 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# WAVETABLE SYNTH +synthesizes sounds using a wavetable. + +## REQUIREMENTS +`no_std` compatible + + +## MODULES +### `wavetable` +trait definitions for a wavetable manager diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..08af373 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,2 @@ +#![no_std] +mod wavetable; diff --git a/src/wavetable.rs b/src/wavetable.rs new file mode 100644 index 0000000..b101ce3 --- /dev/null +++ b/src/wavetable.rs @@ -0,0 +1,48 @@ +pub trait Wavetable { + type OutputType; + /// get next sample + fn next(&mut self) -> Self::OutputType; +} + +pub struct SimpleWavetable<'a> { + // byte array for waveform + table: &'a [u8], + // index in the waveform + index: usize, +} + +impl<'a> Wavetable for SimpleWavetable<'a> { + type OutputType = u8; + fn next(&mut self) -> Self::OutputType { + let value = self.table[self.index]; + self.index += 1; + if self.index > self.table.len() { + self.index = 0; + } + value + } +} + +impl<'a> SimpleWavetable<'a> { + pub fn new(table: &'a [u8]) -> Self { + Self { table, index: 0 } + } +} + +// TESTS +#[cfg(test)] +pub mod test { + use super::*; + + #[test] + fn wavetable_t1() { + let table_data: [u8; 2] = [0, 255]; + let mut w = SimpleWavetable::new(&table_data); + for point in table_data { + assert!(w.next() == point); + } + } +} + +// TODO: +// - interpolated wavetable