vivid-wavetable is an audio-first modular wavetable synthesis package for Vivid.
The maintained package surface now follows the native-note model:
- note sources emit
notes_out - synths consume
notes_in NoteBreakoutexposes shared per-voice control lanes when a graph needs envelopes, keytracking, or layered coordination
- WavetableLayer — production polyphonic wavetable renderer with internal unison and stereo summing
- WavetableOsc — deprecated for new patches. Advanced wavetable oscillator with per-voice audio output (
voices_out) and FM/PM/RM/AM cross-modulation (mod_input+interaction_mode). Existing references are grandfathered (seetests/cpp/test_no_new_wavetable_osc_in_graphs.cpp); new graphs default toWavetableLayer. Use this only when a patch specifically needsvoices_outper-voice routing throughVoiceMixer/VoiceDrive, or oscillator interaction. - AnalogOsc — polyphonic virtual analog oscillator
- SubOsc — polyphonic sub oscillator
- NoiseLayer — polyphonic per-note noise and air source
- VoiceDrive — lane-preserving soft drive for per-voice body and velocity-sensitive harmonic density
- VoiceMixer — sums per-voice audio to stereo for auxiliary layers such as
AnalogOsc,SubOsc, andNoiseLayer
src/— operator source filesmodules/— instrument-facing subgraph modulesassets/wavetables/— factory wavetable wav filesfactory_presets/— per-operator factory presetsgraphs/core/— core smoke graphs and integration fixturesgraphs/presets/— curated showcase graphstests/— package testsarchive/— frozen historical content
From vivid-core:
./build/vivid link ../vivid-wavetable
./build/vivid rebuild vivid-wavetableIf you are new to the package, start with the maintained native-note path.
For listening-oriented validation, use
docs/wavetable-operator-validation-guide.md.
Create:
ClockAuasclockChordProgressionAuaschordsWavetableLayeraswtaudio_outasout
Connect:
clock/beat_phase -> chords/beat_phase
chords/notes_out -> wt/notes_in
wt/output -> out/input
Recommended starting params:
clock/bpm = 96wt/amplitude = 0.25wt/wavetable_family = AnalogWarmwt/wavetable_member = Corewt/position = 0.35wt/unison_voices = 2wt/unison_spread = 12
What this does musically:
ChordProgressionAucreates the note streamWavetableLayerallocates voices internally and renders stereo directly- this is the simplest playable production path in the package
Create:
NoteBreakoutasvoice_breakoutEnvelopeAuasamp_env
Connect:
chords/notes_out -> voice_breakout/notes_in
voice_breakout/voice_gates -> amp_env/gate
voice_breakout/voice_ids -> amp_env/lane_ids
amp_env/value -> wt/voice_gain_audio
Recommended starting params:
amp_env/attack = 0.01amp_env/decay = 0.25amp_env/sustain = 0.70amp_env/release = 0.40
What this does musically:
NoteBreakoutkeeps one shared per-voice control view of the note streamEnvelopeAushapes each note independentlyWavetableLayerstill handles the actual audio rendering and stereo sum
Create:
FilterasfilterEnvelopeAuasfilt_env
Rewire:
wt/output -> filter/input
filter/output -> out/input
voice_breakout/voice_freqs -> filter/frequencies
voice_breakout/voice_gates -> filt_env/gate
voice_breakout/voice_ids -> filt_env/lane_ids
filt_env/value -> filter/cutoff_mod
Recommended starting params:
filter/mode = LowPassfilter/cutoff = 2200filter/resonance = 0.18filt_env/attack = 0.02filt_env/decay = 0.50filt_env/sustain = 0.20filt_env/release = 0.35
What this does musically:
voice_freqsgives the filter a per-note keytracking reference- the filter envelope stays aligned with the same note identities as the amp envelope
For layered instruments, send the same note stream to additional synths and keep one shared NoteBreakout for control lanes.
Typical pattern:
chords/notes_out -> analog/notes_in
chords/notes_out -> sub/notes_in
analog/voices_out -> mix_analog/input
sub/voices_out -> mix_sub/input
amp_env/value -> mix_analog/amp_env_audio
amp_env/value -> mix_sub/amp_env_audio
voice_breakout/voice_velocities -> mix_analog/velocities
voice_breakout/voice_velocities -> mix_sub/velocities
Use VoiceMixer only for auxiliary per-voice audio reduction. WavetableLayer itself does not need a VoiceMixer.
If you specifically need oscillator interaction modes or feedback-style warp behavior that WavetableLayer excludes, use:
WavetableOsc + VoiceMixer
That is an advanced legacy surface, not the default production path.
graphs/core/wavetable_layer_filter_integration.json— minimalnotes_in + NoteBreakoutarticulation pathgraphs/core/wavetable_modular_demo.json— two synths coordinated by one sharedNoteBreakoutmodules/layer_pad.vivid-module.json— canonical single-layer instrument modulemodules/hybrid_keys.vivid-module.json— layered wavetable + analog instrument with shared control lanes
For maintained docs and concrete references:
LayerPad— recommended single-layer production voice built onWavetableLayerDualWavetablePad— dual-layer module with sharedNoteBreakoutcontrolHybridKeys—WavetableLayerplus analog support layer with shared articulationSubAirPad—WavetableLayerplus sub and air layersGlassInteractionKeys— advanced legacy interaction-focused module
New production content should use WavetableLayer, NoteBreakout, and the maintained Layer-based modules. Use raw WavetableOsc + VoiceMixer only when you need excluded legacy interaction features.
