wavecel
wavecel · sources · schema v1Stereo wavetable oscillator with morph, stereo spread, and a West-Coast wavefolder — a more advanced sibling of WAVETABLEVCO. MORPH scans the wavetable frame position, SPREAD detunes/widens the stereo image, FOLD adds wavefolding harmonics. Ships factory wavetables and accepts runtime upload of E352-format WAV wavetables (frames ride the Y.Doc out to every rack-mate). The card offers a 3D wavetable visualization in addition to the standard scope view. A POLY input (polyPitchGate) accepts the 5-voice chord bus from MIDI LANE (mode=poly) or POLYSEQZ: when any lane is gated WAVECEL renders one wavetable voice per gated lane at that lane's pitch and sums them — the morph/spread/fold timbre is shared across all voices. With nothing patched to poly the mono `pitch` path runs unchanged. A per-voice amplitude ADSR (Attack / Decay / Sustain / Release) plus a BASE VOL knob shape each voice. GATING is decided by what is PATCHED: when the POLY bus OR the mono TRIGGER is connected, WAVECEL is a GATED voice — a lane/voice sounds only while it is gated-or-releasing, and a never-gated lane is SILENT (patching poly never auto-drones). When NEITHER is patched, WAVECEL is a continuous raw VCO. BASE VOL is a per-voice VCA FLOOR the envelope rides on top of: gain = base + (1-base)·env per ACTIVE voice — base=1 (default) means the env does nothing (full gain), base=0 is pure ADSR (silent between notes), 0.5 floors at 0.5 and rises to 1.0 at the env peak. For the raw-VCO case (nothing patched) the env is idle so the gain is exactly BASE VOL, so the default of 1 is the legacy continuous drone (byte-identical) and BASE VOL doubles as the raw-VCO level. In poly mode each lane's gate edge drives its own envelope (one envelope per voice, soft/click-safe retrigger — re-gating a still-releasing voice attacks from the current level, never pops); the mix is normalized over ACTIVE voices (1/sqrt(N)) so a sustain=0 held note doesn't pump the level and a releasing tail doesn't pop. The ADSR + BASE VOL params read live (continuous k-rate) across all stages, so a held chord rides sustain/release in real time and a fresh note attacks at the value present at its trigger moment. Edge detection is block-rate (retrigger granularity floor ≈ one audio block); connectedness (poly/trigger patched) is read from the live patch edges, not bus presence.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
pitch | pitch | 1V/octave pitch CV setting the oscillator's frequency (0V = C4), summed with the Tune and Fine knobs. This is the MONO voice and is used whenever nothing is gating the POLY input. V/oct pitch CV |
fm | audio | Audio-rate frequency-modulation input: the incoming signal modulates the oscillator's pitch for FM/cross-mod timbres (patch another oscillator here for classic FM sidebands). audio signal |
morph_cv | cv | CV that offsets the Morph control, sliding the wavetable scan position up or down so an LFO or envelope can sweep the timbre hands-free (added to the knob, then clamped to 0..1). 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 control, widening or narrowing the detuned stereo spread under modulation (added to the knob, then clamped to the 1..5 range). 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 control, driving the wavefolder harder or softer over time for evolving brightness (added to the knob, then clamped to 0..1). control voltage (CV); modulates fold (additive offset — ±1 CV sweeps the full range, centered on the knob) |
poly | polyPitchGate | The polyphonic chord bus from a poly source (MIDI LANE in poly mode / POLYSEQZ): each lane carries a pitch plus a note-on/off gate, and while a lane's gate is high WAVECEL renders one wavetable voice at that lane's pitch and sums all the gated voices into the stereo output — so a held chord plays a chord. The per-voice ADSR opens on each lane's note-on and releases on its note-off. When nothing is patched here (or no lane is gated) WAVECEL falls back to the single mono PITCH path unchanged. poly pitch+gate bus; 10-channel poly bus (5 pitch + 5 gate lanes) |
trigger | gate | A mono note GATE for the per-voice amplitude envelope: while the level is high the note is held — a rising edge starts the ADSR attack (note-on) and the falling edge starts its release (note-off) — so it is level-sensitive, not just a one-shot. The first rising edge turns WAVECEL into a gated voice (it tracks the gate from then on); before any gate, and when this input is unpatched, the amplitude env is bypassed and WAVECEL free-runs as a continuous drone. gate / trigger |
outputs
| id | cable | what it does |
|---|---|---|
out_l | audio | Left channel of the stereo wavetable output (the lower-detuned half of the spread voices); pair it with OUT R for the full wide stereo image. audio signal; L/R stereo pair with out_r |
out_r | audio | Right channel of the stereo wavetable output (the upper-detuned half of the spread voices); the L/R pair widens as Spread increases. audio signal; L/R stereo pair with out_l |
scope_out | mono-video | A mono-video oscilloscope trace of the currently-morphed waveform (single-color line on a dark background). It ALWAYS renders this scope view regardless of which mode the on-card preview toggle is showing — patch it into a video destination to see the wave even while the card shows the 3D view. mono video stream |
wave3d_out | video | A video output rendering the whole wavetable as a 3D stack of frames in perspective, with the active frame highlighted; the surface animates as Morph (and its CV) scans across the table. Like SCOPE VIDEO it ALWAYS renders its own (3D) view regardless of the card's preview toggle. 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 |
attack | A | 0.001..5s | 0.001 | log |
decay | D | 0.001..5s | 0.1 | log |
sustain | S | 0..1 | 1 | linear |
release | R | 0.001..5s | 0.005 | log |
base_vol | Base | 0..1 | 1 | linear |
controls
| control | what it does |
|---|---|
| A | Attack time of the per-voice amplitude ADSR (1 ms to 5 s, log): how long each note takes to ramp up to full after its gate opens (a poly lane note-on or a TRIG rising edge). The same A/D/S/R feeds every poly voice and the mono trigger. |
| Base | The per-voice VCA floor the amplitude ADSR rides on top of (gain = base + (1-base)×env): at 1 (default) gain is always full so the envelope does nothing and WAVECEL is a raw, continuous drone; at 0 the envelope has full control (silent between notes); 0.5 floors each voice at half and the env swells it up to full on note-on. |
| D | Decay time of the amplitude ADSR (1 ms to 5 s, log): how long the note takes to fall from the attack peak down to the Sustain level after attack completes. |
| Fine | Fine tuning in cents (-100 to +100, one semitone each way) for detuning and beating against other voices; stacks on top of Tune and the pitch CV. |
| Fold | Wavefolder amount from 0 (clean, no folding) to 1 (heavy folding): it folds the waveform's peaks back on themselves to add bright upper harmonics, getting more aggressive as you turn it up. Fold CV adds to this knob. |
| Morph | The wavetable scan position from 0 to 1: it picks which single-cycle frame plays and smoothly cross-fades between adjacent frames, so sweeping it morphs the timbre across the loaded table (the active frame is highlighted in the visualizer). Morph CV adds to this knob. |
| R | Release time of the amplitude ADSR (1 ms to 5 s, log): how long the note takes to fade to silence after its gate closes (a poly lane note-off or the TRIG falling edge). |
| Sprd | Stereo spread / detune width from 1 (a single centered voice, no spread) to 5 (several voices detuned and panned hard across L/R) for a wide, chorused image. Spread CV adds to this knob. |
| S | Sustain level of the amplitude ADSR (0 to 1): the held amplitude a note stays at while its gate remains high, after the decay stage. At 1 the note holds at full; at 0 it decays to silence even while held. |
| Tune | Coarse tuning in semitones (-36 to +36, three octaves each way), added to the incoming pitch CV. Zero is unity; use it to transpose the oscillator in musical steps. |
| Wavecel preset select {n} | Built-in preset loader — a dropdown of baked-in wavetable presets; picking one fetches and parses that table and loads it as a USER table (it resets itself afterward so re-picking the same preset reloads it). A quick way to try fancier tables without uploading a file. |
| Wavecel source select {n} | Factory wavetable picker — a dropdown of the bundled tables (BASIC SHAPES, HARMONIC SWEEP, …); choosing one loads it as the oscillator's wavetable. If you've uploaded a WAV or loaded a preset it also shows a USER entry for the current custom table. The choice is saved with the patch and synced to everyone in the rack. |
| Wavecel viz toggle {n} | Toggles the on-card preview screen between the SCOPE oscilloscope trace and the 3D wavetable view (the button shows the current mode). This only changes what the card displays — the SCOPE VIDEO and 3D VIDEO output ports always emit their own respective views regardless of this toggle. |
| Wavecel wav input {n} | Load WAV — uploads your own wavetable from an E352-format WAV file (single-cycle frames concatenated); the parsed frames become the active USER table and persist with the patch. A status line confirms the frame count, or shows a parse error if the file isn't valid. |
source
wavecel.ts on GitHub.