Before we design and code our synths, let's define a few fundamental elements of music synthesis.
Early synthesizers from Robert Moog and Don Buchla tended to be made up of discreet modules connected via patch cables. So, the flowchart-like path of connected nodes used to wire up the components of a synthesizer are often called patches.
The most fundamental element of a synthesizer is the oscillator. Its job is to create sound by producing a signal that varies in strength quickly over time, and usually with a repetitive, periodic cycle. This is typically an oscillation of AC voltage moving from, say, -1V to +1V.
How quickly does this wave oscillate? Anywhere from 20Hz to 20,000Hz is the typical range for human hearing. The frequency of the oscillator determines the pitch of the sound.
The shape of the oscillator’s signal is also important. A smooth sine wave will have a very pure sounding tone consisting only of the fundamental frequency, while a more jagged sawtooth will be rich with additional harmonics, lending a "buzzy" sound on top of the fundamental.
Here are some typical waveforms used for audio rate oscillators (the images were made using VCV Rack an Open Source Eurorack modular synthesizer program).
One other notable sound source worth mentioning is Noise. It can be used for adding texture and percussive qualities to synthesized waveforms, as well as for more exotic applications, such as wind and wave crash sounds.
One of the most basic patches we can make is to wire an oscillator to an audio output node. In the Audio System Design Tool (which we'll cover more closely later in this guide), it will look something like this:
A mixer is used to combine the signals of multiple audio sources. Each signal is fed into a separate channel -- four-channel mixers are typical. Each channel has an attenuator (usually a fader or knob in the real world) used to adjust how much of that channel's signal is combined in the mix. The mix output can then be patched to the audio output node, or other modules in a more complex patch.
Here’s an example of what happens when we mix a sine waveform with a white noise source.
Rather than always playing constant tones with not starts or stops, we’ll often want to activate the sound only at specific times, such as when a button is pressed. This is accomplished by adjusting the waveform’s signal strength with an amplifier.
In its simplest form, this can sound like a harsh ON/OFF with the tone abruptly starting and stopping. Usually we prefer the sound of a more nuanced loudness envelope so that the sound seems to have been plucked, or struck, or blown as with a stringed instrument, woodwind, piano, percussion, and so on. The envelope that shapes the amplifier is described in stages: Attack, Decay, Sustain, and Release, often abbreviated as ADSR.
With this ADSR envelope we can specify the following parameter:
- Attack: amount of time it takes to amplify from zero to full volume
- Decay: amount of time it takes to drop from full volume to the sustain volume
- Sustain: volume level to maintain until the note is released
- Release: amount of time to return from the sustain volume level to zero
Once we know how to run oscillators through envelopes and into a mixer, it’s time to send some of the signals through effects! Typical effects available on a synthesizer include:
These can be placed nearly anywhere in the signal path of the synthesizer. We’ll create a patch later that runs individual oscillator waveforms through their own effects on their way to the mixers. This diagram shows one such patch, which we'll use later to create the modules and patches for our Arduino code.