So, we finally come to the sixth and final oscillator in Thor’s armoury of sound generators. This is the wavetable oscillator that first appeared in general use in the PPG Wave Computers, and shortly thereafter in the PPG 2.x series. Like other digital oscillators, this is an often misunderstood beastie, so let’s first discuss what a wavetable actually is.
Some definitions
There have been a number of different uses of the word wavetable in recent years, and some of them are rather misleading. For example, I have seen texts that use the name to describe a ROM that holds a selection of unrelated PCM samples such as clarinets, electric guitars, bouzoukis and Mongolian nose flutes. There are lots of waves in the ROM and these are accessed using a lookup table, so the ROM must be a wavetable, right? Wrong!
More justifiably, academics use the word to describe the sequence of numbers that represent a single cycle of a regular, periodic waveform. One can then talk about replaying one such “wavetable” (say, a digital representation of a sine wave) or a second (say, a digital representation of a sawtooth wave).
But this is still not the definition used by most people who talk about wavetable synthesis. So let’s be explicit. For our purposes, a wavetable is not a single wave, it is a selection of (usually related) single-cycle waveforms or their harmonic representations stored digitally and sequentially in such as way that that a sound designer can create musically pleasing timbres by stepping though them while a note is being played.
Unfortunately, while the principle makes sense, this would not sound very pleasant. Imagine a ROM containing just two waveforms: the aforementioned sine and sawtooth waves. Now imagine hearing a sound comprising a few cycles of the sine wave followed by a few cycles of the sawtooth wave, followed by a few cycles of the sine wave followed by the few cycles of a sawtooth wave… and so on. The resulting waveform would exhibit discontinuities each time that one waveform replaced the other, and you would therefore hear a succession of clicks polluting the sound. Consequently, a wavetable synthesiser has to be a bit cleverer than that, providing a mechanism for morphing from one wave to the next. Instead of swapping instantly from the sine wave to the sawtooth wave, there would be a transition period during which the waveform changed smoothly from one extreme (the sine wave) to the other (the sawtooth wave) and back again.
A simple wavetable synthesis patch
Of course, the waves chosen don’t need to be sine and sawtooth waves, and this concept works with any two single-cycle waves of your choosing. It is, therefore, the simplest generalised form of wavetable synthesis.
To illustrate it, let’s create a wavetable synthesis patch in Thor. Figure 1 shows the wavetable oscillator in its most basic configuration, with the Basic Analog wavetable loaded and everything set to sensible default values. As you can see, the “Position” parameter is set to zero in this figure. All other things being equal, if you now play a note the oscillator will generate a sine wave:
Figure 1: Using the Wavetable Osc to generate a sine wave
Hold a key down and sweep the Position knob around from its minimum to its maximum value. If you do this slowly and carefully, you will be able to see the values at which the oscillator’s output changes from one waveform to the next. Having done this, I know that the waveforms contained within this wavetable are as shown in the table below.
Position Value | Waveform generated |
0 – 36 | Sine wave |
37 – 72 | Triangle wave |
73 – 108 | Square wave |
109 – 127 | Sawtooth wave |
So let’s now consider what happens when, instead of turning the knob manually, we use some form of modulator to adjust the Position parameter for us. Figure 2 shows a simple patch with no filters, no effects, and no complex modulations. There’s just a very slight slope to the Attack and Release in the Amp Env to eliminate keying clicks, and a single modulation route in the matrix that directs the output from LFO1 to the Position parameter within the Wavetable Osc itself.
If we now set the initial Osc1 Position to 36 (so that it’s right on the cusp of the transition between the sine and triangle waves) and apply just enough LFO to push the Position above 37 on the positive side of its sweep and below 36 on the negative side, we can hear the sound switching regularly between the sine and triangle waves. But even with such similar waveforms, the glitch at the transition is very unpleasant:
Figure 2: Using an LFO to switch between simple waveforms
(Click to enlarge)
To illustrate what’s happening, I’ve drawn figure 3, which looks a bit like a sine wave drawn over some type of multi-layer cake. Because you’re used to seeing waveforms drawn in this fashion, you might think that this is in some way showing the waveform that you’re hearing, but it isn’t. If you look again, you’ll see that each of the layers in the “cake” represents a waveform, and that the position and “thickness” of the layer corresponds to the table that I drew above. In other words, figure 3 illustrates the Basic Analog wavetable, and the red line shows the modulation curve that determines the nature of the output at each moment in Sound #2.
Figure 3: Representing movement within a wavetable
Fortunately, as I mentioned above, any usable implementation of wavetable synthesis is capable of generating smooth transitions between waveforms. Figure 4 shows the Wavetable Osc with its Position at 36, and its X-FADE (cross-fade) button switched on. If you now play the patch in figure 2, you’ll obtain Sound #3 , which exhibits a pleasing harmonic modulation as the waveform sweeps gently between the sine wave at one extreme and the triangle wave at the other:
Figure 4: Removing glitches by cross-fading between waves
More ways to use a wavetable
Of course, you’re not limited to using cyclic modulators to move between waves, and there’s nothing stopping you from replacing the LFO in figure 2 with a contour created by one of Thor’s envelope generators. Figure 5 shows how you can use the Filter Env to sweep your Position in the Basic Analog wavetable slowly from its maximum value to zero. In harmonic terms, this means sweeping from a sawtooth wave (in which all the harmonics are present) to a square wave (all the even harmonics are eliminated) to a triangle wave (which also has only odd overtones, but with lesser amplitudes than in the square wave) and finally to the sine wave with only the fundamental surviving. You can hear this without cross-fading in Sound #4(a):
and with X-FADE On in Sound #4(b):
Figure 5: Using the Filter Env to sweep through the wavetable
(Click to enlarge)
Sweeping across four idealised waveforms in this fashion is interesting, but hardly earth-shattering, even though it generates a sound that is impractical to obtain using other synthesis methods. So let’s hear a more startling illustration of a wavetable sweep by replacing the Basic Analog wavetable with one of the others provided within Thor. Sticking with the patch in figure 5, and simply stepping through the tables, Sound #5(a) was generated by the Synced Sine table:
Sound #5(b) was generated by the Synced Ramp table:
And Sound #5(c) was generated using the Square Harmonics table:
To clarify what’s happening within the Wavetable Osc in this patch, figure 6 represents a wavetable comprising twelve waveforms (many of the tables have 32, but that would be too many for the figure to be clear) and illustrates the idea of sweeping through the table. The identity of the red line is now obvious: it’s the Filter Env contour that’s controlling which waveform within the table is being output at any given moment.
Figure 6: Sweeping through a wavetable
Interesting in isolation, these sweeps can create excellent sounds when combined with other types of oscillator. Figure 7 shows a swept wavetable oscillator paired with a Multi Osc that’s producing a detuned sawtooth wave. The combination of the two creates Sound #6 , which emulates (or even improves upon) the sync’d bass sounds generated by powerful analogue synths such as the Moog Source. All this, and yet there’s no sync, and still not a single filter or effect inserted into the patch:
Figure 7: Creating a ‘sync’ sound
(Click to enlarge)
So far, we’ve only looked at wavetables in the context of emulating sounds reminiscent of analogue synthesis. Let’s now step beyond this and use the same patch to create one of the fragile, glassy tones first heard on the early PPGs. These are, after all, the sounds that made these synths so desirable.
Returning to the patch in figure 5, step through the list of wavetables in Thor and select the one named “10 Sines”. If you now sweep through the table from its last element to its first without cross-fading, you’ll hear the twelve distinct waveforms that were chosen by Thor’s programmers and placed in the table in a quasi-random order:
Now switch on the X-FADE function. Ah… that’s more like it. Sound #8 is an excellent example of the type of timbres that made the PPG Wave 2.0 famous:
Creating imitative sounds using a wavetable
So far, we’ve been using wavetables to generate relatively simple sounds. Now, we’ll step beyond these and move to genuine sound design using wavetable synthesis.
Let’s imagine that we want to create a range of solo brass sounds using a wavetable synthesiser. To do this, we could imagine a wavetable that included snapshots of the timbres generated by one of the brass instruments, ranging from the very bright tone that exists just after the start of the note to the slightly duller tone that tends to make up the body of the sound. We could envisage a wavetable that includes these as shown in figure 8.
Figure 8: A hypothetical brass wavetable
Now we need to decide how we wish to move through this wavetable. Obviously, applying an LFO to oscillate between waves is not appropriate, nor is sweeping through the entire table. Instead, we want the sound to start with a dull timbre and then, quite rapidly, become very bright. Next, the brightness will diminish until it reaches the timbre that it will maintain while the note is being sustained. Finally, we want the note to become dull again and disappear quite rapidly when the key is released. We can draw this as in figure 9.
Figure 9: Moving through a suitable wavetable to create a brass sound
Hang on a minute… if we were creating a brass sound on a subtractive synth, this would be the filter contour for the patch. Of course it would, but instead of taking a waveform of constant harmonic content (a sawtooth wave) and then opening and closing a filter to create timbral modifications, we’re taking a sequence of waveforms with the correct harmonic content at a handful of points, and then interpolating between these to create the required tonal changes as the note progresses. No filter is needed.
Naturally (or I wouldn’t have chosen this as an example) Thor contains a wavetable that allows us to convert these ideas into reality. However, the brightest sound in this table exists at Position = 0, and the dullest is at Position = 127 so we need to invert figure 9 to create figure 10.
Figure 10: Using the Trombone Multi wavetable in Thor
This then tells us how to proceed. First, select the Trombone Multi wavetable and set the Position parameter to 127. Now create the appropriate ADSR contour in the Filter Env and use the modulation matrix to direct this in inverted form to the Osc1 Pos parameter. A neat trick here is to make the amount of modulation dependent upon the velocity so that if you hit a key softly the sound is less bright than if you hit it hard. Finally, direct a little LFO to the pitch of Osc1 for a gentle vibrato, simply because it adds interest to the sound. (Figure 11.)
Figure 11: A wavetable synthesis brass patch
(Click to enlarge)
The values in the modulation matrix are quite critical for achieving the desired result, but I found that a Position modulation of -88 works quite well (it has to be negative to make the contour in figure 10 go down and then up rather than vice-versa) and a velocity amount of around 72 seems to work nicely. Now you can set up the Filter Env contour and the LFO to taste and play.
Sound #9 is an example of this patch played with lashings of reverb to achieve a nice, ambient effect:
You can create innumerable variations on this by adjusting the parameter values within the patch, and if you don’t stray too far the timbre will remain brash and brassy, getting brighter and darker in the way that a brass sound should. But there are still no filters anywhere to be seen.
I love this stuff.
Text & Music by Gordon Reid