Close

Audio Synthesis Engine Design

A project log for Vintage Toy Synthesiser

A wooden toy piano converted into a standalone digital synthesiser.

liam-laceyLiam Lacey 08/31/2018 at 07:220 Comments

(Original post date: 28/01/16)

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.

Synthesis Types

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:

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:

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.

mono synthesis engine example

poly synthesis engine example

paraphonic synthesis engine example

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:

  1.   The capabilities and power of the target hardware, the BeagleBone Black
  2.   The capabilities of the synthesis library I’m using, most probably Maximilian
  3.   The space on the toy piano enclosure for synth parameter controls
  4.   The number of inputs on an Arduino Pro Mini that I can used for controlling these controls
  5.   My knowledge and experience in implementing synthesis engines
  6.   Time!

Here are the main design changes that have happened so far, with reasons why:

My Current Synthesis Engine Design

I have decided to base my synthesis engine on subtractive synthesis for a couple of reasons:

  1.   It can create a relatively varied set of sounds without being too complex to implement or use
  2.   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
OscillatorsSine wave level0-127PotentiometerSets the level of a sine oscillator
Triangle wave level0-127PotentiometerSets the level of a triangle oscillator
Sawtooth wave level0-127PotentiometerSets the level of a sawtooth oscillator
Pulse wave level0-127PotentiometerSets the level of a pulse oscillator
Pulse amount0-127Potentiometer, centre-detentedSets the pulse wave shape
Sub level0-127PotentiometerSquare wave 12 semitones down
State-Variable FilterFrequency cutoff0-127PotentiometerSets the cutoff/centre frequency of the filter
Resonance0-127PotentiometerSets the resonance of the filter
Low-pass mix0-127PotentiometerSets the level of the low-pass mix
High-pass mix0-127PotentiometerSets the level of the high-pass mix
Band-pass mix0-127PotentiometerSets the level of the band-pass mix
Notch mix0-127PotentiometerSets the level of the notch mix
Amplitude EnvelopeAttack0-127PotentiometerSets the time it takes for the amplitude to reach each its max value when a note is triggered
Decay0-127PotentiometerSets the time it takes for the amplitude to go from the max value to the sustain value
Sustain0-127PotentiometerSets the amplitude level that the sound/note stays at for it's duration until the note/key is released
Release0-127PotentiometerSets the time it takes for the amplitude to go from the sustain level to 0 after a note/key is released
Amount0-127PotentiometerSets the amount of envelope modulation on the amplitude. Can also act as a volume/gain control.
Filter EnvelopeAttack0-127PotentiometerSets the time it takes for the filter cutoff to reach each its max value when a note is triggered
Decay0-127PotentiometerSets the time it takes for the filter cutoff to go from the max value to the sustain value
Sustain0-127PotentiometerSets the filter cutoff value that the sound/note stays at for it's duration until the note/key is released
Release0-127PotentiometerSets the time it takes for the filter cutoff to go from the sustain level to 0 after a note/key is released
LFOWave shapeSine, triangle, sawtooth, square, randomPotentiometer, detentedSets the shape of the LFO
Rate0-127PotentiometerSets how slow/fast the LFO goes
Depth-64-+63Potentiometer, centre-detentedSets the depth of the LFO (Possibly not needed if each LFO mod destination has it's own depth controls)
Keys/VoicesOctave-2-+2Potentiometer, centre-detentedSets the octave that the keyboard keys can play
ScaleChromatic, Major, Minor, othersPotentiometer, detentedSets the musical scale that the keyboards keys can play
Voice modePoly, monoToggle switchSets whether the synth is polyphonic or monophonic mode
Transpose-6-+6Potentiometer, centre-detentedSets the semitone offset of the keyboard
Modulation DepthsVelocity to amplitude-64-+63Potentiometer, centre-detentedSets the amount of applied keyboard velocity modulation for note amplitude
LFO to amplitude-64-+63Potentiometer, centre-detentedSets the amount of LFO modulation for note amplitude
LFO to cutoff-64-+63Potentiometer, centre-detentedSets the amount of LFO modulation for filter cutoff
LFO to resonance-64-+63Potentiometer, centre-detentedSets the amount of LFO modulation for filter resonance
Aftertouch to cutoff-64-+63Potentiometer, centre-detentedSets the amount of applied keyboard aftertouch modulation for filter cutoff
Aftertouch to LFO depth-64-+63Potentiometer, centre-detentedSets the amount of applied keyboard aftertouch modulation for LFO depth
EffectsDistortion amount0-127PotentiometerSets the amount of distortion applied to the overall sound
GlobalVintage amount0-127PotentiometerUnique 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.
Volume0-127PotentiometerSets 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.

my synth engine flow chart

A flow chart of my synthesis engine design

Extended Parameters

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
OscillatorsOscillator coarse tune-24-+24Potentiometer, centre-detentedSets the coarse tune (in semitones) for each oscillator. There would be one instance of this parameter for each wave type.
Oscillator fine tune-64-+63Potentiometer, centre-detentedSets the fine tune (in cents) for each oscillator. There would be one instance of this parameter for each wave type.
Noise level0-127PotentiometerSets the level of the noise sound source.
Double Modeoff/onToggle switchIf 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 offset0-127PotentiometerSets the degree of offsets of phase for the set of oscillators.
Filter EnvelopeAmount/Depth-64-+63Potentiometer, centre-detentedSets the depth of the envelope modulation on the filter cutoff.
LFOSingle shot modeoff/onToggle switchSets whether the LFO only cycles once, acting more like an envelope
Delay0-127PotentiometerSets 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/VoicesGlide0-127PotentiometerSets the amount of glissando between notes
Voice size1-4Potentiometer, detentedSets how many voices are played with each note
Voice spread0-127PotentiometerIf there is a voice size of above 1, this sets how detuned each voice in the stack is
Modulation DepthsVelocity to cutoff, resonance, LFO depth-64-+63Potentiometer, centre-detentedSets the amount of applied keyboard velocity modulation for each destination. There would be one parameter for each destination.
LFO to filter mix-64-+63Potentiometer, centre-detentedSets 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-+63Potentiometer, centre-detentedSets the amount of applied keyboard aftertouch modulation for each destination. There would be one parameter for each destination.
LFO2 mod depths-64-+63Potentiometer, centre-detentedVarious modulation destination depths for LFO2
Filter envelope depths-64-+63Potentiometer, centre-detentedAllow 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.
EffectsChorus level0-127PotentiometerSets the amount of chorus applied to the overall sound.
Reverb level0-127PotentiometerSets the amount of reverb applied to the overall sound.
Delay level0-127PotentiometerSets the amount of delay applied to the overall sound.
Delay time0-127PotentiometerSets the delay time of the delay effect
Distortion typepre-filter, post-filterToggle SwitchSets where in the signal chain that the distortion is applied.
GlobalVintage pitch amount0-127PotentiometerUnique 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 amount0-127PotentiometerUnique 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 amount0-127PotentiometerUnique 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 buttonsA set of buttons that are used to save and load 'patches' - a set of parameter values

Discussions