Years ago, Cristoph Kemper told me how the Access Virus came to be. He had coded a filter on a DSP and wanted to test it. Of course he needed an oscillator, so he coded that…pretty soon he had a synthesizer…
Oscillators are an important DSP topic, especially for the musically inclined. Plus…we may want to look more at filters, and need a flexible signal source.
There are many ways to implement oscillators. Yamaha’s DX7 was a huge early digital synthesizer success using FM (frequency modulation of digital sine waves). There was no classic synthesizer filter in the DX7, because it built the harmonic complexity up from sine wave modulation, unlike the classic subtractive synthesis technique of using filters to change the tone of harmonically complex oscillators.
We’re going to look at emulating classic analog synthesizer waveforms. In all their simplicity, it’s hard to not like the sound.
The simplicity comes from simple circuits. Analog synthesizers usually generate a sawtooth by charging a capacitor with a constant current source. The capacitor fills until it hits a trigger point that discharges it, and the process repeats. Increasing the current makes it fill faster, and decreasing it makes it fill slower, controlling the frequency of the sawtooth oscillator. Much of the work is in implemented exponential voltage control, so that a linear voltage change (1 volt per octave is standard) creates an exponential frequency change (which sounds linear to us), and in particular working around temperature terms in the circuit to keep it stable and in tune.
It’s easy enough for us to use a counter (an accumulator) to take the place of the capacitor, but we have a problem in that we can’t “discharge” (reset) it exactly when we want—only on sample boundaries. This results in aliasing—I won’t go into that further now, but the point is that it won’t give us adequate results without a very high sample rate. We need to find another way to emulate a classic analog oscillator.
Next: we’ll look at implementing a wavetable oscillator in Part 1