foxy
foxy · sources · schema v1Hybrid 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.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
pitch | pitch | V/oct pitch input (0V = C4) for the internal WAVECEL wavetable oscillator — the played note. Summed with TUNE/FINE. V/oct pitch CV |
fm | audio | Audio-rate FM modulator into the internal WAVECEL — patch an oscillator here for through-zero-style FM timbres. audio signal |
morph_cv | cv | CV 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_cv | cv | CV 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_cv | cv | CV 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
| id | cable | what it does |
|---|---|---|
out_l | audio | Left 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_r | audio | Right audio output of the internal WAVECEL oscillator, the partner of OUT L. audio signal; L/R stereo pair with out_l |
scope_out | mono-video | A mono-video scope-style waveform trace of the live output. Patch into a video destination. mono video stream |
wave3d_out | video | A 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_out | video | A 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
| id | label | range | default | curve |
|---|---|---|---|---|
tune | Tune | -36..36st | 0 | linear |
fine | Fine | -100..100¢ | 0 | linear |
morph | Morph | 0..1 | 0 | linear |
spread | Sprd | 1..5 | 1 | linear |
fold | Fold | 0..1 | 0 | linear |
src_tune | S.Tune | -36..36st | 0 | linear |
src_fine | S.Fine | -100..100¢ | 0 | linear |
src_timbre | S.Tbr | 0..1 | 0.3 | linear |
src_symmetry | S.Sym | 0..1 | 0.5 | linear |
src_fold | S.Fold | 0..1 | 0.2 | linear |
src2_tune | S2.Tune | -36..36st | 7 | linear |
src2_fine | S2.Fine | -100..100¢ | 0 | linear |
src2_timbre | S2.Tbr | 0..1 | 0.5 | linear |
src2_symmetry | S2.Sym | 0..1 | 0.3 | linear |
src2_fold | S2.Fold | 0..1 | 0.4 | linear |
src3_tune | S3.Tune | -36..36st | -12 | linear |
src3_fine | S3.Fine | -100..100¢ | 0 | linear |
src3_timbre | S3.Tbr | 0..1 | 0.4 | linear |
src3_symmetry | S3.Sym | 0..1 | 0.7 | linear |
src3_fold | S3.Fold | 0..1 | 0.3 | linear |
xyz_xshape | X Shp | 0..1 | — | linear |
xyz_yshape | Y Shp | 0..1 | — | linear |
xyz_ydisp | Y Dsp | -1..1 | — | linear |
xyz_warp | Warp | 0..1 | — | linear |
xyz_zheight | Z Ht | 0..1 | — | linear |
xyz_zoom | Zoom | 1..8 | 4 | linear |
xyz_smooth | Smth | 0..1 | 0.5 | linear |
sync_mode | Sync | 0..? | 0 | discrete |
freezeRasterA | FrA | 0..1 | 0 | discrete |
freezeRasterB | FrB | 0..1 | 0 | discrete |
freezeRasterC | FrC | 0..1 | 0 | discrete |
freezeTable | FrT | 0..1 | 0 | discrete |
gen_mode | GEN | 0..? | 0 | discrete |
controls
| control | what it does |
|---|---|
| Fine | Fine tune of the WAVECEL in cents (−100..+100). |
| Fold | WAVECEL FOLD (0..1) — west-coast wavefolder on the output, adding harmonics. CV via the FOLD input. |
| FrA | FREEZE 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. |
| FrB | FREEZE RASTER B (on/off) — holds source B's raster (the Y-row distribution) at its current frame. |
| FrC | FREEZE RASTER C (on/off) — holds source C's raster (the Z amplitude/warp) at its current frame. |
| FrT | FREEZE 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. |
| GEN | GEN 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. |
| Morph | WAVECEL 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. |
| Sprd | WAVECEL SPREAD (1..5) — stereo unison voice spread for width. CV via the SPREAD input. |
| S2.Fine | Source B (Y rows / raster B) fine TUNE in cents. |
| S2.Fold | Source B (Y rows / raster B) FOLD (0..1) — a wavefolder on that source before it paints its raster. |
| S2.Sym | Source B (Y rows / raster B) SYMMETRY (0..1) — crossfades that SWOLEVCO between saw/triangle/square shapes, changing the raster's banding pattern. |
| S2.Tbr | Source 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.Tune | Source 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.Fine | Source C (Z amplitude / raster C) fine TUNE in cents. |
| S3.Fold | Source C (Z amplitude / raster C) FOLD (0..1) — a wavefolder on that source before it paints its raster. |
| S3.Sym | Source C (Z amplitude / raster C) SYMMETRY (0..1) — crossfades that SWOLEVCO between saw/triangle/square shapes, changing the raster's banding pattern. |
| S3.Tbr | Source 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.Tune | Source 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.Fine | Source A (terrain / raster A) fine TUNE in cents. |
| S.Fold | Source A (terrain / raster A) FOLD (0..1) — a wavefolder on that source before it paints its raster. |
| S.Sym | Source A (terrain / raster A) SYMMETRY (0..1) — crossfades that SWOLEVCO between saw/triangle/square shapes, changing the raster's banding pattern. |
| S.Tbr | Source 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.Tune | Source 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). |
| Sync | SYNC (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). |
| Tune | Coarse tune of the internal WAVECEL oscillator in semitones (−36..+36). |
| Smth | SMOOTH (0..1) — pre-blurs the base/height/warp fields + bilinearly samples, turning jagged spikes into a continuous conical mesh (0 = sharp/jaggy, up = smooth). |
| Warp | WARP (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 Shp | XYZ 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 Dsp | XYZ Y-DISPLACE (−1..+1) — legacy XYZ-window control affecting the on-card scope draw. |
| Y Shp | XYZ Y-SHAPE (0..1) — legacy XYZ-window control affecting the on-card scope draw. |
| Z Ht | Z-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. |
| Zoom | ZOOM (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.