Skip to content

Instantly share code, notes, and snippets.

@mbutz
Last active July 21, 2020 06:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mbutz/e3d007b1d358435afcc3154ba990cdae to your computer and use it in GitHub Desktop.
Save mbutz/e3d007b1d358435afcc3154ba990cdae to your computer and use it in GitHub Desktop.
JAM, a tune made with Sonic Pi
# From the series R(modelling) E(lectronica) C(lassics) comes this @Sonic_Pi piece called "JAM":
# A trimmed remix of a nice mellow tune by the rather unknown German Electronica Duo
# called 'LEM Productions' (arguably a 'classic' - but for me it is): https://soundcloud.com/mbutz/jam
# Made with Sonic Pi (loops pre-coded, mixing live-coded) using edited samples from
# Sonatina Symphonic Orchestra (http://sso.mattiaswestlund.net/) available under CC Sampling Plus 1.0
use_bpm 120
set_volume! 1
live_loop :timer do
sleep 0.25
end
live_loop :bar, sync: :timer do
#stop
#sample :elec_beep, amp: 0.25
sleep 4
end
live_loop :phrase do
sync :bar
sleep 16
end
# Mixer ----------------------------------------------------------------------------
run_kick = 0
# 1 = thin; 2 double kick; 3 = four-on-the-floor
kick_ptn_choice = 1
run_hihat_base = 0
run_hihat_support = 0
run_snare = 0
run_amen = 0
run_bass_low = 0
run_bass_hi = 0
run_echo_samples = 0
run_chords = 0
run_violin = 0
echo_violin = 0
piano = 1
# -------------- Kick ----------------------------------------------------------
if kick_ptn_choice == 1
kick_ptn = (ring 1.25, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1.25, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0)
elsif kick_ptn_choice == 2
kick_ptn = (ring 1.25, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.25, 1, 0, 0, 1, 0, 0, 1.25, 0, 0, 0, 0, 0, 0, 1, 0.25, 0.25, 1, 0, 0, 1, 0, 0)
elsif kick_ptn_choice == 3
kick_ptn = (ring 1.5, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.5, 1, 0, 0, 0, 1.5, 0, 0, 0, 1, 0, 0, 0, 1, 0.25, 0.25, 0, 1, 0, 0.75, 0.5)
end
live_loop :kick, sync: :phrase do
stop if run_kick == 0
if kick_ptn.tick > 0
sample :bd_fat, amp: kick_ptn.look
end
sleep 0.25
end
# -------------- Hihat (base) ------------------------------------------------
live_loop :hihat_base, sync: :phrase do
stop if run_hihat_base == 0
with_synth :cnoise do
with_synth_defaults release: 0.085, amp: 1, pan: 1 do
with_fx :hpf, cutoff: 120 do
play :c
end
end
end
sleep 0.25
end
# -------------- Hihat (support) ---------------------------------------------
live_loop :hihat_support, sync: :phrase do
stop if run_hihat_support == 0
if spread([15, 9, 5].choose, 16).reverse.tick
with_synth :cnoise do
with_synth_defaults release: 0.075, amp: 0.5, pan: -1 do
with_fx :hpf, cutoff: 110 do
play :c
end
end
end
end
sleep 0.25
end
# -------------- Snare -------------------------------------------------------
snare_ptn_a = (ring \
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0,
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0,
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0,
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 1, 0.75, 0, 0.5, 0.25)
snare_ptn_b = (ring \
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0,
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0,
0, 0, 0, 0, 1.5, 0, 0, 0, 0, 0, 0, 0, 1.5, 0, 0, 0,
0, 0, 0, 0, 1.5, 1, 0, 1, 0, 0.75, 0, 1.5, 0.75, 0, 1.5, 1)
snare_ptn = snare_ptn_a + snare_ptn_b
snare_master_vol = 0.4
snare_master_vol = 1.25
live_loop :snare, sync: :phrase do
stop if run_snare == 0
if snare_ptn.tick > 0
with_fx :reverb, room: 0.5, mix: 0.25 do
with_fx :bpf, centre: 80, res: 0.75, mix: 0.5 do
sample :drum_snare_soft, rate: 1.37, amp: snare_ptn.look * snare_master_vol
end
end
end
sleep 0.25
end
# -------------- Sliced Amen---------------------------------------------------
use_random_seed 6
live_loop :amen, sync: :phrase do
stop if run_amen == 0
with_fx :slicer, phase: [0.25, 0.75].choose, amp_min: 0, wave: 3, invert_wave: 0, smooth: 0, mix: 1 do
with_fx :slicer, phase: [0.25].choose, amp_min: 0.0, wave: 0, invert_wave: 0, smooth: 0, mix: 1 do
with_fx :slicer, phase: [0.25, 0.75].choose, amp_min: 0.0, wave: 0, invert_wave: 0, smooth: 0, mix: 1 do
with_fx :reverb, room: 0.5, mix: 1 do
sample :loop_amen, beat_stretch: 4, amp: 1.75
end
end
end
end
sleep 4
end
# -------------- Echoed Samples ------------------------------------------------
phrase_len = 3 # = 32 bars
cycle_len = phrase_len * 4 # = 8 bars
use_random_seed 4
use_random_seed 1965
live_loop :echo_samples, sync: :phrase do
stop if run_echo_samples == 0
mod = tick % phrase_len + 1
if look % cycle_len + 1 <= phrase_len then
glass_rates = [0.8, 1]
drone_rates = [0.975]
sl_1 = [0.5]
sl_2 = [0.25]
sl_3 = [0.25, 0.25]
elsif look % cycle_len + 1 <= phrase_len * 2 then
glass_rates = [1.075, 1.345]
drone_rates = [1.115, 1.95]
sl_1 = [0.25, 0.5]
sl_2 = [0.75]
sl_3 = [0.75]
elsif look % cycle_len + 1 <= phrase_len * 3 then
glass_rates = [0.8, 1.2, 1.345]
drone_rates = [2.23, 2.95]
sl_1 = [0.5]
sl_2 = [0.25]
sl_3 = [0.75]
elsif look % cycle_len + 1 <= phrase_len * 4 then
glass_rates = [1.2, 1.6]
drone_rates = [0.975, 3.35, 4.5]
sl_1 = [0.25, 0.5]
sl_2 = [0.25, 0.75]
sl_3 = [0.25, 0.25, 0.5, 0.5, 0.75]
end
with_fx :slicer, phase: sl_1.choose, amp_min: 0, wave: 3, invert_wave: 0, smooth: 0, mix: 1 do
with_fx :slicer, phase: sl_2.choose, amp_min: 0.0, wave: 0, invert_wave: 0, smooth: 0, mix: 1 do
with_fx :slicer, phase: sl_3.choose, amp_min: 0.0, wave: 0, invert_wave: 0, smooth: 0, mix: 1 do
with_fx :echo, phase: 0.5, decay: 2, mix: 1 do
sample :ambi_glass_rub, rate: glass_rates.choose, pan: [0.75, -0.25].choose, amp: 0.25
sample :ambi_drone, rate: drone_rates.choose, pan: [-0.75, 0.25].choose, amp: 0.5
end
end
end
end
sleep 4
end
# -------------- Bass line low ---------------------------------------------
bassline_low_a = (ring \
:a2,:r,:e2,:e2,:r,:r,:r,:e2,
:r,:r,:e2,:r,:r,:a2,:a2,:r,
:r,:g2,:r,:d2,:d2,:r,:r,:r,
:d2,:r,:r,:d2,:r,:r,:g2,:g2,
:fs2,:r,:d2,:d2,:r,:r,:r,:d2,
:r,:r,:fs2,:r,:r,:fs2,:fs2,:r,
:g2,:r,:d2,:d2,:r,:r,:r,:d2,
:r,:r,:d2,:r,:r,:g2,:g2,:r)
bassline_low_b = (ring \
:a2,:r,:e2,:e2,:r,:r,:r,:e2,
:r,:r,:e2,:r,:r,:a2,:a2,:r,
:r,:g2,:r,:d2,:d2,:r,:r,:r,
:d2,:r,:r,:d2,:r,:r,:g2,:g2,
:d2,:r,:r,:r,:r,:r,:r,:a2,
:r,:r,:d2,:r,:r,:d2,:d2,:r,
:c2,:r,:g2,:g2,:r,:r,:r,:g2,
:r,:r,:g2,:r,:r,:c2,:c2,:r)
live_loop :bass_low, sync: :phrase do
stop if run_bass_low == 0
use_synth :fm
use_synth_defaults amp: 1.5, attack: 0, sustain: 0, release: 0.25, depth: 0.5, divisor: 2, pan: -0.75
with_fx :band_eq, freq: 80, res: 0.25, db: 2 do
#with_fx :octaver, mix: 0.5, amp: 0.5, super_amp: 0.5, sub_amp: 1, subsub_amp: 0.5 do
play_pattern_timed bassline_low_a, 0.25
play_pattern_timed bassline_low_b, 0.25
#end
end
end
# -------------- Bass line high --------------------------------------------
bassline_hi_a = (ring \
:r,:a3,:r,:r,:r,:r,:e3,:r,
:r,:a3,:r,:r,:a3,:r,:r,:r,
:r,:r,:g3,:r,:r,:r,:r,:g3,
:r,:r,:g3,:r,:r,:g3,:r,:r,
:r,:fs3,:r,:r,:r,:r,:d3,:r,
:r,:fs3,:r,:r,:fs3,:r,:r,:r,
:r,:g3,:r,:r,:r,:r,:d3,:r,
:r,:g3,:r,:r,:g3,:r,:r,:r)
bassline_hi_b = (ring \
:r,:a3,:r,:r,:r,:r,:e3,:r,
:r,:a3,:r,:r,:a3,:r,:r,:r,
:r,:r,:g3,:r,:r,:r,:r,:g3,
:r,:r,:g3,:r,:r,:g3,:r,:r,
:r,:d3,:a3,:a3,:r,:r,:a3,:r,
:r,:d3,:r,:r,:d3,:r,:r,:r,
:r,:c3,:r,:r,:r,:r,:g3,:r,
:r,:c3,:r,:r,:c3,:r,:r,:r)
bassline_hi_c = (ring \
:r,[:a3,:e4],:r,:r,:r,:r,[:e3,:a4],:r,
:r,[:a3,:e4],:r,:r,[:a3,:e4],:r,:r,:r,
:r,:r,[:g3,:b4],:r,:r,:r,:r,[:g3,:g4],
:r,:r,[:g3,:d4],:r,:r,[:g3,:d4],:r,:r,
:r,[:fs3,:d3],:a3,:a3,:r,:r,[:d3,:fs3],:r,
:r,[:fs4,:d3],:r,:r,[:fs4,:d3],:r,:r,:r,
:r,[:e4,:c3],:r,:r,:r,:r,[:d3,:fs4],:r,
:r,[:e4,:c3],:r,:r,[:e4,:c3],:r,:r,:r)
live_loop :bass_hi, sync: :phrase do
stop if run_bass_hi == 0
use_synth :fm
use_synth_defaults amp: 1, attack: 0, sustain: 0, release: 0.25, depth: 0.5, divisor: 1, pan: 0.75
play_pattern_timed bassline_hi_a, 0.25
play_pattern_timed bassline_hi_b, 0.25
play_pattern_timed bassline_hi_a, 0.25
play_pattern_timed bassline_hi_b, 0.25
play_pattern_timed bassline_hi_c, 0.25
play_pattern_timed bassline_hi_c, 0.25
end
# -------------- Chords ----------------------------------------------------
c1 = [:c4, :e4, :g4, :c5, :g5, :g5]
c2 = [:d4, :g4, :d5, :g5, :g5]
c3 = [:fs4, :g4, :a4, :fs5]
c4 = [:c4, :e4, :a4, :d5, :g5, :g5]
live_loop :chords, sync: :phrase do
stop if run_chords == 0
if piano == 1
use_synth :piano
use_synth_defaults amp: 3, stero_width: 0.75, release: 0.5
ctf = 60
elsif
use_synth :fm
use_synth_defaults amp: 0.5, attack: 0.5, sustain: 0.5, release: 2, depth: 0, divisor: 0.025
ctf = 40
end
with_fx :band_eq, freq: hz_to_midi(500), res: 0.25, db: -10 do
with_fx :hpf, cutoff: ctf do
with_fx :reverb, room: 0.75, mix: 0.5 do
if piano == 1
play c1
sleep 4
play c2
sleep 4
play c3
sleep 2.5
play c3, release: 0.25
sleep 1.5
play c4
sleep 3.25
play c4, release: 0.25
sleep 0.75
elsif
play c1
sleep 4
play c2
sleep 4
play c3
sleep 4
play c4
sleep 4
end
end
end
end
end
# -------------- Violins --------------------------------------------------
path = "/path/to/samples/"
define :play_violin do | n, a, s, r |
if n == :v_g3
sample "#{path}g3.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_gs3 or n == :v_ab3
sample "#{path}g3.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_a3
sample "#{path}a#3.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_as3 or n == :v_bb3
sample "#{path}a#3.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_b3
sample "#{path}a#3.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_c4
sample "#{path}c#4.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_cs4 or n == :v_db4
sample "#{path}c#4.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_d4
sample "#{path}c#4.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_ds4 or n == :v_eb4
sample "#{path}e4.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_e4
sample "#{path}e4.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_f4
sample "#{path}e4.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_fs4 or n == :v_gb4
sample "#{path}g4.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_g4
sample "#{path}g4.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_gs4 or n == :v_ab4
sample "#{path}g4.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_a4
sample "#{path}a#4.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_as4 or n == :v_bb4
sample "#{path}a#4.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_b4
sample "#{path}a#4.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_c5
sample "#{path}c#5.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_cs5 or n == :v_db5
sample "#{path}c#5.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_d5
sample "#{path}c#5.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_ds5 or n == :v_eb5
sample "#{path}e5.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_e5
sample "#{path}e5.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_f5
sample "#{path}e5.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_fs5 or n == :v_gb5
sample "#{path}g5.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_g5
sample "#{path}g5.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_gs5 or n == :v_ab5
sample "#{path}g5.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_a5
sample "#{path}a#5.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_as5 or n == :v_bb5
sample "#{path}a#5.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_b5
sample "#{path}a#5.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_c6
sample "#{path}c#6.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_cs6 or n == :v_db6
sample "#{path}c#6.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_d6
sample "#{path}c#6.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_ds6 or n == :v_eb6
sample "#{path}e6.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_e6
sample "#{path}e6.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_f6
sample "#{path}e6.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_fs6 or n == :v_gb6
sample "#{path}g6.wav", rate: 0.94, attack: a, sustain: s, release: r
elsif n == :v_g6
sample "#{path}g6.wav", rate: 1, attack: a, sustain: s, release: r
elsif n == :v_gs6 or n == :v_ab6
sample "#{path}g6.wav", rate: 1.06, attack: a, sustain: s, release: r
elsif n == :v_a6
sample "#{path}g6.wav", rate: 1.12, attack: a, sustain: s, release: r
end
end
violin_sleep = 2
violin_vol = (range 0.025, 1, step: 0.0125).ramp
# violin_vol = (ring 1) # suspend blend for testing
phrase_len = 8 # = 4 loop cycles = 8 beats = 2 * 4/4 bars
cycle_len = phrase_len * 4 # = 8 bars
live_loop :violin, sync: :phrase do
stop if run_violin == 0
vol = violin_vol.tick
if look % cycle_len + 1 <= phrase_len * 1 then
s = (ring \
[:v_a4, 0.15, 0.75, 1],
[:v_b4, 0.15, 0.75, 1],
[:v_c5, 0.15, 0.75, 1],
[:v_e5, 0.15, 0.75, 1],
[:v_a5, 0.15, 0.75, 1.5],
[:v_g5, 0.15, 0.75, 1],
[:v_fs5, 0.15, 0.75, 1],
[:v_c5, 0.15, 0.75, 0.5])
elsif look % cycle_len + 1 <= phrase_len * 2 then
s = (ring \
[:v_a4, 0.15, 0.75, 1],
[:v_b4, 0.15, 0.75, 1],
[:v_c5, 0.15, 0.75, 1],
[:v_e5, 0.15, 0.75, 1],
[:v_a5, 0.15, 0.75, 1.5],
[:v_c6, 0.15, 0.75, 1],
[:v_d6, 0.15, 0.75, 1],
[:v_b5, 0.15, 0.75, 0.5])
elsif look % cycle_len + 1 <= phrase_len * 3 then
s = (ring \
[:v_a5, 0.15, 0.75, 1],
[:v_b5, 0.15, 0.75, 1],
[:v_c6, 0.15, 0.75, 1],
[:v_e6, 0.15, 0.75, 1],
[:v_a6, 0.15, 0.75, 1.5],
[:v_g6, 0.15, 0.75, 1],
[:v_fs6, 0.15, 0.75, 1],
[:v_c6, 0.15, 0.75, 0.5])
elsif look % cycle_len + 1 <= phrase_len * 4 then
s = (ring \
[:v_a5, 0.15, 0.75, 1],
[:v_b5, 0.15, 0.75, 1],
[:v_c6, 0.15, 0.75, 1],
[:v_e6, 0.15, 0.75, 1],
[:v_a6, 0.15, 0.75, 1.5],
[:v_fs6, 0.15, 0.75, 1],
[:v_d6, 0.15, 0.75, 1],
[:v_c6, 0.15, 0.75, 0.5])
end
with_fx :level, amp: 0.2 * vol do
with_fx :echo, phase: 4, decay: 6, mix: echo_violin do
play_violin s.look[0], s.look[1], s.look[2], s.look[3]
sleep violin_sleep
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment