Last active
July 21, 2020 06:08
-
-
Save mbutz/e3d007b1d358435afcc3154ba990cdae to your computer and use it in GitHub Desktop.
JAM, a tune made 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
# 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