← All modules
AvailableInstrument

Wavetable

Two oscillator banks with continuous frame morphing.

Engine preview

CLAP, Standalone app, VST3

About

Two independently selected wavetable banks, each with its own large frame-stack view and continuous position morphing. Browse classic sine, saw, square and pulse shapes, evolving formula stacks, or four audio-derived tables from credited recordings.

System requirements.

The downloadable Wavetable release supports the hosts and systems listed below.

  • CLAPmacOS · arm64

    The open plugin format — Bitwig, Reaper and a growing list of hosts.

  • Standalone appmacOS · arm64

    Runs on its own. No DAW required.

  • VST3macOS · arm64

    Works in Ableton Live, Reaper, Cubase, Studio One, Bitwig and FL Studio.

Version 0.1.0

Presets

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

InitDefaultGlass PadHollow PluckSub BassVowel ChoirMetallic StabSaw LeadGrain BedDual GlassPulse and SyncFifth WindowPlucked GlassStab KeysChord OrganString ScanTwin TakesPicked Air

Popular presets for Wavetable

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

Signal graph.

Experimental

A sketch of the signal path, in the order of the parameter groups.

How it works.

Each oscillator has its own wavetable stack, and each frame is one single-cycle waveform of 2048 samples. Its Position control linearly interpolates neighbouring frames sample by sample, so position 0.5 between a sine frame and a saw frame is genuinely half of each. The two banks can use different tables and move independently. (The preview quantises position 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 either Position under a held note crossfades that bank's 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.

Preview

OSC-1

A complete synth built from separate modules.

Preview

OSC Mini

A compact subtractive synth for learning the signal path.

No build recorded