SA Waver is a waveshaper distortion/saturation audio plugin built with Rust, nih-plug, and egui.
It reshapes the input waveform through an editable transfer curve, making it useful for distortion, saturation, wave shaping, dynamic coloration, and automation-driven sound design.
- Fully editable waveshaper curve
- Segment generator: insert sine / triangle / square / stairs shapes between two knots
- Math formula curve generator: type in
sin(a*x)to produce exact shapes (sine folds, etc.) - Real-time preview of the input/output mapping and output waveform
- Three core parameters:
Pre Gain,Post Gain, andMix - Preset loading and saving
- Symmetric / asymmetric shaping modes
- Optional
Linear Ext.mode - Adjustable grid size with grid snapping for knots and spline handles
- Up to
8xoversampling to reduce aliasing - 8 host automation slots that can be bound to curve node coordinates
- Supports
VST3andCLAP, plus a standalone build
macOS builds currently provide VST3 and CLAP plugins. The Windows installer is
not built on macOS; install the bundles to ~/Library/Audio/Plug-Ins/VST3 and
~/Library/Audio/Plug-Ins/CLAP, or copy them manually.
- Insert
SA Waveron a track, bus, or sound source. - Use
Pre Gainto push the signal into the shaping range. - Drag nodes in the curve editor to define the transfer function between input and output.
- Use
Post Gainto compensate output level, andMixto blend dry and wet signal. - Increase
Oversampleif you want to reduce high-frequency aliasing artifacts. - Switch
Symmetrywhen you want either mirrored shaping or independent negative-half processing. - Select two knots and use the segment generator (or a math formula) to insert shapes between them.
Select exactly two knots, then pick Formula from the generator dropdown:
- Type a formula using the curve coordinate
x, constants (pi,e,tau), and your own variables - Use explicit
*for multiplication, e.g.sin(a*x)(notsin(ax)) Varsopens a window to create / edit / delete variables; click?for the full reference- The curve between the two knots is replaced by
y = f(x)sampled at 64 points
Examples: sin(a*x) (sine fold, sweep a), 0.5 + 0.5*sin(x*pi*4), clamp(x*2, 0, 1), lerp(0, 1, x^2).
Pre Gain: input gain before the waveshaperPost Gain: output gain after shapingMix: dry/wet balance- Curve editor: defines how input values are mapped to output values
- Oscilloscope area on the right: shows recent output waveform history
Preset: loads built-in or local presetsLinear Ext.: extends the curve linearly beyond the last point instead of clampingOversample: raises the internal sample rate to reduce aliasingSettings: opens additional display, grid, automation binding, and curve-generation optionsGrid: adjust the horizontal / vertical grid step (only active in Linear display mode)
- Drag with the mouse: adjust the parameter
Shift+ drag: fine adjustment- Double-click a knob: reset to default
Ctrl+ click a knob: reset to default- Click the value text: enter a value manually
- Press
Enterwhile editing a value: confirm - Press
Escwhile editing a value: cancel
- Left-drag a node: move the node (snaps to special positions;
Shiftquantizes to 0.1 steps) - Left-click empty space: clear the current selection
- Left-drag empty space: marquee-select multiple nodes
Ctrl+ left-click a node: add/remove it from the selection- Middle-drag: pan the view
DeleteorBackspace: delete the selected node(s)- Left-drag a spline handle (cubic curves): adjust slope / weight; handles snap to the grid (
Shiftquantizes,Altdisables snapping) - Right-click a spline handle: set position (x/y), slope, weight, or edit mode via the context menu
cargo xtask bundle sa_waver --releaseOn macOS, run the command above on an Apple Silicon or Intel Mac. The resulting VST3 and CLAP bundles can be tested locally, but releases are not currently code-signed or notarized.