GEOForge — Guide
A wavetable workshop: bring audio, harmonics or an existing wavetable in, shape it, and export it in whatever format your synth expects.
The workflow
Everything flows left to right through three tabs. Source is where a table comes from and how it sounds. Export is purely format and technical output. Multisample renders the table as playable sampler instrument.
Getting a table in
- Drop a .wav — sliced into cycles using the extraction mode of your choice.
- Drop a .wt — both 3rd Wave text and Surge/Vital/Bitwig binary formats load as a working table, so you can convert between synth formats.
- Drop a .geoforge project — restores a whole saved session.
- Spectrum sub-tab — draw harmonics directly. Draw a Start spectrum and an End spectrum and the table interpolates between them across its frames: frame 1 is pure Start, the last frame is pure End. Leave End empty and the Start spectrum simply holds.
- Spectrum tools — Lock restricts which harmonics can be drawn (odd only, even only, every 3rd or 4th) and clears the ones it excludes, so the spectrum genuinely matches the rule rather than hiding stale values behind it; presets respect it too. Quantise snaps levels to fixed steps for deliberate, repeatable spectra. Tilt scales the whole series brighter or darker while keeping its shape.
- X/Y sub-tab — load up to four tables into the corners and drag the dot to blend between them. Blending happens in the frequency domain (magnitude and phase separately) rather than by averaging samples, which avoids the level collapse plain averaging causes when sources sit at different phases.
Shape controls
These four live on the Source page, right under the transport, because that is where you hear them. All of them ramp in progressively across the table — clean at frame 1, full strength at the last frame. That means auditioning with Play on an early frame will understate them; use Sweep, or drag the scrubber toward the end, to hear them fully.
- Drive — saturate (soft clip) or wavefold distortion. Wavefold reflects peaks back down rather than rounding them, adding more harmonics.
- Formant — shapes the spectrum toward a vowel-like resonance. Pick the vowel, set the amount; amount 0 is off.
- Crush — reduces resolution and holds samples, for a lo-fi stepped character.
- Skew — warps each cycle's internal timing toward its start or end, a PWM-ish shift.
Reset returns all four to neutral. They also reset automatically on startup and whenever you load new audio, since they are per-table creative choices rather than standing preferences.
Auditioning
Play holds the selected frame. Sweep travels through the table, ping-ponging so it never jumps. The keyboard auditions at real musical pitch — with its Sweep toggle off each key holds a single cycle, with it on each key plays the whole table moving. Playback continues while you adjust anything, so shaping changes are heard live.
Editing individual frames
Under the frame scrubber, the This frame row acts on whichever frame is selected. All of it is undoable.
- Duplicate — inserts a copy just after the current frame, useful for holding a timbre for longer before it moves on.
- Delete — removes the current frame. Disabled at one frame, since a table needs at least one.
- ← / → — swap the frame with its neighbour, to reorder how the table evolves.
- Insert blend — adds a frame halfway between this one and the next, blended in the frequency domain (the same way the X/Y pad works) so it doesn't lose level where the neighbours sit at different phases. Good for softening a jump between two very different frames.
- Even out — rebuilds every intermediate frame along a straight line from the first frame to the last, so the table steps evenly instead of lingering then lurching. First and last are left untouched.
Views
Top-right of the frames display switches between Waterfall (frames stacked front to back), 3D (a lit surface — drag to orbit, scroll to zoom, double-click to reset) and Spectrogram (harmonic content against frame, showing how the spectrum evolves across the whole table at a glance). A playhead tracks the sound in all three.
Table configuration
- Frame size — samples per cycle, must be a power of 2. 2048 is the common standard.
- Frame count — number of cycles in the finished table.
- Source channel — which channel(s) of source audio feed the table.
- Output format — 32-bit float preserves the most headroom and precision; 24-bit suits hardware that asks for it specifically. 8- and 24-bit are only available for plain .wav, since the .wt containers can't carry them.
- Normalization — per-frame keeps every cycle at a consistent level; whole-table preserves the relative loudness differences between frames.
- Loop-smooth crossfade — blends each cycle's tail into its head to kill loop clicks.
- Cycle phase — rotates every frame by a fraction of a cycle. Inaudible on its own (a uniform shift of a looping waveform sounds identical), but it moves where the cycle starts, which affects how the loop seam lands and how frames line up if your synth crossfades between them.
- Frame blend — declared in the exported file's header, not applied to the audio itself. Tells the receiving synth whether to crossfade between frames.
- Extraction mode — time-stretch resamples the source to hit an exact frame count; chop takes raw consecutive samples and derives the count from source length; spectral capture resynthesizes clean, perfectly-looping cycles from frequency content, which works well on unpitched or wandering-pitch material.
- Remove DC offset — centres the waveform so it carries no DC bias.
- Use full 16-bit range — for 16-bit exports, uses the complete range rather than leaving headroom.
Export presets
Presets set frame size, frame count, format and target together for a known synth.
If the table that actually got built stops matching what the selected preset needs, a warning appears with a Rebuild button showing the required dimensions. This is worth understanding, because the mismatch can happen without you doing anything obviously wrong — Chop extraction mode, for instance, derives its own frame count from the source audio's length and ignores the frame count field entirely, so a preset can look correctly set while the built table is a different size.
Pressing Rebuild does one of two things. If there's source audio behind the table, it re-slices from that original audio at the correct size, which gives the best quality since it works from full-resolution material. If the table was generated or imported with no source behind it, it resamples the existing table instead. It also switches Chop to Time-stretch when needed, since Chop cannot hit an exact frame count by definition.
| Preset | Format | Notes |
| Groove Synthesis 3rd Wave | 2048 × 64, text .wt | Confirmed-working layout. |
| Surge XT / Bitwig Polymer | 2048 × 64, binary .wt | -6dBFS headroom, per Surge's own recommendation. |
| Xfer Serum | 2048 × 64, float32 .wav | Reads cycle count and length, not sample rate. |
| Arturia Pigments | 2048 × 64, float32 .wav | Arturia documents 2048-sample waves, up to 256 positions. |
| Vital | 2048 × 64, float32 .wav | Vital assumes 2048 samples per frame and reads the left channel. |
| Arturia MiniFreak | 512 × 64, 24-bit .wav | Mono, 512 points per frame, as Arturia specify for user wavetable import. |
| Suonobuono Polyvera (standard) | 2048 × 64, float32 .wav | Mono. Copy to Polyvera_data/User/Wavetables2048. |
| Suonobuono Polyvera (vintage) | 128 × 64, 8-bit .wav | Manual states this folder is only for 128-sample 8-bit tables. Copy to Polyvera_data/User/Wavetables128. |
| Waldorf Quantum / Iridium | 2048 × 64, int16 .wav | — |
| Waldorf M | 128 × 64, int8 .wav | Hardware-native lo-fi resolution. |
| Waldorf Blofeld | 128 × 64, int8 .wav | Hardware-native lo-fi resolution. |
Frame blend writes a clm chunk into exported .wav wavetables — the de-facto Serum convention that tells a synth the cycle length and whether to blend between frames. Serum, Vital, Pigments and Polyvera all read it, so a table loads with the blending you intended rather than whatever that synth happens to default to. Linear crossfade is the default because smooth morphing is what modern wavetable synths expect. None gives stepped, PPG-style transitions — which is why the Polyvera vintage preset selects it automatically, since that abrupt character is the point of the 128-sample mode. Spectral morph asks the synth to interpolate in the frequency domain where it supports that.
Note that Polyvera plays up to 64 frames even though the file format allows 256, which is why both Polyvera presets use 64.
MiniFreak and octave: the preset follows Arturia's stated spec of 512 points per frame. MiniFreak's wavetable oscillator reads a 512-sample cycle, which sits two octaves above where a 2048-sample cycle would, so a table may play higher than you expect relative to the keys. That's the oscillator's tuning rather than anything in the file — drop Osc 1 by two octaves in the patch and save it, and pads will sit where you want them.
If an imported table plays at the wrong octave, frame size is almost always the cause. Pitch isn't stored in a wavetable file — the synth derives it from how many samples it believes one cycle contains. If it assumes 2048 and your frames are 512, it reads four of your cycles as one and plays two octaves sharp; 1024 gives one octave sharp, 4096 one octave flat. Each doubling or halving of frame size is exactly one octave, so the size of the error tells you which frame size the synth actually wants.
Batch conversion
Queue multiple .wav files and convert them all with the current settings. {name} in the naming pattern is replaced by the original filename and {n} by a sequence number, starting from the value you set. Batch uses the unedited source files, not the currently shaped table.
Multisample export
Renders the table at real pitches across a key range and packages the WAVs with an SFZ mapping. Each note gets an embedded smpl loop chunk so samplers loop it correctly.
File naming: each sample is named MIDI_note_yourname.wav — for example 060_C3_BellPad.wav. The zero-padded MIDI number leads so that a plain alphabetical file listing comes out in chromatic order, which means dragging the folder into a sampler maps the notes in sequence. Note names alone wouldn't do this: alphabetically C#1 sorts before C1, and C1 lands next to C10 rather than C2.
Root-key convention: C3 = MIDI note 60 (middle C). If your sampler labels middle C differently, expect a matching octave offset in the note names.
- Loop start / end frame — the attack plays once up to the loop start, then the loop region repeats for sustain. That region is rendered as a palindrome (start → end → start), so it returns to exactly where it began and the wrap is seamless in level, slope and timbre.
- Loop mode — forward, alternating (bidirectional) or backward. Written into both the WAV's loop chunk and the SFZ.
- Loop crossfade — usually leave at 0. The loop already joins cleanly; a crossfade blends quieter pre-loop material into the tail and can make the level less even, so it's a fallback for awkward material rather than a default.
- Audition loop — renders one note through the exact export path and loops it, so you can hear the loop point before committing to a full render.
Library and projects
Library stores tables under a name for the session — reload one as the working table, or send it straight to an X/Y corner. It lives in memory, so save a project to keep it.
Projects capture the whole session: settings, library, X/Y corners and the current table. Type a name in the header field, press Save, and you get a .geoforge file named accordingly; the name is stored inside the file too, so loading it back restores the name as well. To rename, edit the field and save again. Load restores a project, and you can also just drop a .geoforge file onto the Source dropzone.
Projects are files rather than an in-app list for a practical reason: a session with a few library tables and four X/Y corners runs to around 6MB, and browsers typically allow only about 5MB of storage in total. An in-app project manager would break on exactly the sessions most worth keeping. Files have no such limit, and they can be backed up, version-controlled and shared.
Format and technical settings persist between visits on their own; the creative shape controls deliberately do not.
Saving files
Where the browser supports it (Chrome, Edge and other Chromium browsers), every save — exports, batch and multisample ZIPs, and projects — opens a proper save dialog so you can choose the folder and filename, and cancelling genuinely cancels. Firefox and Safari have no such API, so saves there go to the browser's download folder as normal.
Notes
Everything runs locally in your browser. No audio, table or file ever leaves your device, and there is no tracking or account. Exported ZIPs are built in-page, so exporting works offline.