Skip to main content

rill_lofi/
lib.rs

1//! Lo-fi audio emulation: 8-bit, 12-bit, and classic digital audio systems
2
3#![warn(missing_docs)]
4
5mod chip_emulator;
6mod config;
7/// Digital signal processing utilities (quantization, bitcrushing, etc.).
8pub mod dsp;
9/// Hardware emulators (NES, AY-3-8910, Akai S900).
10pub mod emulators;
11mod error;
12mod lofi_chip_source;
13mod lofi_processor;
14
15// Re-export core types
16pub use chip_emulator::ChipEmulator;
17pub use config::{ClassicSystem, HardwareEmulation, LofiConfig};
18pub use emulators::{AkaiS900Emulator, Ay38910Chip, NesChip};
19pub use error::{LofiError, LofiResult};
20pub use lofi_chip_source::LofiChipSource;
21pub use lofi_processor::LofiProcessor;
22
23// Re-export for convenience
24pub use rill_core::traits::Node;
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29
30    #[test]
31    fn test_quantization() {
32        let test_signal: Vec<f32> = vec![0.1, 0.5, 0.9, -0.3, -0.8];
33
34        let quantized_8bit: Vec<f32> = test_signal
35            .iter()
36            .map(|&s| dsp::quantization::bitcrush(s, 8, false))
37            .collect();
38
39        let quantized_12bit: Vec<f32> = test_signal
40            .iter()
41            .map(|&s| dsp::quantization::bitcrush(s, 12, false))
42            .collect();
43
44        let error_8bit: f32 = test_signal
45            .iter()
46            .zip(quantized_8bit.iter())
47            .map(|(&a, &b)| (a - b).abs())
48            .sum();
49
50        let error_12bit: f32 = test_signal
51            .iter()
52            .zip(quantized_12bit.iter())
53            .map(|(&a, &b)| (a - b).abs())
54            .sum();
55
56        assert!(error_12bit < error_8bit);
57    }
58}