Created
June 10, 2014 21:33
-
-
Save xavriley/71b255775829b486249b to your computer and use it in GitHub Desktop.
Auto generating dubstep with Sonic Pi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# DUBSTEP | |
# Combines ideas from my other gists | |
current_bpm = 140.0 | |
use_bpm current_bpm | |
# WOBBLE BASS | |
define :wob do | |
use_synth :dsaw | |
lowcut = note(:E1) # ~ 40Hz | |
highcut = note(:G8) # ~ 3000Hz | |
note = [40, 41, 28, 28, 28, 27, 25, 35].choose | |
duration = 2.0 | |
bpm_scale = (60 / current_bpm).to_f | |
distort = 0.2 | |
# scale the note length based on current tempo | |
slide_duration = duration * bpm_scale | |
# Distortion helps give crunch | |
with_fx :distortion, distort: distort do | |
# rlpf means "Resonant low pass filter" | |
with_fx :rlpf, cutoff: lowcut, cutoff_slide: slide_duration do |c| | |
play note, attack: 0, sustain: duration, release: 0 | |
# 6/4 rhythms | |
wobble_time = [1, 6, 6, 2, 1, 2, 4, 8, 3, 3, 16].choose | |
c.ctl cutoff_slide: ((duration / wobble_time.to_f) / 2.0) | |
# Playing with the cutoff gives us the wobble! | |
# low cutoff -> high cutoff -> low cutoff | |
# few harmonics -> loads of harmonics -> few harmonics | |
# wwwwwww -> oooooooo -> wwwwwwww | |
# | |
# N.B. | |
# * The note is always the same length * | |
# * the wobble time just specifies how many * | |
# * 'wow's we fit in that space * | |
wobble_time.times do | |
c.ctl cutoff: highcut | |
sleep ((duration / wobble_time.to_f) / 2.0) | |
c.ctl cutoff: lowcut | |
sleep ((duration / wobble_time.to_f) / 2.0) | |
end | |
end | |
end | |
end | |
in_thread(name: :wob) do | |
with_fx :reverb, mix: 0.1 do | |
loop do | |
wob | |
end | |
end | |
end | |
# FUNKY DRUMS | |
ghost = -> { rrand(0.1, 0.2) } | |
normal = -> { rrand(0.5, 0.6) } | |
accent = -> { rrand(0.8, 0.9) } | |
swing_time = 0.05 | |
puts swing_time | |
define :play_kick do | |
sample :elec_hollow_kick | |
play :A1 | |
end | |
in_thread(name: :beat) do | |
loop do | |
# Two ways of modelling beats - with 0s and 1s OR with indexes | |
[1, 0, 0, 0, 0, 0, 1, 0].each.with_index(1) do |kick, index| | |
play_kick if kick == 1 | |
if [1,3,4,5,7,8].include? index | |
# Rand here can be really nice | |
sample :drum_cymbal_closed, amp: ((index % 2) == 0 ? ghost.call : normal.call ) if rand < 0.8 | |
end | |
with_fx :reverb, mix: 0.5 do | |
# Always have snare on 2 and 4 | |
if index == 5 | |
sample :drum_snare_hard, amp: normal.call | |
end | |
end | |
# And sometimes on the and of 4 | |
if (index % 2) == 0 | |
sample :drum_snare_soft, amp: ghost.call if rand < 0.05 | |
end | |
if(index % 2) == 0 | |
# offbeats need to be slightly late for swing | |
sleep (0.5 - swing_time) | |
else | |
sleep (0.5 + swing_time) | |
end | |
end | |
end | |
end | |
# SAMPLES | |
in_thread(name: :beat) do | |
loop do | |
with_fx :echo, rate: 1 do | |
with_fx :rlpf, cutoff: rrand(80, 120) do | |
sample [:ambi_haunted_hum, :ambi_piano].choose, rate: [0.25, 0.5, 1, 2].choose if rand > 0.1 | |
sleep 4 | |
end | |
end | |
end | |
end |
This is pretty awesome! How long did it take you to figure out how to write this?
Wow, just ran across and it still works on the latest Sonic Pi. I was tempted to try SoundCollider to emulate dubstep sounds but this is pretty much what I was looking for. So many tricks in here! 🤯
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Your drum and sample threads are both named :beat, so only one of them runs (the second one for me, not sure why). Renaming one to :beat2 allows both to be heard. Very cool!