Coming up with interesting wavetables

I’m in the process of filling the synth with wavetables, and was wondering if you had any tips on how to get some of the more interesting tones. I feel like all I create falls into one of 10-ish categories (saw-like, additive etc.) and at this point its hard to find new and interesting ones. The methods I’ve used so far are:

draw the table,
draw the spectrum,
generate from sample,
mutate spectral components of existing ones

Any input welcome :slight_smile:

1 Like

While not fundamentally different, this might give you some ideas:

There’s a paper too, if you prefer that format


Are you planning to add some kind of FM to the synth? If yes, then be aware that the most simple waveforms (= sine plus a little something) yield the most interesting results, so in this case you might add a few more „basic waveforms“. Complex Waveforms just get random when applied FM to it.

Apart from that it‘s actually more what happens with wavetables (modulation, filters, etc) that define the sound of a synth.

1 Like

Yep, I have a FM as well as PM section which have access to the entire wavetable base. Thanks for the hint, I might consider adding an additional FM-wavetable section then. Will do some tests beforehand

Oh my, that’s genius!
Edit: I think this will add great additions! While its still the “draw wavetable” approach in essence, the random nature will (hopefully) give new sounds, since my own drawings will still be biased towards what I think will sound good.

Yeah this one produces quite interesting results. The good part is that you can set an arbitrary noise freq, and thereby produce sine-like waveforms as well as crazy-noizish ones :slight_smile:


:scream: :scream: :scream:

Here are a couple import methods I am working on:


Waveforms drawing look stunning, did you use OpenGL or just JUCE strokepath?

While the whole thing looks dope, you’ll have to give me more insight on what’s going on.
You sample the mouthdrum, then drop it in the synth. Which generates a multitudeof waveforms. So your plugin detectes single repeating cycles and stores represents them as wavetables? Also the pitch of the sample changes and you plugin is smart enough to find the ‘periodic’ sections still?

Isn’t any zero-crossing always a period? therefore count the samples between current and previous zero crossings and then time stretch accordingly?

Not quite, you can take a section with an arbitrary amount of zero crossings, repeat it periodically and the base tone of the resulting sound is one over the duration of the section. Even a sinewave has two zero crossings in one cycle.

To find a wave in an arbitrary sound you’ll have to go the opposite way: find sections which are (almost) repeating in time. These can have multiple zero crossings as well.

I use JUCE’s Graphics object to paint the background onto an OpenGL quad, then use an OpenGL line renderer I made to animate on top of that.


The first method was “Pitch Splice”. I take a sample (in this case a jew’s harp) and find the pitch of the entire sample. I use a relatively simple time domain method that works well on sounds with constant pitches. Then I chop up the sample at that pitch’s window size and do some blending to remove the discontinuity from chopping.

The “Vocode” option is kind of like pitch splice, except I remove any phase changes that happen across the wavetable. Ends up sounding like a vocoder even though it doesn’t work like one.


bruh, that looks amazing!

1 Like

I wrote a tool called WaveformExplorer that built wavetables either from JUCE javascript scripts or by importing arbitrary audio files and letting the user select a range of audio and then processing it with various functions. I suppose i could open-source it. Im sure there are problems but it’s a nice little desktop tool for that kind of thing…

Has a built in but probably flawed synth for smoothly auditioning your wavetable too :slight_smile:


hey sorry for the late answer. That would be supercool! In what way does it spit out the waveforms? single cycle?

Let me discuss with my business partner … I think it was spitting them out as C++ byte arrays for direct inclusion in your future mega-synth :wink:


I’m using Fourier tables rather, but whatever format will do :wink:
Note also: If this is a big stretch for you, please don’t bother. I have the majority of my wavetables set by now and will only try to replace the lamer ones.