Subtractive Synthesis
This is the second in a series of articles on how to use Sonic Pi for
sound design. Last month we looked at additive synthesis which we
discovered was the simple act of playing multiple sounds at the same
time to make a new combined sound. For example we could combine
different sounding synths or even the same synth at different pitches to
build a new complex sound from simple ingredients. This month weâll look
at a new technique commonly called subtractive synthesis which is
simply the act of taking an existing complex sound and removing parts of
it to create something new. This is a technique which is commonly
associated with the sound of analog synthesisers of the 1960s and 1970s
but also with the recent renaissance of modular analog synths through
popular standards such as Eurorack.
Despite this sounding like a particularly complicated and advanced
technique, Sonic Pi makes it surprisingly simple and easy - so letâs
dive right in.
Complex Source Signal
For a sound to work well with subtractive synthesis, it typically needs
to be fairly rich and interesting. This doesnât mean we need something
hugely complex - in fact, just a standard :square
or :saw
wave will
do:
synth :saw, note: :e2, release: 4
Notice that this sound is already pretty interesting and contains many
different frequencies above :e2
(the second E on a piano) which add to
create the timbre. If that didnât make much sense to you, try comparing
it with the :beep
:
synth :beep, note: :e2, release: 4
As the :beep
synth is just a sine wave, youâll hear a much purer tone
and only at :e2
and none of the high crispy/buzzy sounds which you
heard in the :saw
. Itâs this buzziness and variation from a pure sine
wave that we can play with when we use subtractive synthesis.
Filters
Once we have our raw source signal, the next step is to pass it through
a filter of some kind which will modify the sound by removing or
reducing parts of it. One of the most common filters used for
subtractive synthesis is something called a low pass filter. This will
allow all the low parts of the sound through but will reduce or remove
the higher parts. Sonic Pi has a powerful yet simple to use FX system
that includes a low pass filter, called :lpf
. Letâs play with it:
with_fx :lpf, cutoff: 100 do
synth :saw, note: :e2, release: 4
end
If you listen carefully youâll hear how some of that buzziness and
crispiness has been removed. In fact, all the frequencies in the sound
above note 100
have been reduced or removed and only the ones below are
still present in the sound. Try changing that cutoff:
point to
lower notes, say 70
and then 50
and compare the sounds.
Of course, the :lpf
isnât the only filter you can use to manipulate
the source signal. Another important FX is the high pass filter referred
to as :hpf
in Sonic Pi. This does the opposite to :lpf
in that it
lets the high parts of the sound through and cuts off the low parts.
with_fx :hpf, cutoff: 90 do
synth :saw, note: :e2, release: 4
end
Notice how this sounds much more buzzy and raspy now that all the low
frequency sounds have been removed. Play around with the cutoff value -
notice how lower values let more of the original bass parts of the
source signal through and higher values sound increasingly tinny and
quiet.
Low Pass Filter
The low pass filter is such an important part of every subtractive
synthesis toolkit that itâs worth taking a deeper look at how it
works. This diagram shows the same sound wave (the :prophet
synth)
with varying amounts of filtering. At the top, section A shows the audio
wave with no filtering. Notice how the wave form is very pointy and
contains lots of sharp edges. It is these hard, sharp angles that
produce the high crispy/buzzy parts of the sound. Section B shows the low
pass filter in action - notice how it is less pointy and more rounded
than the wave form above. This means that the sound will have fewer high
frequencies giving it a more mellow rounded feel. Section C shows the
low pass filter with a fairly low cutoff value - this means that even
more of the high frequencies have been removed from the signal resulting
in an even softer, rounder wave form. Finally, notice how the size of
the wave form, which represents the amplitude, decreases as we move from
A to C. Subtractive synthesis works by removing parts of the signal
which means that the overall amplitude is reduced as the amount of
filtering that is taking place increases.
Filter Modulation
So far weâve just produced fairly static sounds. In other words, the
sound doesnât change in any way for the entirety of its duration. Often
you might want some movement in the sound to give the timbre some
life. One way to achieve this is via filter modulation - changing the
filterâs options through time. Luckily Sonic Pi gives you powerful tools
to manipulate an FXâs opts through time. For example, you can set a
slide time to each modulatable opt to specify how long it should take
for the current value to linearly slide to the target value:
with_fx :lpf, cutoff: 50 do |fx|
control fx, cutoff_slide: 3, cutoff: 130
synth :prophet, note: :e2, sustain: 3.5
end
Letâs take a quick look at whatâs going on here. Firstly we start an :lpf
FX
block as normal with an initial cutoff:
of a low 50
. However, the first line
also finishes with the strange |fx|
at the end. This is an optional part of
the with_fx
syntax which allows you to directly name and control the running
FX synth. Line 2 does exactly this and controls the FX to set the
cutoff_slide:
opt to 3 and the new target cutoff:
to be 130
. The FX will
now start sliding the cutoff:
optâs value from 50
to 130
over a period of
3 beats. Finally we also trigger a source signal synth so we can hear the effect
of the modulated low pass filter.
Bringing it all together
This is just a very basic taster of whatâs possible when you use filters
to modify and change a source sound. Try playing with Sonic Piâs many
built-in FX to see what crazy sounds you can design. If your sound feels
too static, remember you can start modulating the options to create some
movement.
Letâs finish by designing a function which will play a new sound created
with subtractive synthesis. See if you can figure out whatâs going on
here - and for the advanced Sonic Pi readers out there - see if you can
work out why I wrapped everything inside a call to at
(please send
answers to @samaaron on Twitter).
define :subt_synth do |note, sus|
at do
with_fx :lpf, cutoff: 40, amp: 2 do |fx|
control fx, cutoff_slide: 6, cutoff: 100
synth :prophet, note: note, sustain: sus
end
with_fx :hpf, cutoff_slide: 0.01 do |fx|
synth :dsaw, note: note + 12, sustain: sus
(sus * 8).times do
control fx, cutoff: rrand(70, 110)
sleep 0.125
end
end
end
end
subt_synth :e1, 8
sleep 8
subt_synth :e1 - 4, 8