My experiments with Sonic Pi: 1. No Surprises.
The purpose of this experiment.
To see how easy it was to arrange No Surprises by Radiohead on Sonic Pi.
Every exploration has to start somewhere and my exploration of Sonic Pi has started with what I would classify as a successful attempt at coding a cover of No Surprises. Why No Surprises? Because I like it. And Sonic Pi’s default keys reminded me of the keys on the intro of the song.
The track itself
Structurally, No Surprises is fairly straightforward. Of course, there’s a lot of nuance when it’s performed on ‘real instruments’, but at it’s core, it’s an intro that leads to a long verse that leads to a chorus, then a shorter verse that leads to the second chorus, then a bridge, followed by a final verse and chorus. Musically, therefore, there were only these parts to consider while writing the code:
the intro
the verse
the chorus
the bridge
Ideally, I planned to write a function for each of these, then just call them in order, but since these are basically my first few hours writing on Sonic Pi (and my first few hours writing any non SQL, no web development code in several years), I ended up writing some filthy mish-mash of smaller functions. But it’s functional and is pasted at the end of this.
Conclusions
The purpose of Sonic Pi isn’t to cover Radiohead. It would be much easier to do that with on Logic Pro or any other digital audio workstation (DAW). Besides, what is MIDI but a no-code layer on top of code similar to the sort that I’m writing here. As far as I’m concerned, I’m most excited about using Sonic Pi to do things I wouldn’t be able to easily do with an acoustic guitar, a mic, a MIDI keyboard and a DAW.
I can think of certain things that are likely to be easier to accomplish: odd grooves, automating effects, building strange progressions, playing notes that aren’t present on standard keyboards (like what’s between these keys? 🎹) The possibilities seem, well not endless, but finite but large.
That said, now that I have the basics + arrangement out of the way, step 2 is composition.
The (highly highly inefficient) code.
#the define command is to define functions; function names self-explanatory hopefully
define :main_melody do
3.times do
play_pattern_timed [:e5, :g4, :c5, :g4], 0.5
end
play_pattern_timed chord(:f4, :m6), 0.5
end
define :verse_melody do
2.times do
play_pattern_timed [:e5, :g4, :c5, :g4], 0.5
end
end
define :verse_melody_3 do
2.times do
play_pattern_timed [:f5, :a4, :c5, :a4], 0.5
end
end
define :verse_melody_4 do
2.times do
play_pattern_timed [:b4, :g4, :d4, :g4], 0.5
end
end
define :intro_bass do
play :c3, release: 1
sleep 2
play :c3, release: 0.5
sleep 0.5
play :c3, release: 1
sleep 1.5
play :c3, release: 1
sleep 2
play :f3, release: 1
sleep 0.75
play :f3, release: 1
sleep 0.75
play :e3, release: 1
sleep 0.5
end
#intro rhythm function
define :intro_rhythm do
6.times do
play chord(:c4,:major)
sleep 1
end
2.times do
play chord(:f3,:minor)
sleep 1
end
end
define :verse_bass_1 do
4.times do
play :c3
sleep 2
end
end
define :verse_rhythm_1 do
8. times do
play chord(:c4,:major)
sleep 1
end
end
define :verse_bass_2 do
4.times do
play :a2
sleep 2
end
end
define :verse_rhythm_2 do
8.times do
play chord(:a3,:minor)
sleep 1
end
end
define :verse_bass_3 do
2.times do
play :f2
sleep 2
end
end
define :verse_rhythm_3 do
4.times do
play chord(:f3,:major)
sleep 1
end
end
define :verse_bass_4 do
2.times do
play :g2
sleep 2
end
end
define :verse_rhythm_4 do
4.times do
play chord(:g3,:major)
sleep 1
end
end
define :bridge_melody do
play :b4, release: 1
sleep 0.5
play :g4, release: 1
sleep 0.5
play :b4, release: 1
sleep 0.75
play :g4, release: 1
sleep 0.25
play :c5, release: 1
sleep 0.25
play :b4, release: 1
sleep 0.25
play :g4, release: 1
sleep 0.5
play :b4, release: 1
sleep 0.75
play :g4, release: 1
sleep 0.25
play_pattern_timed chord(:f4, :m6), 0.5
play :ds5, release: 1
sleep 0.5
play :d5, release: 1
sleep 0.5
play :c5, release: 1
sleep 0.5
play :g4, release: 1
sleep 0.5
end
define :bridge_bass do
4.times do
play :g2
sleep 1
end
4.times do
play :f2
sleep 1
end
end
define :bridge_rhythm do
4.times do
play chord(:g3,:major)
sleep 1
end
4.times do
play chord(:f3,:minor)
sleep 1
end
end
#intro
2.times do
main_melody
end
in_thread do
2.times do
main_melody
end
end
in_thread do
2.times do
intro_bass
end
end
2.times do
intro_rhythm
end
#verse 1, part 1
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_1
end
verse_rhythm_1
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_2
end
verse_rhythm_2
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
main_melody
end
in_thread do
intro_bass
end
intro_rhythm
#verse 1, part 2
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_1
end
verse_rhythm_1
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_2
end
verse_rhythm_2
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
main_melody
end
in_thread do
intro_bass
end
intro_rhythm
#verse 1, part 3
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_1
end
verse_rhythm_1
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_2
end
verse_rhythm_2
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
2.times do
main_melody
end
in_thread do
2.times do
verse_melody
end
end
#verse & chorus 3
verse_bass_1
in_thread do
2.times do
verse_melody
end
end
verse_bass_2
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
main_melody
end
in_thread do
intro_bass
end
intro_rhythm
#bridge
in_thread do
bridge_melody
end
in_thread do
bridge_rhythm
end
bridge_bass
in_thread do
bridge_melody
end
in_thread do
bridge_rhythm
end
bridge_bass
in_thread do
bridge_melody
end
in_thread do
bridge_rhythm
end
bridge_bass
#verse & chorus 3
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_1
end
verse_rhythm_1
in_thread do
2.times do
verse_melody
end
end
in_thread do
verse_bass_2
end
verse_rhythm_2
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
in_thread do
verse_melody_3
end
in_thread do
verse_bass_3
end
verse_rhythm_3
in_thread do
verse_melody_4
end
in_thread do
verse_bass_4
end
verse_rhythm_4
main_melody
play chord(:c4,:major)

Home is a ghost of our own creation: the cave – its lowly ancestor – recreated from some lost memory. Our predators are now nebulous, our prey has come to be served on china. Is it any surprise that our idea of home has become just as nebulous? Is it any wonder that home is no longer just somewhere to lay down our weapons, lick our wounds, share a quiet dinner with family?