aether-nodes
Built-in DSP nodes for AetherDSP — oscillators, filters, effects, and more.
Available Nodes
| Node | Description |
|---|---|
oscillator |
Sine, saw, square, triangle waveforms |
filter |
Biquad filters (lowpass, highpass, bandpass) |
moog-ladder |
Classic Moog ladder filter |
reverb |
Schroeder reverb with configurable room size |
delay |
Delay line with feedback |
compressor |
Dynamic range compressor |
envelope |
ADSR envelope generator |
lfo |
Low-frequency oscillator |
gain |
Simple gain/volume control |
mixer |
Multi-channel mixer |
formant |
Formant filter for vocal synthesis |
granular |
Granular synthesis engine |
karplus-strong |
Physical modeling string synthesis |
waveshaper |
Waveshaping distortion |
chorus |
Chorus effect |
record |
Record audio to buffer |
scope |
Oscilloscope for visualization |
Feature Flags
All nodes are enabled by default. You can opt-in to specific nodes to reduce compile times and binary size:
[]
= { = "0.2", = false, = ["oscillator", "filter"] }
| Feature | Default | Description |
|---|---|---|
all-nodes |
✅ | Enable all nodes |
oscillator |
✅ | Oscillator node |
filter |
✅ | Biquad filter node |
moog-ladder |
✅ | Moog ladder filter |
reverb |
✅ | Reverb effect |
delay |
✅ | Delay line |
compressor |
✅ | Compressor |
envelope |
✅ | ADSR envelope |
lfo |
✅ | LFO |
gain |
✅ | Gain control |
mixer |
✅ | Mixer |
formant |
✅ | Formant filter |
granular |
✅ | Granular synthesis |
karplus-strong |
✅ | Karplus-Strong synthesis |
waveshaper |
✅ | Waveshaper |
chorus |
✅ | Chorus effect |
record |
✅ | Record node |
scope |
✅ | Oscilloscope |
Examples:
# Minimal synth (oscillator + filter + envelope)
= { = "0.2", = false, = ["oscillator", "filter", "envelope"] }
# Effects only
= { = "0.2", = false, = ["reverb", "delay", "chorus"] }
# All nodes (default)
= "0.2"
Quick Start
use Scheduler;
use Oscillator;
let mut sched = new;
let osc = Boxnew;
let id = sched.graph.add_node.unwrap;
sched.graph.set_output_node;
// Process audio
let mut output = vec!;
sched.process_block_simple;
Node Details
Oscillators
oscillator - Anti-aliased waveforms
- Sine, saw, square, triangle
- BLEP anti-aliasing for saw/square
- Frequency modulation support
- Phase reset
karplus-strong - Physical modeling
- Plucked string synthesis
- Damping control
- Stretch tuning
- Realistic string behavior
Filters
filter - Biquad filters
- Lowpass, highpass, bandpass, notch
- Resonance control
- Audio-rate modulation
- Stable at high resonance
moog-ladder - Classic Moog filter
- 4-pole lowpass
- Self-oscillation
- Huovilainen model
- Warm analog sound
formant - Vowel filter
- A/E/I/O/U vowel shapes
- Morphing between vowels
- Essential for wind instruments
- Vocal synthesis
Effects
reverb - Schroeder reverb
- 8 comb + 4 allpass filters
- Room size control
- Damping control
- Wet/dry mix
delay - Delay line
- Feedback control
- Tempo sync
- Modulation support
- Ping-pong mode
chorus - BBD-style chorus
- Modulated delay
- Stereo widening
- Depth/rate control
- Vintage sound
compressor - Dynamics processor
- RMS-based detection
- Soft-knee curve
- Attack/release
- Makeup gain
waveshaper - Distortion
- 5 modes: tanh, hard-clip, fold-back, bit-crush, tube
- Drive control
- Tone shaping
- Harmonic generation
Modulation
envelope - ADSR envelope
- Attack, decay, sustain, release
- Gate triggering
- Sample-accurate
- Exponential curves
lfo - Low-frequency oscillator
- 5 waveforms: sine, triangle, square, S&H, random-smooth
- Tempo sync
- Phase control
- Unipolar/bipolar
Utility
gain - Volume control
- Smoothed gain changes
- dB or linear
- No clicks/pops
mixer - Multi-channel mixer
- N-input summing
- Per-channel gain
- SIMD optimized
- FMA instructions
record - Audio capture
- Record to buffer
- WAV file export
- Circular buffer
- Trigger modes
scope - Oscilloscope
- Waveform visualization
- Ring buffer output
- Trigger modes
- UI integration
Synthesis
granular - Granular synthesis
- Grain size/density control
- Pitch scatter
- Position control
- World music textures
Common Patterns
Basic Synthesizer
use Scheduler;
use ;
let mut sched = new;
// Oscillator → Filter → Envelope → Output
let osc = sched.graph.add_node.unwrap;
let filt = sched.graph.add_node.unwrap;
let env = sched.graph.add_node.unwrap;
sched.graph.connect;
sched.graph.connect;
sched.graph.set_output_node;
Effects Chain
use ;
// Input → Chorus → Delay → Reverb → Output
let chorus = sched.graph.add_node.unwrap;
let delay = sched.graph.add_node.unwrap;
let reverb = sched.graph.add_node.unwrap;
sched.graph.connect;
sched.graph.connect;
sched.graph.connect;
sched.graph.set_output_node;
Modulation Routing
use ;
// LFO → Oscillator frequency modulation
let lfo = sched.graph.add_node.unwrap;
let osc = sched.graph.add_node.unwrap;
// Connect LFO to oscillator's frequency parameter
sched.graph.connect; // Slot 1 = frequency modulation
sched.graph.set_output_node;
Performance Tips
Compile Time Optimization
Use feature flags to reduce compile times:
# Minimal synth (60% faster compile)
= {
version = "0.2",
= false,
= ["oscillator", "filter", "envelope"]
}
Runtime Optimization
- Reuse nodes - Don't create/destroy nodes frequently
- Batch commands - Send multiple commands at once
- Minimize connections - Fewer connections = faster topological sort
- Use parallel execution - Enable
parallelfeature in aetherdsp-core - Profile first - Use
cargo benchto identify bottlenecks
Memory Optimization
- Disable unused features - Smaller binary
- Adjust MAX_NODES - Reduce if you don't need 10,240 nodes
- Adjust BUFFER_SIZE - Smaller buffers = less memory
- Use release builds -
cargo build --release
Examples
See the examples directory for complete working examples:
filter_sweep.rs- Animate filter cutoff frequencyenvelope_test.rs- Trigger ADSR envelopereverb_demo.rs- Reverb with different room sizes
Run with:
Resources
- Documentation: https://docs.rs/aetherdsp-nodes
- Migration Guide: MIGRATION.md
- Core Engine: aetherdsp-core
- Issues: https://github.com/1yos/aether-dsp/issues
License
MIT — see LICENSE