Overview
Plinky is a small synth whose firmware and tools are published openly on GitHub. Its oscillators read from one built-in wavetable, and you can replace the wave shapes in that table with your own.
The table isn’t loaded from a card at play time. It’s generated ahead of time by the Plinky wavetable tool, which takes your waves, downsamples them for Plinky’s 32 kHz engine, and pre-filters a set of versions for different octaves, so high notes play from band-limited copies.
The repository also holds the default cycles as c0.wav to c14.wav, along with several alternative sets in numbered folders, such as additive and FM harmonics, phase vowels, and wavefolder shapes. Those make a good template: open one, look at the length and format, and match it. The README credits the code to mmalex and the core wavetable waves to miuott.
Wavetables on the Plinky
The tool’s README sets out what it wants: 15 files named c0.wav to c14.wav in one folder, each a single-cycle waveform of at least 512 samples, 16-bit and mono. The tool resamples each one to 512. It writes a wavetable.h for building the firmware and a wavetab.uf2 that you copy straight to Plinky. Prebuilt versions are in the repository for macOS and Windows.
Each file has to be one cycle. The tool’s source reads the whole of every file as a single wave, so a multi-frame table in one WAV gets squashed into one 512-sample cycle. It also only accepts integer PCM, so 32-bit float files are rejected. And it scales each cycle to its own peak before building the table, so any level differences you set between frames are evened out.
WaveStack writes one WAV per table, not a folder of single cycles, and it doesn’t write UF2. That’s why there’s no Plinky target. The parts do line up, though: export a 15-frame table with Other tools at 512 samples per frame and 16-bit, and each frame is exactly one Plinky cycle. Split that file into fifteen 512-sample pieces in an audio editor, name them c0.wav to c14.wav in table order, and run Plinky’s tool on the folder.
Keep the split files in the same order as your WaveStack frames, so c0.wav is your first frame and c14.wav your last. A morph built in WaveStack gives you even steps from one end of the set to the other. Because wavetab.uf2 carries the whole set, changing even one shape means running the tool again on all 15 files and copying the new file across.
Specifications
| Input files | c0.wav–c14.wav (15 single cycles) |
|---|---|
| Input format | 16-bit mono WAV |
| Samples per cycle | At least 512, resampled to 512 |
| Engine sample rate | 32 kHz |
| Output | wavetab.uf2, copied to Plinky |
Frequently asked questions
How do I load custom wavetables on Plinky?
With Plinky’s wavetable tool from GitHub. Put 15 single-cycle WAVs named c0.wav to c14.wav in a folder, each 16-bit mono and at least 512 samples long, and run the tool. It resamples them, builds the pre-filtered octaves, and writes wavetab.uf2, which you copy to Plinky. Prebuilt versions of the tool are included for macOS and Windows, so you don’t need to compile anything.
Can WaveStack export a Plinky wavetable?
Not directly. WaveStack writes a whole table as one WAV and doesn’t write UF2, and Plinky’s tool wants each cycle in its own file, so there’s no Plinky target. You can get most of the way: export a 15-frame table with Other tools at 512 samples per frame and 16-bit, split it into fifteen 512-sample files in an audio editor, and name them c0.wav to c14.wav before running the tool. Then copy the wavetab.uf2 it writes to Plinky.
Can I give Plinky’s tool a normal wavetable file?
No. The tool reads every sample in each file as one cycle, so a WAV holding many frames is squeezed into a single 512-sample wave and comes out as a buzzy jumble. Each of the 15 files has to contain exactly one cycle. If your source is a multi-frame table from WaveStack or anywhere else, split it into separate single-cycle files first, each holding exactly one frame.
What bit depth should the cycles be?
Plinky’s README asks for 16-bit mono, at least 512 samples per cycle. The tool rejects anything that isn’t integer PCM of at least 16 bits, so 32-bit float files won’t load. When you export from WaveStack for this, choose 16-bit in Other tools, and make sure the editor you use to split the file keeps it at 16-bit mono when it saves the pieces.