I’ve spent the past 10 days in sunny Anaheim, California at The NAMM Show 2016 exhibiting with Modal Electronics, so I haven’t had much time to work on my project. However it’s given me a chance to think a lot about my synthesis engine design, so I thought I’d use this weeks (well, a late last weeks) update to give a brief overview of audio synthesis types, the essential components, as well as outlining my current design ideas and how they have changed over the project so far.
Before I continue, it is probably worth stating that I am by no means either a synthesiser enthusiast or an expert at developing audio synthesis engines, and part of me doing this project is to advance my knowledge and experience in both of these areas. I have got a good intermediate understanding of audio synthesis, but if you want to know about synthesis types and components at an advanced level I’d rather leave that to other sources than for me attempt to explain everything in detail here. Also I am going to talk about audio synthesis from a very general point of view, and not discuss the differences between analogue and digital synthesis; however it is worth mentioning that as I'll be implementing the audio synthesis engine on the BeagleBone Black it is going to be completely digital.
There are many different types of synthesis, which all create their own distinctive sounds in particular ways.
The main types of synthesis are as follows:
- Additive synthesis - Adding together simple waveforms (usually sine waves), called partials, to create more complex waveforms. Not very common in modern synthesisers due to the complexity of designing a user interface that allows each partial to be controlled in an intuitive way. A good example of an additive synthesis software synthesiser is FL Studio's Harmor.
- Subtractive synthesis - Filtering harmonically-rich waveforms. Probably the most common type of synthesis within modern commercial synthesisers, and is relatively simple to implement and process. An example of a classic subtractive synthesis synthesiser is the Moog Minimoog.
- Frequency Modulation (FM) synthesis - Modulating the frequency of waveforms with other waveforms in the audio range. At its simplest level it creates a very particular distinctive sound, however it is very complex to implement a versatile FM engine. A good example of a class FM synthesiser is the Yamaha DX7; the first commercially successful digital synthesiser.
- Wavetable synthesis - Similar to subtractive synthesis, but instead of using equations to generate the sound waves, it stores small samples of a single cycle of a waveform and plays back the stored sample over and over again. It was very popular in early digital synthesisers due to it’s advantages of taking up less memory and processing power. An example of this is the PPG wave 2.
- Granular synthesis - Manipulating very short samples of sound called grains, played back in unconventional ways. Great for creating soundscapes, textures, and effects. A good example of granular synthesis is the Collidoscope.
- Physical-Modelling synthesis - The process of using equations and algorithms to simulate real instruments or physical sources of sound. This type generally uses a very different set of parameters and controls compared to the other synthesis types. My personal favourite physical-modelling software synth is Apple's Sculpture.
Essential Building Blocks of Audio Synthesis
Below is a list of the four important building blocks needed for any decent sound synthesis engine of any synthesis type:
- Oscillators - used to create the raw sound source/waves/tones, and can come in many different wave shapes (e.g. sine, saw, square, noise)
- Filters - used to shape the timbre of the sound created by oscillators, with the most popular filter types being low-pass, high-pass, and band-pass. Important for subtractive synthesis.
- Envelopes - used to modulate parameters of the sound (most commonly the volume) in the time domain. Most envelopes are ADSR envelopes which provide control over 4 distinct time related parts of a sound - attack, decay, sustain, and release.
- Low Frequency Oscillators (LFOs) - used as source for creating rhythmic modulation, such as tremolo (by modulating the sounds volume), or vibrato (by modulating a sounds pitch).
On top of that you’ll find synthesisers will come with other components and controls such as effects (e.g. delay, reverb, chorus, flanger), sequencers, other modulation sources (e.g. key velocity, aftertouch, wheels/pedals/joysticks), but are not essential to the core of a synthesis engine.
Number of Voices
Other than synthesis type and essentially components, another main thing to consider in audio synthesis design is how many notes the synthesis engine can play simultaneously. There are most commonly two possible ‘modes’ here - polyphonic (multiple notes) or monophonic (a single note).
In a polyphonic system you then need to consider the number of voices, also called the polyphony value. A greater polyphony value allows bigger chords and textures to be played, however it increases the needed processing power. There are also different levels of polyphony - in a true polyphonic synthesis each voice/note will have it’s own oscillators, filter, envelopes, and LFOs; however some polyphonic systems are simplified so that, while multiple notes can be played simultaneously, every voice shares a single element such as a filter and/or LFO, which is more commonly known as a paraphonic synth. Polyphonic synthesisers usually have an option to put them into monophonic mode if desired.
Example flow charts of of monophonic, polyphonic, and paraphonic audio synthesis engines.
In these examples each voices has two oscillators.
Development of my Synthesis Engine Design
So far throughout this project my design ideas for the synthesis engine have changed quite a bit, and I’m expecting it to keep changing right up until the end. There are a number factors that have caused this, which will ultimately determine what my final synthesis engine design will be:
- The capabilities and power of the target hardware, the BeagleBone Black
- The capabilities of the synthesis library I’m using, most probably Maximilian
- The space on the toy piano enclosure for synth parameter controls
- The number of inputs on an Arduino Pro Mini that I can used for controlling these controls
- My knowledge and experience in implementing synthesis engines
Here are the main design changes that have happened so far, with reasons why:
- Originally I was planning on having a very complex synthesis engine with many modulation destinations, digital effects, and some quite advanced parameters; totalling to about 60 parameters/controls. However after experimenting with Maximilian on the BBB I found that I’m not going to have enough processing power to get it all working without audio glitches. Also, I’m not sure I’m going to have enough time or space to wire and attach 60 controls to the toy piano enclosure.
- I wanted to have 12 or 16 note polyphony, but testing Maximilian on the BBB seems to show that in order to have such high polyphony I would need to heavily simplify other parts of the synthesis engine, such as making it paraphonic instead of polyphonic.
- Originally I was just going to have a basic filter which could either be low-pass, band-pass, or high-pass. However after experimenting with Maximilian I found that its SVF (state-variable filter) offers more control over the sound and uses less processing power.
My Current Synthesis Engine Design
I have decided to base my synthesis engine on subtractive synthesis for a couple of reasons:
- It can create a relatively varied set of sounds without being too complex to implement or use
- It’s the synthesis type I have had most experience with, from the synths I help develop at Modal Electronics
Minimum set of Parameters
Here are the minimum set of components and parameters that I want to implement into my vintage toy synthesiser:
|Parameter Category||Parameter||Value Range||Panel Control||Description|
|Oscillators||Sine wave level||0-127||Potentiometer||Sets the level of a sine oscillator|
|Triangle wave level||0-127||Potentiometer||Sets the level of a triangle oscillator|
|Sawtooth wave level||0-127||Potentiometer||Sets the level of a sawtooth oscillator|
|Pulse wave level||0-127||Potentiometer||Sets the level of a pulse oscillator|
|Pulse amount||0-127||Potentiometer, centre-detented||Sets the pulse wave shape|
|Sub level||0-127||Potentiometer||Square wave 12 semitones down|
|State-Variable Filter||Frequency cutoff||0-127||Potentiometer||Sets the cutoff/centre frequency of the filter|
|Resonance||0-127||Potentiometer||Sets the resonance of the filter|
|Low-pass mix||0-127||Potentiometer||Sets the level of the low-pass mix|
|High-pass mix||0-127||Potentiometer||Sets the level of the high-pass mix|
|Band-pass mix||0-127||Potentiometer||Sets the level of the band-pass mix|
|Notch mix||0-127||Potentiometer||Sets the level of the notch mix|
|Amplitude Envelope||Attack||0-127||Potentiometer||Sets the time it takes for the amplitude to reach each its max value when a note is triggered|
|Decay||0-127||Potentiometer||Sets the time it takes for the amplitude to go from the max value to the sustain value|
|Sustain||0-127||Potentiometer||Sets the amplitude level that the sound/note stays at for it's duration until the note/key is released|
|Release||0-127||Potentiometer||Sets the time it takes for the amplitude to go from the sustain level to 0 after a note/key is released|
|Amount||0-127||Potentiometer||Sets the amount of envelope modulation on the amplitude. Can also act as a volume/gain control.|
|Filter Envelope||Attack||0-127||Potentiometer||Sets the time it takes for the filter cutoff to reach each its max value when a note is triggered|
|Decay||0-127||Potentiometer||Sets the time it takes for the filter cutoff to go from the max value to the sustain value|
|Sustain||0-127||Potentiometer||Sets the filter cutoff value that the sound/note stays at for it's duration until the note/key is released|
|Release||0-127||Potentiometer||Sets the time it takes for the filter cutoff to go from the sustain level to 0 after a note/key is released|
|LFO||Wave shape||Sine, triangle, sawtooth, square, random||Potentiometer, detented||Sets the shape of the LFO|
|Rate||0-127||Potentiometer||Sets how slow/fast the LFO goes|
|Depth||-64-+63||Potentiometer, centre-detented||Sets the depth of the LFO (Possibly not needed if each LFO mod destination has it's own depth controls)|
|Keys/Voices||Octave||-2-+2||Potentiometer, centre-detented||Sets the octave that the keyboard keys can play|
|Scale||Chromatic, Major, Minor, others||Potentiometer, detented||Sets the musical scale that the keyboards keys can play|
|Voice mode||Poly, mono||Toggle switch||Sets whether the synth is polyphonic or monophonic mode|
|Transpose||-6-+6||Potentiometer, centre-detented||Sets the semitone offset of the keyboard|
|Modulation Depths||Velocity to amplitude||-64-+63||Potentiometer, centre-detented||Sets the amount of applied keyboard velocity modulation for note amplitude|
|LFO to amplitude||-64-+63||Potentiometer, centre-detented||Sets the amount of LFO modulation for note amplitude|
|LFO to cutoff||-64-+63||Potentiometer, centre-detented||Sets the amount of LFO modulation for filter cutoff|
|LFO to resonance||-64-+63||Potentiometer, centre-detented||Sets the amount of LFO modulation for filter resonance|
|Aftertouch to cutoff||-64-+63||Potentiometer, centre-detented||Sets the amount of applied keyboard aftertouch modulation for filter cutoff|
|Aftertouch to LFO depth||-64-+63||Potentiometer, centre-detented||Sets the amount of applied keyboard aftertouch modulation for LFO depth|
|Effects||Distortion amount||0-127||Potentiometer||Sets the amount of distortion applied to the overall sound|
|Global||Vintage amount||0-127||Potentiometer||Unique to this synthesiser. Sets the amount of random voice/oscillator detuning; random filter cutoff value offsets; and random crackles/pops applied to the overall sound, essentially emulating an old/broken analogue synthesiser.|
|Volume||0-127||Potentiometer||Sets the system volume of the BBB. Not a 'patch' parameter like the rest of them.|
I want it to be true polyphonic synthesiser, so that I can use the poly aftertouch I have implemented into the keyboard as well as implement filter envelopes, both which need to be per note/voice, with a polyphony value of at least 4 voices. Therefore there would be one instance of the oscillators, filter, envelopes, and LFO for each voice; the rest of the components/parameters would be global to the overall/mixed sound.
A flow chart of my synthesis engine design
If I'm able to, based on the 6 factors above, there are a number of other parameters I would like to build into my synthesiser:
|Parameter Category||Parameter||Value Range||Panel Control||Description|
|Oscillators||Oscillator coarse tune||-24-+24||Potentiometer, centre-detented||Sets the coarse tune (in semitones) for each oscillator. There would be one instance of this parameter for each wave type.|
|Oscillator fine tune||-64-+63||Potentiometer, centre-detented||Sets the fine tune (in cents) for each oscillator. There would be one instance of this parameter for each wave type.|
|Noise level||0-127||Potentiometer||Sets the level of the noise sound source.|
|Double Mode||off/on||Toggle switch||If an oscillator has a 'note' value not set to 0, a second instance of that oscillator is created which plays at the root note, allowing two-note chords to be created.|
|Osc phase offset||0-127||Potentiometer||Sets the degree of offsets of phase for the set of oscillators.|
|Filter Envelope||Amount/Depth||-64-+63||Potentiometer, centre-detented||Sets the depth of the envelope modulation on the filter cutoff.|
|LFO||Single shot mode||off/on||Toggle switch||Sets whether the LFO only cycles once, acting more like an envelope|
|Delay||0-127||Potentiometer||Sets how long it takes for the LFO to start once a note is triggered|
|LFO2||-||-||-||A second LFO will all the same controls as the existing LFO1|
|Keys/Voices||Glide||0-127||Potentiometer||Sets the amount of glissando between notes|
|Voice size||1-4||Potentiometer, detented||Sets how many voices are played with each note|
|Voice spread||0-127||Potentiometer||If there is a voice size of above 1, this sets how detuned each voice in the stack is|
|Modulation Depths||Velocity to cutoff, resonance, LFO depth||-64-+63||Potentiometer, centre-detented||Sets the amount of applied keyboard velocity modulation for each destination. There would be one parameter for each destination.|
|LFO to filter mix||-64-+63||Potentiometer, centre-detented||Sets the amount of applied LFO modulation for each of the filter mix parameters. There would be one parameter for each of the filter mix parameters.|
|Aftertouch to resonance, LFO rate||-64-+63||Potentiometer, centre-detented||Sets the amount of applied keyboard aftertouch modulation for each destination. There would be one parameter for each destination.|
|LFO2 mod depths||-64-+63||Potentiometer, centre-detented||Various modulation destination depths for LFO2|
|Filter envelope depths||-64-+63||Potentiometer, centre-detented||Allow the filter envelope to also modulate other parameters, with individual depths for each destination. If implementing this then the proposed filter envelope depth control could actually just be a 'envelope->filter depth' control here, with the envelope just being called 'mod envelope' rather than specific to the filter.|
|Effects||Chorus level||0-127||Potentiometer||Sets the amount of chorus applied to the overall sound.|
|Reverb level||0-127||Potentiometer||Sets the amount of reverb applied to the overall sound.|
|Delay level||0-127||Potentiometer||Sets the amount of delay applied to the overall sound.|
|Delay time||0-127||Potentiometer||Sets the delay time of the delay effect|
|Distortion type||pre-filter, post-filter||Toggle Switch||Sets where in the signal chain that the distortion is applied.|
|Global||Vintage pitch amount||0-127||Potentiometer||Unique to this synthesiser. Sets the amount of random voice detuning, essentially emulating an old/broken analogue synthesiser. This would replace the single 'vintage amount' parameter.|
|Vintage cutoff amount||0-127||Potentiometer||Unique to this synthesiser. Sets the amount of random filter cutoff offsets, essentially emulating an old/broken analogue synthesiser. This would replace the single 'vintage amount' parameter.|
|Vintage crackle amount||0-127||Potentiometer||Unique to this synthesiser. Sets the amount of random crackles/pops applied to the overall sound, essentially emulating an old/broken analogue synthesiser.|
|Patch save and recall||-||Push buttons||A set of buttons that are used to save and load 'patches' - a set of parameter values|