Overview
Vital is a software wavetable synth by Matt Tytel, described in its own README as a spectral warping wavetable synthesizer. It has three wavetable oscillators, each with a built-in wavetable editor, and its warp modes reshape a frame’s spectrum or phase on the fly. Vital’s source code is published on GitHub, and since its documentation doesn’t spell out the file format, the details on this page come from that code. The repository is updated some time after each binary release, so the shipping version can differ slightly.
Every frame in Vital is 2048 samples long. Internally an oscillator has 257 frame positions, numbered 0 to 256, and the wavetable position control moves across all of them. When a table has fewer frames than that, Vital spreads them over the full range and fills the gaps by blending neighboring frames, so a 16-frame table still sweeps smoothly from one end to the other.
Vital has its own wavetable format, .vitaltable, which stores how a table was built in the editor rather than the finished frames. It also loads plain WAV files, which is what WaveStack writes. A .vitaltable only opens in Vital, while a WAV can move between synths, so WAV is the better choice when the same table needs to work in Serum, Surge XT or hardware too.
Wavetables on the Vital
When Vital loads a WAV as a wavetable, it slices the audio into 2048-sample frames. It doesn’t read the frame size from a Serum clm chunk. The code does read that chunk, but only for the author name and the blend setting (no blend, crossfade, or spectral), and it uses spectral blending when there’s no chunk at all. So a table built at 1024 or 256 samples per frame loads with the wrong cycle length unless it’s resampled first. The one exception is a file of exactly 64 × 256 samples, which Vital checks for a WaveEdit bank.
Vital reads the first channel of the file, so stereo tables lose their right channel. Frames past the end of Vital’s position range are ignored: a table of 2048-sample frames uses about 256 of them.
WaveStack’s Vital target writes a mono WAV with 2048-sample frames and no clm chunk, so Vital uses its default spectral blending between frames. Tables at another frame size are resampled to 2048, longer tables have frames picked evenly down to 256, and a 2D grid or 3D volume is flattened to one row with a warning in Export. See between the frames for why the blend setting matters.
Vital looks for user tables in the Wavetables folder inside its User folder. Link that folder in Export and new tables appear in Vital’s wavetable browser alongside the factory ones.
Specifications
| Samples per frame | 2048 |
|---|---|
| Frame positions | 257 (0–256); shorter tables are spread across them |
| File types | WAV, .vitaltable |
| Frame size detection | None: WAVs are always sliced at 2048 samples |
| clm chunk | Read for the blend setting and author, not the frame size |
| Channels | First channel only |
| User wavetable folder | User/Wavetables in Vital’s data folder |
From WaveStack to the Vital
- Build or open a table in WaveStack, from a seed wave, an imported sample or image, or an existing WAV or Surge .wt.
- Press ⌘E and choose Vital as what the table is for.
- Under Save to, link Vital’s User/Wavetables folder. Export shows which files already there are ready and which need converting.
- Export. WaveStack writes a mono WAV with 2048-sample frames into the folder.
- In Vital, click the wavetable name on an oscillator and choose the table from the browser.
- Move the wavetable position, or drag a modulator onto it, to scan the frames.
Frequently asked questions
How do I import custom wavetables into Vital?
Copy the WAV into the Wavetables folder inside Vital’s User folder, then pick it from an oscillator’s wavetable browser. Vital slices any WAV into 2048-sample frames, so the file needs to have been made at that frame size. WaveStack’s Vital target writes 2048-sample frames, and if you link the User/Wavetables folder in Export it writes straight into it. Vital also has its own .vitaltable format, but plain WAVs are the simplest way to bring tables in from other tools.
What frame size does Vital use?
2048 samples. Vital’s source code fixes the frame size at 2048 (2 to the 11th power), and WAVs loaded as wavetables are cut into frames of that length without checking a frame-size tag. A table made at a different size, such as 256 for some Eurorack modules, needs resampling before Vital will play it correctly. WaveStack does that resampling when you export with the Vital target, and also cuts long tables down to 256 frames by picking frames evenly.
Can I use Serum wavetables in Vital?
Yes. Serum tables use 2048-sample frames, which is what Vital expects, so they slice correctly. Vital ignores the frame size in Serum’s clm chunk but does read its blend setting, so a Serum table that was saved with interpolation turned off loads without blending between frames. If a Serum-style file came from another tool at a different frame size, import it into WaveStack, which reads Serum-style WAVs, and export it again with the Vital target.
Why does my wavetable sound wrong in Vital?
Most likely the frame size isn’t 2048. Vital always slices at 2048 samples, so a table built at 1024 samples per frame ends up with two cycles in every frame, which sounds an octave up and changes the tone. A table at 256 samples gets eight cycles per frame. Stereo tables can also sound different, because Vital only reads the first channel. Exporting from WaveStack with the Vital target fixes both, since it resamples to 2048 and writes mono.