foxy

foxy · sources · schema v1

Hybrid audio-visual module that hides a whole signal chain in one box: a miniature SWOLEVCO drives an internal RASTERIZE (audio painted as a drifting raster), which is downsampled to 256×256 and run through a simplified RUTTETRA "XYZ" forward-scatter scope; the XYZ height field is converted in realtime into an animated wavetable (64 frames × 256 samples, throttled to ~24 Hz) fed to an internal WAVECEL wavetable VCO. The on-card 3D wavetable display visibly animates as the field evolves. Exposes WAVECEL's full control + IO surface (tune/fine/morph/spread/fold; pitch/fm + morph_cv/spread_cv/fold_cv; out_l/out_r + scope_out + wave3d_out) plus the mini-SWOLEVCO source controls and the XYZ shape/displacement knobs. The video stages run CPU-side on the main thread (no GL inside the audio node); only the WAVECEL stage is a real worklet.

FOXY is a hybrid audio-visual wavetable oscillator that builds its own wavetable in realtime from an internal 3-source 'world'. Inside one card sits a complete chain: three mini-SWOLEVCO oscillators (sources A/B/C) each paint an internal raster image, those three rasters are combined into a volumetric heightfield (A = terrain, B = primary Z height, C = lateral warp + secondary Z), and that field is scanned into a 64×256 wavetable that is uploaded — ~24×/second — to an internal WAVECEL wavetable oscillator. Because the table is regenerated live, WAVECEL's 3D wavetable display visibly ANIMATES as you tune the three sources. You play FOXY like a normal oscillator (PITCH / FM in, TUNE/FINE/MORPH/SPREAD/FOLD on the WAVECEL surface, stereo out), while the three source oscillators + the XYZ volumetric controls (warp / Z-height / zoom / smooth) sculpt the timbre's underlying shape. FREEZE switches hold individual rasters or the whole table; SYNC ratio-locks B/C to A; GEN switches the build between the continuous XYZ heightfield and a discrete '3D Shape Gen' path. Three video outputs expose the scope, the 3D wavetable surface, and the active GEN scene; an EXPORT TABLE button saves the frozen wavetable as JSON.

the faceplate

foxypitchpitchfmaudiomorph_cvcvspread_cvcvfold_cvcvout_laudioout_raudioscope_outmono-videowave3d_outvideocombined_outvideoaudiocvgatepitch
5 inputs · 5 outputs · 33 params

inputs

idcablewhat it does
pitchpitchV/oct pitch input (0V = C4) for the internal WAVECEL wavetable oscillator — the played note. Summed with TUNE/FINE.
V/oct pitch CV
fmaudioAudio-rate FM modulator into the internal WAVECEL — patch an oscillator here for through-zero-style FM timbres.
audio signal
morph_cvcvCV that offsets the MORPH param, sweeping the WAVECEL's position through the live wavetable.
control voltage (CV); modulates morph (additive offset — ±1 CV sweeps the full range, centered on the knob)
spread_cvcvCV that offsets the SPREAD param (stereo unison voice spread of the WAVECEL).
control voltage (CV); modulates spread (additive offset — ±1 CV sweeps the full range, centered on the knob)
fold_cvcvCV that offsets the FOLD param (the WAVECEL output wavefolder amount).
control voltage (CV); modulates fold (additive offset — ±1 CV sweeps the full range, centered on the knob)

outputs

idcablewhat it does
out_laudioLeft audio output of the internal WAVECEL oscillator (stereo, post SPREAD/FOLD). Pair with OUT R.
audio signal; L/R stereo pair with out_r
out_raudioRight audio output of the internal WAVECEL oscillator, the partner of OUT L.
audio signal; L/R stereo pair with out_l
scope_outmono-videoA mono-video scope-style waveform trace of the live output. Patch into a video destination.
mono video stream
wave3d_outvideoA video render of the 3D wavetable surface — it animates as the three rasters (and thus the table) evolve. Keeps emitting even with no card open.
RGB video stream
combined_outvideoA video render of the active GEN-mode scene — the same content as the on-card XYZ window: the XYZ height-field in GEN=XYZ, or the vaporwave 3D-primitives scene in GEN=3D Shape Gen. Patch FOXY's internal world to VIDEO OUT / BENTBOX / RUTTETRA / etc.
RGB video stream

params

idlabelrangedefaultcurve
tuneTune-36..36st0linear
fineFine-100..100¢0linear
morphMorph0..10linear
spreadSprd1..51linear
foldFold0..10linear
src_tuneS.Tune-36..36st0linear
src_fineS.Fine-100..100¢0linear
src_timbreS.Tbr0..10.3linear
src_symmetryS.Sym0..10.5linear
src_foldS.Fold0..10.2linear
src2_tuneS2.Tune-36..36st7linear
src2_fineS2.Fine-100..100¢0linear
src2_timbreS2.Tbr0..10.5linear
src2_symmetryS2.Sym0..10.3linear
src2_foldS2.Fold0..10.4linear
src3_tuneS3.Tune-36..36st-12linear
src3_fineS3.Fine-100..100¢0linear
src3_timbreS3.Tbr0..10.4linear
src3_symmetryS3.Sym0..10.7linear
src3_foldS3.Fold0..10.3linear
xyz_xshapeX Shp0..1linear
xyz_yshapeY Shp0..1linear
xyz_ydispY Dsp-1..1linear
xyz_warpWarp0..1linear
xyz_zheightZ Ht0..1linear
xyz_zoomZoom1..84linear
xyz_smoothSmth0..10.5linear
sync_modeSync0..?0discrete
freezeRasterAFrA0..10discrete
freezeRasterBFrB0..10discrete
freezeRasterCFrC0..10discrete
freezeTableFrT0..10discrete
gen_modeGEN0..?0discrete

