Rust audio DSP backend for the constraint-theory ecosystem.
Lattice-based oscillators where waveshape IS lattice geometry:
- Sine = continuous (no lattice)
- Square = Z₂ binary snap
- Saw = Z linear interpolation
- Triangle = A₂ snap (Eisenstein 1D)
- Eisenstein = Full A₂ hexagonal lattice
Every waveform is generated by snapping continuous phase to discrete lattice directions. Different lattices produce different shapes — this isn't metaphor, it's the literal signal generation.
LatticeOscillatorwith 5 shapes + PolyBLEP anti-aliasingBiquadFilter(RBJ Audio EQ Cookbook: LP/HP/BP)ConsonanceFilteremphasizing harmonically consonant intervalsConstraintSynthcombining oscillator + ADSR + filter- 5 built-in presets
- Offline rendering to
Vec<f64>buffers
use constraint_audio::{ConstraintSynth, SynthPreset};
// Using a preset
let synth = ConstraintSynth::from_preset(SynthPreset::HarmonicBell);
let audio = synth.play_note(60, 100, 2.0); // C4, velocity 100, 2 seconds
// Custom
use constraint_audio::{LatticeOscillator, LatticeShape, BiquadFilter, AdsrEnvelope};
let synth = ConstraintSynth::new(
LatticeOscillator::new(440.0, 44100)
.with_shape(LatticeShape::Saw)
.with_polyblep(true),
AdsrEnvelope::new(0.01, 0.1, 0.7, 0.3),
Some(BiquadFilter::lowpass(2000.0, 44100, 0.707)),
);
let audio = synth.play_note(69, 80, 0.5); // A4- constraint-theory-core — The mathematical primitives
- constraint-synth — Python synthesizer with play-along AI
- flux-tensor-midi — 4D tensor MIDI representation
MIT OR Apache-2.0