← All modules
AvailableInstrument

Wavetable

Single-cycle waves with continuous position morphing.

Engine preview

Not built for macOS, Windows or Linux

About

Fourteen formula-generated wavetables, sine through saw, PWM, harmonic sweeps and inharmonic bells, plus four sliced out of hosted recordings, with a position knob that interpolates continuously between frames. Both kinds of table are the same kind of stack.

Build evidence

Every row below is a recorded build row or the recorded absence of one. Nothing here is inferred from what this module is meant to support.

Module
music.codex.wavetable v0.1.0
Built at
no recorded row carries a build time; the browser lanes record none
Closure hash
not a Processor — no lowering closure
Toolchain
  • scriptc 64acce1ae3b8…
  • moduleToolchainDist c621ffab721d…
  • pluginShellKitRuntime bca003784692…
  • faceShellGeneration 8533207ab81f…
  • uiPreservation cd28dbd7e3d6…
  • packagerVersion 3
Build result and download for each format
FormatResultDownload
Browser package (JS)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
Browser package (WASM)Not built by this module's lane

this module has no release.json; its packager lane records no browser program rows

Not built for the browser
VST3Not built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS, Windows or Linux
Audio UnitNot built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS
CLAPNot built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS, Windows or Linux
Standalone appNot built — the native export is blocked

native-export.json records nativeEligibility "blocked"

Not built for macOS, Windows or Linux

Parity

No lane recorded an artifact; there is no parity evidence.

Presets

Start from a named sound, then adjust the instrument to make it yours.

InitDefault

Popular presets for Wavetable

Open a sound shared by the community, then play it in this module.

Signal graph.

Experimental

Migration fallback: approximated from parameter groups, not a runtime wiring diagram.

How it works.

A wavetable here is a stack of frames, and each frame is one single-cycle waveform of 2048 samples. The Position knob does not switch between them: it linearly interpolates the two neighbouring frames sample by sample, so position 0.5 between a sine frame and a saw frame is genuinely half of each. That is what makes position a morph rather than a preset selector. (The preview quantises the knob to 1/256 of the stack before playing it, for the reason described further down.)

The formula tables are generated from a closure of the form (phase, frame, totalFrames) to amplitude, so that half of the bank costs zero bytes of bundled audio and renders identically on every machine. The audio tables take the other route: a recording is fetched, decoded, and cut into 64 frames of 2048 samples each, every frame normalised to full scale on its own. Past that point the two are indistinguishable, the same interpolation, the same conversion, the same voice, which is why one Position knob drives both.

The source package also shipped around forty .WAV single-cycle captures, PPG, Prophet and ESQ waves, which are deliberately still not used. The files do exist in the reference checkout, but they carry no license text and their names reference commercial synth ROMs, so redistributing them from here would be a claim nobody has established. The audio tables instead slice the site's own guitar takes, which are Public Domain Mark 1.0 and credited in public/audio/CREDITS.json. Be clear about what that means: a frame cut out of a guitar performance is not a single-cycle capture, and the result is closer to a granular freeze than to a PPG wave, dense, bright and a bit gritty. It is a real timbre, honestly labelled, rather than a borrowed one.

Slicing a recording needs three departures from the source engine's parser, each because a recording breaks an assumption a wavetable file satisfies for free. Frame size is fixed at 2048 rather than auto-detected, since an arbitrary file's length divides evenly by a power of two only by accident. The trailing partial frame is dropped rather than zero-padded, because padding puts a step down to silence, an audible click, at position 1.0. And frames quieter than -60 dBFS are skipped rather than normalised, since normalising a gap between phrases multiplies the room tone by a thousand and yields a frame of white noise. Frames are also spread evenly across the whole take rather than taken contiguously, so Position scrubs through the performance instead of through its first 1.4 seconds.

The tables fall into three groups by how they behave harmonically, and the difference is audible. The additive ones (Harmonic Series, Harmonic Morph, Filter Sweep) add one whole harmonic at a time, so their frames step rather than glide. The discontinuous ones (Sawtooth, Square, PWM Sweep) contain a vertical edge, which no finite harmonic sum reproduces exactly. And Vowel Morph, Metallic Sweep and Formant Morph use partials that are not integer multiples of the frame, which is what gives them their bell and vowel character.

The preview plays every table through a band-limited oscillator rather than by looping the frame as a sample. Each frame is converted to 256 harmonic coefficients and handed to the browser as a periodic waveform, which resynthesises it per note and so never aliases. That choice was measured rather than assumed: looping the raw frame put 5 to 20 dB of non-harmonic junk into high notes, where the oscillator path stays 50 dB or more below the tone. Both paths are equally periodic, so neither reproduces the truly non-integer partials the Vowel, Metallic and Formant formulas describe, that character survives as the shape of the frame, which is what you hear.

Moving Position under a held note crossfades two oscillators over 20 ms rather than swapping one waveform, because a periodic waveform cannot be replaced mid-note without a discontinuity. The seam is measurably below the waveform's own edges, so it does not click, but it is a seam: a fast sweep is a run of short crossfades, not the per-sample frame interpolation the source engine does. Position is quantised to 1/256 of the stack, since each new waveform costs a few milliseconds to build and is cached per table and position.

Goes well with.

Preview

Oscillator

Two oscillators with independent pitch, level, and stereo position.

PreviewNot built for macOS, Windows or Linux
Preview

OSC-1

A complete synth built from separate modules.

PreviewNo build recorded
Preview

OSC Mini

A compact subtractive synth for learning the signal path.

Preview