controls

controlwhat it does
FineFine tune of the WAVECEL in cents (−100..+100).
FoldWAVECEL FOLD (0..1) — west-coast wavefolder on the output, adding harmonics. CV via the FOLD input.
FrAFREEZE RASTER A (on/off) — holds source A's raster at its current frame so that axis (the terrain) of the wavetable stops evolving while the others keep moving.
FrBFREEZE RASTER B (on/off) — holds source B's raster (the Y-row distribution) at its current frame.
FrCFREEZE RASTER C (on/off) — holds source C's raster (the Z amplitude/warp) at its current frame.
FrTFREEZE TABLE (on/off) — pins the WAVETABLE: stops re-uploading to the internal WAVECEL so the oscillator keeps reading the last-pushed table even as the rasters keep evolving (the on-card scope keeps previewing what's queued). Reveals the EXPORT TABLE button.
GENGEN mode — picks the raster→wavetable PATH: XYZ (the continuous volumetric heightfield, default) vs 3D Shape Gen (discrete primitives placed in a box, voxelized and scanned). The card shows the active mode name next to the knob.
MorphWAVECEL MORPH (0..1) — scans the read position across the LIVE wavetable frames. Because FOXY rebuilds that table in realtime from the three rasters, morphing here sweeps through an evolving table. CV via the MORPH input.
SprdWAVECEL SPREAD (1..5) — stereo unison voice spread for width. CV via the SPREAD input.
S2.FineSource B (Y rows / raster B) fine TUNE in cents.
S2.FoldSource B (Y rows / raster B) FOLD (0..1) — a wavefolder on that source before it paints its raster.
S2.SymSource B (Y rows / raster B) SYMMETRY (0..1) — crossfades that SWOLEVCO between saw/triangle/square shapes, changing the raster's banding pattern.
S2.TbrSource B (Y rows / raster B) TIMBRE (0..1) — the SWOLEVCO's internal FM-deviation amount, brightening/complicating the waveform that paints this source's raster.
S2.TuneSource B (Y rows / raster B) coarse TUNE in semitones — sets that internal SWOLEVCO's pitch, which paints its raster and thus shapes one axis of the rebuilt wavetable. Source A is the sync master (see SYNC).
S3.FineSource C (Z amplitude / raster C) fine TUNE in cents.
S3.FoldSource C (Z amplitude / raster C) FOLD (0..1) — a wavefolder on that source before it paints its raster.
S3.SymSource C (Z amplitude / raster C) SYMMETRY (0..1) — crossfades that SWOLEVCO between saw/triangle/square shapes, changing the raster's banding pattern.
S3.TbrSource C (Z amplitude / raster C) TIMBRE (0..1) — the SWOLEVCO's internal FM-deviation amount, brightening/complicating the waveform that paints this source's raster.
S3.TuneSource C (Z amplitude / raster C) coarse TUNE in semitones — sets that internal SWOLEVCO's pitch, which paints its raster and thus shapes one axis of the rebuilt wavetable. Source A is the sync master (see SYNC).
S.FineSource A (terrain / raster A) fine TUNE in cents.
S.FoldSource A (terrain / raster A) FOLD (0..1) — a wavefolder on that source before it paints its raster.
S.SymSource A (terrain / raster A) SYMMETRY (0..1) — crossfades that SWOLEVCO between saw/triangle/square shapes, changing the raster's banding pattern.
S.TbrSource A (terrain / raster A) TIMBRE (0..1) — the SWOLEVCO's internal FM-deviation amount, brightening/complicating the waveform that paints this source's raster.
S.TuneSource A (terrain / raster A) coarse TUNE in semitones — sets that internal SWOLEVCO's pitch, which paints its raster and thus shapes one axis of the rebuilt wavetable. Source A is the sync master (see SYNC).
SyncSYNC (Off / X & Y / XYZ) — ratio-locks the source oscillators: Off = all free-running, X & Y = source B snapped to an integer ratio of A, XYZ = both B and C locked to A. Source A is always the master; locking keeps the rasters/audio phase-stable (no slow beating drift).
TuneCoarse tune of the internal WAVECEL oscillator in semitones (−36..+36).
SmthSMOOTH (0..1) — pre-blurs the base/height/warp fields + bilinearly samples, turning jagged spikes into a continuous conical mesh (0 = sharp/jaggy, up = smooth).
WarpWARP (0..1) — how strongly raster C pulls raster A's lookup sideways, twisting the heightfield in the XY plane (a tunnel-like distortion of the wavetable surface). 0 = no warp.
X ShpXYZ X-SHAPE (0..1) — legacy XYZ-window control affecting the on-card scope draw (the v4 wavetable build uses the 3-axis raster path).
Y DspXYZ Y-DISPLACE (−1..+1) — legacy XYZ-window control affecting the on-card scope draw.
Y ShpXYZ Y-SHAPE (0..1) — legacy XYZ-window control affecting the on-card scope draw.
Z HtZ-HEIGHT (0..1) — how much raster C adds a secondary vertical displacement on top of B's primary heightmap, deepening the 3D relief of the field.
ZoomZOOM (1..8) — crops the displayed/scanned field to a centered sub-region of the box, giving fewer, larger peaks (4 = the default "zoomed-in" look).

source

foxy.ts on GitHub.

Generated from packages/web/src/lib/{audio,video}/module-registry.ts · repo