wavesculpt
wavesculpt · sources · schema v2Hybrid 4-oscillator 3D video synth. Four wavetable "wall oscillators" sit on the faces of a 3D unit box, each emitting a colored wave ribbon (RED / GREEN / BLUE / ALPHA) that points into the box; a single user camera renders the scene, positioned via an XY pad (X/Y) and a HEIGHT slider (Z). Audio out is the sum of the four oscillators, each weighted by its per-osc ADSR and by camera↔source distance — the distance gain is the single source of truth shared by audio and visuals, so "closer = louder = bigger ribbon" stays consistent across both domains. Per oscillator: tune/fine, wavetable morph, stereo spread, wavefolder, thickness, and ADSR; camera zoom + Y-rotation shape the view. All four oscillators run in one worklet for a tight audio-rate path. Six cross-domain VIDEO WALL inputs (wall1–wall6) texture an upstream video module onto the six faces of the room (FRONT/BACK/LEFT/RIGHT/FLOOR/CEILING) seen from inside; each face has a TRANSPARENCY knob (0–100%) blending the wall over the scene and a DISTORT knob (0–1) that morphs the flat wall into a convex dome we look up into. Patch the video output back into a wall input for recursive video feedback.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
gate1 | gate | Oscillator 1 (RED) GATE — its per-osc amp ADSR holds open WHILE this gate is high and releases on the falling edge, so a held gate sustains RED's ribbon/voice. gate / trigger |
pitch_cv1 | cv | Oscillator 1 (RED) V/oct PITCH input — sets that oscillator's pitch (summed with TUNE1 + FINE1). control voltage (CV) |
gate2 | gate | Oscillator 2 (GREEN) GATE — its per-osc amp ADSR holds open WHILE this gate is high and releases on the falling edge, so a held gate sustains GREEN's ribbon/voice. gate / trigger |
pitch_cv2 | cv | Oscillator 2 (GREEN) V/oct PITCH input — sets that oscillator's pitch (summed with TUNE2 + FINE2). control voltage (CV) |
gate3 | gate | Oscillator 3 (BLUE) GATE — its per-osc amp ADSR holds open WHILE this gate is high and releases on the falling edge, so a held gate sustains BLUE's ribbon/voice. gate / trigger |
pitch_cv3 | cv | Oscillator 3 (BLUE) V/oct PITCH input — sets that oscillator's pitch (summed with TUNE3 + FINE3). control voltage (CV) |
gate4 | gate | Oscillator 4 (ALPHA) GATE — its per-osc amp ADSR holds open WHILE this gate is high and releases on the falling edge, so a held gate sustains ALPHA's ribbon/voice. gate / trigger |
pitch_cv4 | cv | Oscillator 4 (ALPHA) V/oct PITCH input — sets that oscillator's pitch (summed with TUNE4 + FINE4). control voltage (CV) |
morph1_cv | cv | CV that offsets oscillator 1's MORPH (wavetable frame position), sweeping RED's timbre. control voltage (CV); modulates morph1 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
morph2_cv | cv | CV that offsets oscillator 2's MORPH (wavetable frame position), sweeping GREEN's timbre. control voltage (CV); modulates morph2 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
morph3_cv | cv | CV that offsets oscillator 3's MORPH (wavetable frame position), sweeping BLUE's timbre. control voltage (CV); modulates morph3 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
morph4_cv | cv | CV that offsets oscillator 4's MORPH (wavetable frame position), sweeping ALPHA's timbre. control voltage (CV); modulates morph4 (additive offset — ±1 CV sweeps the full range, centered on the knob) |
pos_x | cv | CV that offsets the camera X position (drives the XY pad horizontally). control voltage (CV); modulates pos_x (additive offset — ±1 CV sweeps the full range, centered on the knob) |
pos_y | cv | CV that offsets the camera Y position (drives the XY pad vertically). control voltage (CV); modulates pos_y (additive offset — ±1 CV sweeps the full range, centered on the knob) |
pos_z | cv | CV that offsets the camera Z position / HEIGHT (depth into the box). control voltage (CV); modulates pos_z (additive offset — ±1 CV sweeps the full range, centered on the knob) |
zoom | cv | CV that offsets the camera ZOOM (distance scalar) — closer = bigger ribbons AND louder (the distance gain is shared by audio + visual). control voltage (CV); modulates zoom (additive offset — ±1 CV sweeps the full range, centered on the knob) |
rot | cv | CV that offsets the camera ROTATION about the Y axis (visual only). control voltage (CV); modulates rot (additive offset — ±1 CV sweeps the full range, centered on the knob) |
scale | cv | CV that offsets the BLINK SCALE — the amplitude/zoom of the scope waveform render. control voltage (CV); modulates scale (additive offset — ±1 CV sweeps the full range, centered on the knob) |
wiggle | cv | CV that offsets WIGGLE — the pitch-driven 3D rotation strength of each ribbon/scope/tube. control voltage (CV); modulates wiggle (additive offset — ±1 CV sweeps the full range, centered on the knob) |
alpha_in | video | Optional VIDEO input blended as an alpha mask over the 3D render (a cross-domain video stream shaping transparency). RGB video stream |
wall1 | video | VIDEO input textured onto the FRONT (−Z) face of the 3D room (the camera is inside the box). Blended by WALL 1 α (transparency) and morphable flat→dome by WALL 1 DISTORT. Self-patching video_out → wall1 makes recursive video feedback. RGB video stream |
wall2 | video | VIDEO input textured onto the BACK (+Z) face of the 3D room (the camera is inside the box). Blended by WALL 2 α (transparency) and morphable flat→dome by WALL 2 DISTORT. Self-patching video_out → wall2 makes recursive video feedback. RGB video stream |
wall3 | video | VIDEO input textured onto the LEFT (−X) face of the 3D room (the camera is inside the box). Blended by WALL 3 α (transparency) and morphable flat→dome by WALL 3 DISTORT. Self-patching video_out → wall3 makes recursive video feedback. RGB video stream |
wall4 | video | VIDEO input textured onto the RIGHT (+X) face of the 3D room (the camera is inside the box). Blended by WALL 4 α (transparency) and morphable flat→dome by WALL 4 DISTORT. Self-patching video_out → wall4 makes recursive video feedback. RGB video stream |
wall5 | video | VIDEO input textured onto the FLOOR (−Y) face of the 3D room (the camera is inside the box). Blended by WALL 5 α (transparency) and morphable flat→dome by WALL 5 DISTORT. Self-patching video_out → wall5 makes recursive video feedback. RGB video stream |
wall6 | video | VIDEO input textured onto the CEILING (+Y) face of the 3D room (the camera is inside the box). Blended by WALL 6 α (transparency) and morphable flat→dome by WALL 6 DISTORT. Self-patching video_out → wall6 makes recursive video feedback. RGB video stream |
outputs
| id | cable | what it does |
|---|---|---|
L | audio | Left channel of the summed stereo audio mix — the four oscillators after per-osc env, distance gain, and pan, post MASTER GAIN. audio signal |
R | audio | Right channel of the summed stereo audio mix (the partner of L). audio signal |
out_red | audio | RED oscillator's individual AUDIO tap — that single voice post env/distance/pan (the exact node the visualizer reads). Patch it to route or process the RED voice independently of the L/R mix. audio signal |
out_grn | audio | GREEN oscillator's individual AUDIO tap — that single voice post env/distance/pan, routable independently of the mix. audio signal |
out_blu | audio | BLUE oscillator's individual AUDIO tap — that single voice post env/distance/pan, routable independently of the mix. audio signal |
out_alp | audio | ALPHA oscillator's individual AUDIO tap — that single voice post env/distance/pan, routable independently of the mix. audio signal |
video_out | mono-video | The 3D render as a mono-video output (with the CRT post-process baked in). Patch it into VIDEO OUT or any video module — or back into a WALL input for recursive feedback. mono video stream |
controls
| control | what it does |
|---|---|
| A1 | Oscillator 1 (RED) envelope ATTACK (0.001..5 s, log) — rise time after its GATE opens. |
| A2 | Oscillator 2 (GREEN) envelope ATTACK (0.001..5 s, log) — rise time after its GATE opens. |
| A3 | Oscillator 3 (BLUE) envelope ATTACK (0.001..5 s, log) — rise time after its GATE opens. |
| A4 | Oscillator 4 (ALPHA) envelope ATTACK (0.001..5 s, log) — rise time after its GATE opens. |
| D1 | Oscillator 1 (RED) envelope DECAY (0.001..5 s, log) — fall from the attack peak to SUSTAIN1. |
| D2 | Oscillator 2 (GREEN) envelope DECAY (0.001..5 s, log) — fall from the attack peak to SUSTAIN2. |
| D3 | Oscillator 3 (BLUE) envelope DECAY (0.001..5 s, log) — fall from the attack peak to SUSTAIN3. |
| D4 | Oscillator 4 (ALPHA) envelope DECAY (0.001..5 s, log) — fall from the attack peak to SUSTAIN4. |
| R1 | Oscillator 1 (RED) envelope RELEASE (0.001..5 s, log) — fade after GATE1 falls. |
| R2 | Oscillator 2 (GREEN) envelope RELEASE (0.001..5 s, log) — fade after GATE2 falls. |
| R3 | Oscillator 3 (BLUE) envelope RELEASE (0.001..5 s, log) — fade after GATE3 falls. |
| R4 | Oscillator 4 (ALPHA) envelope RELEASE (0.001..5 s, log) — fade after GATE4 falls. |
| S1 | Oscillator 1 (RED) envelope SUSTAIN level (0..1) — held while GATE1 stays high. |
| S2 | Oscillator 2 (GREEN) envelope SUSTAIN level (0..1) — held while GATE2 stays high. |
| S3 | Oscillator 3 (BLUE) envelope SUSTAIN level (0..1) — held while GATE3 stays high. |
| S4 | Oscillator 4 (ALPHA) envelope SUSTAIN level (0..1) — held while GATE4 stays high. |
| Alpha brightness | ALPHA BRIGHTNESS (0..2) — brightness of the ALPHA oscillator / alpha-mask layer in the render. |
| Blink mode | BLINK render mode within the 3D view: 0 = wavetable RIBBONS (default), 1 = SCOPES TRIAL (each osc's live oscilloscope trace from the floor corners), 2 = REALITY BASED COMMUNITY (the scopes rendered as 3D neon tubes). |
| Bloom | BLOOM (0..1, default 0.4) — glow/bloom on bright parts of the render. |
| Blu color | BLUE oscillator base COLOUR (colour picker) — tints the BLUE osc in every blink mode. Packed 0xRRGGBB. |
| Chord mode | CHORD MODE (on/off) — when on, every voice reads voice 1's pitch and voices 2/3/4 are offset to build a chord (the quality set by QUALITY); each voice's TUNE becomes the chord offset. |
| Chord quality | CHORD QUALITY — picks the chord built in CHORD MODE: 0 = major, 1 = minor. |
| Chroma instability | SHIMMER / chroma instability (0..1) — adds unstable colour-fringing shimmer to the image. |
| Chroma phase | HUE / chroma phase (−1..+1) — rotates the colour hue of the rendered image. |
| Detune | DETUNE (−1..+1) — the spread applied between voices when UNISON is on. |
| Feedback delay | Feedback DELAY (0..1) — the delay of the video frame-feedback (longer = more spaced trails). |
| Feedback gain | FEEDBACK gain (0..1) — frame-feedback amount of the video post-process (video echoes/trails). |
| Fine1 | Oscillator 1 (RED) FINE tune in cents (−100..+100) for tuning between TUNE1's semitones. |
| Fine2 | Oscillator 2 (GREEN) FINE tune in cents (−100..+100) for tuning between TUNE2's semitones. |
| Fine3 | Oscillator 3 (BLUE) FINE tune in cents (−100..+100) for tuning between TUNE3's semitones. |
| Fine4 | Oscillator 4 (ALPHA) FINE tune in cents (−100..+100) for tuning between TUNE4's semitones. |
| Fold1 | Oscillator 1 (RED) FOLD (0..1) — west-coast wavefolder on RED's output (0 = clean, 1 = heavily folded harmonics). |
| Fold2 | Oscillator 2 (GREEN) FOLD (0..1) — west-coast wavefolder on GREEN's output (0 = clean, 1 = heavily folded harmonics). |
| Fold3 | Oscillator 3 (BLUE) FOLD (0..1) — west-coast wavefolder on BLUE's output (0 = clean, 1 = heavily folded harmonics). |
| Fold4 | Oscillator 4 (ALPHA) FOLD (0..1) — west-coast wavefolder on ALPHA's output (0 = clean, 1 = heavily folded harmonics). |
| FxAmount1 | Oscillator 1 (RED) FX AMOUNT (0..1) — wet/mix of the per-osc FX slot selected by FX1. |
| FxAmount2 | Oscillator 2 (GREEN) FX AMOUNT (0..1) — wet/mix of the per-osc FX slot selected by FX2. |
| FxAmount3 | Oscillator 3 (BLUE) FX AMOUNT (0..1) — wet/mix of the per-osc FX slot selected by FX3. |
| FxAmount4 | Oscillator 4 (ALPHA) FX AMOUNT (0..1) — wet/mix of the per-osc FX slot selected by FX4. |
| FxType1 | Oscillator 1 (RED) per-osc FX slot type: 0 = OFF, 1 = REVERB, 2 = DELAY. Sits PRE-spatial-mix, so it shapes RED's raw oscillator before env/distance/pan. |
| FxType2 | Oscillator 2 (GREEN) per-osc FX slot type: 0 = OFF, 1 = REVERB, 2 = DELAY. Sits PRE-spatial-mix, so it shapes GREEN's raw oscillator before env/distance/pan. |
| FxType3 | Oscillator 3 (BLUE) per-osc FX slot type: 0 = OFF, 1 = REVERB, 2 = DELAY. Sits PRE-spatial-mix, so it shapes BLUE's raw oscillator before env/distance/pan. |
| FxType4 | Oscillator 4 (ALPHA) per-osc FX slot type: 0 = OFF, 1 = REVERB, 2 = DELAY. Sits PRE-spatial-mix, so it shapes ALPHA's raw oscillator before env/distance/pan. |
| Grn color | GREEN oscillator base COLOUR (colour picker) — tints the GREEN osc in every blink mode. Packed 0xRRGGBB. |
| Hsync drift | HSYNC DRIFT (0..1) — horizontal-sync drift of the CRT post-process (the picture skews/tears horizontally). |
| Hsync loss | HSYNC LOSS (0..1) — horizontal-sync loss; the image rolls/breaks up horizontally as it rises. |
| Lum depth | LUMINOSITY → BANDPASS depth (0..1) — how strongly the wall video's brightness at each line's wall-crossing points shapes a band-pass on that line's audio (bright = open, dark = narrow). 0 = OFF. |
| Master gain | MASTER GAIN (0..2, default 1) — overall output level of the summed audio mix (L/R). |
| Morph1 | Oscillator 1 (RED) MORPH (0..1) — wavetable frame position; scans through the loaded wavetable's frames to morph the timbre. CV via the morph1_cv input. |
| Morph2 | Oscillator 2 (GREEN) MORPH (0..1) — wavetable frame position; scans through the loaded wavetable's frames to morph the timbre. CV via the morph2_cv input. |
| Morph3 | Oscillator 3 (BLUE) MORPH (0..1) — wavetable frame position; scans through the loaded wavetable's frames to morph the timbre. CV via the morph3_cv input. |
| Morph4 | Oscillator 4 (ALPHA) MORPH (0..1) — wavetable frame position; scans through the loaded wavetable's frames to morph the timbre. CV via the morph4_cv input. |
| Noise | NOISE (0..1, default 0.05) — analog-style video noise/grain over the image. |
| Pos x | Camera X position (−1..+1) — the horizontal axis of the on-card XY pad. Moves the viewpoint left/right through the box. |
| Pos y | Camera Y position (−1..+1) — the vertical axis of the XY pad. |
| Pos z | Camera Z position / HEIGHT (−1..+1) — depth into the box (the HEIGHT slider). |
| Red color | RED oscillator base COLOUR (a colour-wheel picker) — tints the RED osc's ribbon, scope line, and neon tube. Packed 0xRRGGBB; chosen via a native colour picker (not a CV knob). |
| Rot | Camera ROTATION about the Y axis (−1 full left .. +1 full right). Visual only — audio is rotation-invariant. CV via the rot input. |
| Scale | SCALE (0.1..10, log, unity at 1) — amplitude/zoom of the BLINK scope waveform (matches the SCOPE module's scale). Applies in the scope/tube blink modes. CV via the scale input. |
| Scan wobble | SCAN WOBBLE (0..1) — wobbles the scanlines for an unstable-CRT shimmer. |
| Spread1 | Oscillator 1 (RED) SPREAD (1..5) — stereo tap spread; higher values widen RED's stereo image by reading offset taps. |
| Spread2 | Oscillator 2 (GREEN) SPREAD (1..5) — stereo tap spread; higher values widen GREEN's stereo image by reading offset taps. |
| Spread3 | Oscillator 3 (BLUE) SPREAD (1..5) — stereo tap spread; higher values widen BLUE's stereo image by reading offset taps. |
| Spread4 | Oscillator 4 (ALPHA) SPREAD (1..5) — stereo tap spread; higher values widen ALPHA's stereo image by reading offset taps. |
| Thickness1 | Oscillator 1 (RED) THICKNESS (0..1) — how far the wave ribbon is extruded perpendicular to its direction (visual weight of RED's ribbon). |
| Thickness2 | Oscillator 2 (GREEN) THICKNESS (0..1) — how far the wave ribbon is extruded perpendicular to its direction (visual weight of GREEN's ribbon). |
| Thickness3 | Oscillator 3 (BLUE) THICKNESS (0..1) — how far the wave ribbon is extruded perpendicular to its direction (visual weight of BLUE's ribbon). |
| Thickness4 | Oscillator 4 (ALPHA) THICKNESS (0..1) — how far the wave ribbon is extruded perpendicular to its direction (visual weight of ALPHA's ribbon). |
| Tune1 | Oscillator 1 (RED) TUNE — coarse pitch in semitones (−36..+36). Summed with FINE1 and the pitch_cv1 input. |
| Tune2 | Oscillator 2 (GREEN) TUNE — coarse pitch in semitones (−36..+36). Summed with FINE2 and the pitch_cv2 input. |
| Tune3 | Oscillator 3 (BLUE) TUNE — coarse pitch in semitones (−36..+36). Summed with FINE3 and the pitch_cv3 input. |
| Tune4 | Oscillator 4 (ALPHA) TUNE — coarse pitch in semitones (−36..+36). Summed with FINE4 and the pitch_cv4 input. |
| Unison | UNISON (on/off) — stacks the oscillators on one pitch (detuned by DETUNE) for a fat, layered tone instead of four independent voices. |
| Video mode | VIEW / video mode for the render + the video_out: 0 = PROXIMITY (the 3D ribbon scene, default), 1 = BIRDSEYE (top-down 2D floorplan of the spatial system), 2 = SPECTROGRAPH (scrolling STFT of the combined audio). |
| Vsync drift | VSYNC DRIFT (0..1) — vertical-sync drift; the picture rolls vertically. |
| Wall1 alpha | WALL 1 (FRONT (−Z)) TRANSPARENCY (0..100%) — 0 = the wall's video is invisible, 100 = fully opaque over the scene. |
| Wall1 distort | WALL 1 (FRONT (−Z)) DISTORT (0..1) — morphs the wall from a flat quad (0) to a convex dome bulging toward the room centre (1), a fisheye we look up into. |
| Wall2 alpha | WALL 2 (BACK (+Z)) TRANSPARENCY (0..100%) — 0 = the wall's video is invisible, 100 = fully opaque over the scene. |
| Wall2 distort | WALL 2 (BACK (+Z)) DISTORT (0..1) — morphs the wall from a flat quad (0) to a convex dome bulging toward the room centre (1), a fisheye we look up into. |
| Wall3 alpha | WALL 3 (LEFT (−X)) TRANSPARENCY (0..100%) — 0 = the wall's video is invisible, 100 = fully opaque over the scene. |
| Wall3 distort | WALL 3 (LEFT (−X)) DISTORT (0..1) — morphs the wall from a flat quad (0) to a convex dome bulging toward the room centre (1), a fisheye we look up into. |
| Wall4 alpha | WALL 4 (RIGHT (+X)) TRANSPARENCY (0..100%) — 0 = the wall's video is invisible, 100 = fully opaque over the scene. |
| Wall4 distort | WALL 4 (RIGHT (+X)) DISTORT (0..1) — morphs the wall from a flat quad (0) to a convex dome bulging toward the room centre (1), a fisheye we look up into. |
| Wall5 alpha | WALL 5 (FLOOR (−Y)) TRANSPARENCY (0..100%) — 0 = the wall's video is invisible, 100 = fully opaque over the scene. |
| Wall5 distort | WALL 5 (FLOOR (−Y)) DISTORT (0..1) — morphs the wall from a flat quad (0) to a convex dome bulging toward the room centre (1), a fisheye we look up into. |
| Wall6 alpha | WALL 6 (CEILING (+Y)) TRANSPARENCY (0..100%) — 0 = the wall's video is invisible, 100 = fully opaque over the scene. |
| Wall6 distort | WALL 6 (CEILING (+Y)) DISTORT (0..1) — morphs the wall from a flat quad (0) to a convex dome bulging toward the room centre (1), a fisheye we look up into. |
| Wavefold | WAVEFOLD (0..1) — a video-domain wavefold of the rendered image (folds bright values back for a posterized look). |
| Wavesculpt osc {n} | Oscillator {n}'s wavetable-source strip: a colour-wheel swatch (its base tint), a PRESET dropdown, a FACTORY-table dropdown, and a LOAD button to upload your own .wav as that oscillator's wavetable. The chosen table is the wave each oscillator plays + draws as its ribbon; selection persists on the patch. |
| Wiggle | WIGGLE (0..1, 0 = OFF) — pitch-driven 3D rotation of each osc's ribbon/scope/tube; speed + magnitude scale with the detected pitch. CV via the wiggle input. |
| Zoom | Camera ZOOM / distance scalar (0.3..3, log) — closer (smaller) = bigger ribbons visually AND louder audibly (closer = louder, one shared distance number). CV via the zoom input. |
source
wavesculpt.ts on GitHub.