Acid Bass
Itās impossible to look through the history of electronic dance music without seeing the enormous impact of the tiny Roland TB-303 synthesiser. Itās the secret sauce behind the original acid bass sound. Those classic squealing and squelching TB-303 bass riffs can be heard from the early Chicago House scene through to more recent electronic artists such as Plastikman, Squarepusher and Aphex Twin.
Interestingly, Roland never intended for the TB-303 to be used in dance music. It was originally created as a practice aid for guitarists. They imagined that people would program them to play bass lines to jam along to. Unfortunately there were a number of problems: they were a little fiddly to program, didnāt sound particularly good as a bass-guitar replacement and were pretty expensive to buy. Deciding to cut their losses, Roland stopped making them after 10,000 units were sold and after a number of years sitting on guitaristās shelves, they soon could be found in the windows of second hand shops. These lonely discarded TB-303s were waiting to be discovered by a new generation of experimenters who started using them in ways that Roland didnāt imagine to create new crazy sounds. Acid House was born.
Although getting your hands on an original TB-303 is not so easy you will be pleased to know that you can turn your Raspberry Pi into one using the power of Sonic Pi. Behold, fire up Sonic Pi and throw this code into an empty buffer and hit Run:
use_synth :tb303
play :e1
Instant acid bass! Letās play aroundā¦
Squelch that Bass
First, letās build a live arpeggiator to make things fun. In the last tutorial we looked at how riffs can just be a ring of notes that we tick through one after another, repeating when we get to the end. Letās create a live loop that does exactly that:
use_synth :tb303
live_loop :squelch do
n = (ring :e1, :e2, :e3).tick
play n, release: 0.125, cutoff: 100, res: 0.8, wave: 0
sleep 0.125
end
Take a look at each line.
- On the first line we set the default synth to be
tb303
with the use_synth
fn.
- On line two we create a live loop called
:squelch
which will just loop round and round.
- Line three is where we create our riff - a ring of notes (E in octaves 1, 2, and 3) which we simply tick through with
.tick
. We define n
to represent the current note in the riff. The equals sign just means to assign the value on the right to the name on the left. This will be different every time round the loop. The first time round, n
will be set to :e1
. The second time round it will be :e2
, followed by :e3
, and then back to :e1
, cycling round forever.
- Line four is where we actually trigger our
:tb303
synth. Weāre passing a few interesting opts here: release:
, cutoff:
, res:
and wave:
which weāll discuss below.
- Line five is our
sleep
- weāre asking the live loop to loop round every 0.125
s or 8 times a second at the default BPM of 60.
- Line six is the
end
to the live loop. This just tells Sonic Pi where the end of the live loop is.
Whilst youāre still figuring out whatās going on, type in the code above and hit the Run button. You should hear the :tb303
kick into action. Now, this is where the action is: letās start live coding.
Whilst the loop is still live, change the cutoff:
opt to 110
. Now hit the Run button again. You should hear the sound become a little harsher and more squelchy. Dial in 120
and hit run. Now 130
. Listen how higher cutoff values make it sound more piercing and intense. Finally, drop it down to 80
when you feel like a rest. Then repeat as many times as you want. Donāt worry, Iāll still be hereā¦
Another opt worth playing with is res:
. This controls the level of resonance of the filter. A high resonance is characteristic of acid bass sounds. We currently have our res:
set to 0.8
. Try cranking it up to 0.85
, then 0.9
, and finally 0.95
. You might find that a cutoff such as 110
or higher will make the differences easier to hear. Finally go crazy and dial in 0.999
for some insane sounds. At a res
this high, youāre hearing the cutoff filter resonate so much it starts to make sounds of its own!
Finally, for a big impact on the timbre try changing the wave:
opt to 1
. This is the choice of source oscillator. The default is 0
which is a sawtooth wave. 1
is a pulse wave and 2
is a triangle wave.
Of course, try different riffs by changing the notes in the ring or even picking notes from scales or chords. Have fun with your first acid bass synth.
Deconstructing the TB-303
The design of the original TB-303 is actually pretty simple. As you can see from the following diagram thereās only 4 core parts.
First is the oscillator wave - the raw ingredients of the sound. In this case we have a square wave. Next thereās the oscillatorās amplitude envelope which controls the amp of the square wave through time. These are accessed in Sonic Pi by the attack:
, decay:
, sustain:
and release:
opts along with their level counterparts. For more information read Section 2.4 āDuration with Envelopesā in the built-in tutorial. We then pass our enveloped square wave through a resonant low pass filter. This chops off the higher frequencies as well as having that nice resonance effect. Now this is where the fun starts. The cutoff value of this filter is also controlled by its own envelope! This means we have amazing control over the timbre of the sound by playing with both of these envelopes. Letās take a look:
use_synth :tb303
with_fx :reverb, room: 1 do
live_loop :space_scanner do
play :e1, cutoff: 100, release: 7, attack: 1, cutoff_attack: 4, cutoff_release: 4
sleep 8
end
end
For each standard envelope opt, thereās a cutoff_
equivalent opt in the :tb303
synth. So, to change the cutoff attack time we can use the cutoff_attack:
opt. Copy the code above into an empty buffer and hit Run. Youāll hear a crazy sound warble in and out. Now start to play. Try changing the cutoff_attack:
time to 1
and then 0.5
. Now try 8
.
Notice that Iāve passed everything through a :reverb
FX for extra atmosphere - try other FX to see what works!
Bringing it all together
Finally, hereās a piece I composed using the ideas in this tutorial. Copy it into an empty buffer, listen for a while and then start live coding your own changes. See what crazy sounds you can make with it! See you next timeā¦
use_synth :tb303
use_debug false
with_fx :reverb, room: 0.8 do
live_loop :space_scanner do
with_fx :slicer, phase: 0.25, amp: 1.5 do
co = (line 70, 130, steps: 8).tick
play :e1, cutoff: co, release: 7, attack: 1, cutoff_attack: 4, cutoff_release: 4
sleep 8
end
end
live_loop :squelch do
use_random_seed 3000
16.times do
n = (ring :e1, :e2, :e3).tick
play n, release: 0.125, cutoff: rrand(70, 130), res: 0.9, wave: 1, amp: 0.8
sleep 0.125
end
end
end