Skip to content

Instantly share code, notes, and snippets.

@WindowDump
Created January 31, 2023 06:24
Show Gist options
  • Save WindowDump/3e00eb0c1985500956a8a65b250f6529 to your computer and use it in GitHub Desktop.
Save WindowDump/3e00eb0c1985500956a8a65b250f6529 to your computer and use it in GitHub Desktop.
Demo of a Sonic Pi track with a specific random melody and amen break slices
use_bpm 128
live_loop :set_chord do
chrds = []
chrds.append(degree(:i, :e2, :minor))
chrds.append(degree(:iv, :e2, :minor))
chrds.append(degree(:iii, :e2, :minor))
chrds.append(degree(:v, :e2, :minor))
chrds.append(degree(:i, :e2, :minor))
chrds.append(degree(:ii, :e2, :minor))
chrds.append(degree(:iv, :e2, :minor))
chrds.append(degree(:v, :e1, :minor))
set :chord, chrds.ring.tick
sleep 1.0
sync :heartbeat
end
live_loop :heartbeat, delay: 0.1 do
set :melody_surf, rrand_i(1337, 1344)
set :kicks, knit(8, 3, 7, 1).choose
set :amen_chaos, {bar1_clean: true}
##| set :amen_chaos, {seed: rrand_i(0, 1000), kick: true, full: true, slices: 16}
cue :bass_pad, {amp: 0.8, len: knit(8.0, 3, 7.0, 1).choose}
sleep 4.0
set :melody_surf, 4923
##| set :amen_chaos, {bar1_clean: true}
set :amen_chaos, {seed: rrand_i(0, 1000), full: false, bar: range(0, 3).tick(:amen_bar)}
sleep 4.0
end
live_loop :rand_surfer do
seed = sync :melody_surf
tick_reset(:skip_last)
use_random_seed seed
use_synth :dsaw
notes = scale(get[:chord], :minor_pentatonic, num_octaves: 2)
with_fx :reverb, amp: 0.5, mix: 0.3, damp: 0.6, room: 0.5 do
with_fx :echo, mix: 1.0, pre_mix: 0.5, phase: 0.75, decay: 4, max_phase: 4.0, reps: 16 do
play notes.choose, release: 0.2, cutoff: rrand(70, 120), detune: rrand(0, 0.2)
sleep 0.25 if knit(true, 15, false, 1).tick(:skip_last)
end
end
end
live_loop :trance_kick do
beats = sync :kicks
tick_reset(:skip_last)
tick_reset(:full)
with_fx :distortion, reps: beats, amp: 0.5, pre_amp: 1.5, distort: 0.5 do
sample :bd_ada, sustain: ring(1.0, 0.0).tick(:full), release: 0.1
sleep 1.0 if knit(true, beats - 1, false, 1).tick(:skip_last)
end
end
live_loop :bass_pad do
args = sync :bass_pad
len = args[:len] == nil ? 8.0 : args[:len]
use_synth :bass_foundation
use_synth_defaults attack: 0.5, decay: 0.25, sustain_level: 0.8, sustain: len - 1.75, release: 1.0, res: 0.75
play get[:chord] - 12, amp: args.fetch(:amp, 0.8), cutoff: get[:chord]
sleep len - 0.1
end
define :amen_bar1_clean_slices do
use_sample_defaults beat_stretch: 16, num_slices: 32
sample :loop_amen_full, slice: 0, finish: 0.8
sleep 0.5
sample :loop_amen_full, slice: 0, finish: 1.0
sleep 0.5
sample :loop_amen_full, slice: 2, finish: 1.0
sleep 0.5
sample :loop_amen_full, slice: 3, finish: 1.0
sleep 0.5
sample :loop_amen_full, slice: 0, finish: 0.8
sleep 0.5
sample :loop_amen_full, slice: 4, finish: 0.3
sleep 0.25
sample :loop_amen_full, slice: 4, finish: 0.5
sleep 0.25
sample :loop_amen_full, slice: 6, finish: 1.0
sleep 0.5
sample :loop_amen_full, slice: 7, finish: 1.0
sleep 0.4
end
define :play_amen_slices do |b, slices, rev|
use_sample_defaults beat_stretch: 16, num_slices: b
tick_reset(:skip_last)
tick_reset(:amn_slc)
(b / 4).times do
if rev.tick(:rev)
sample :loop_amen_full, slice: slices.tick(:amn_slc), start: rrand(0.75, 1.0), finish: 0
else
sample :loop_amen_full, slice: slices.tick(:amn_slc), finish: rrand(0.75, 1.0)
end
sleep knit(16.0 / b, b / 4 - 1, 0, 1).tick(:skip_last)
end
end
live_loop :random_amen do
args = sync :amen_chaos
use_random_seed args.fetch(:seed, rrand_i(0, 1000))
b = args.fetch(:slices, knit(16, 1, 32, 3, 64, 2).choose)
# randomize slices, allow dupes:
if args.fetch(:full, one_in(3))
if args.fetch(:kick, !one_in(3))
slices = ring(0) + range(1, b).repeat(2).pick(b-1)
else
slices = range(0, b).repeat(2).pick(b)
end
else # only get slices from one bar
bar = args.fetch(:bar, bar = range(0, 4).choose)
if args.fetch(:kick, one_in(2))
slices = ring(0) + range(bar + 1, bar * b/4 + b/4).repeat(2).pick(b-1)
else
slices = range(bar * b/4, bar * b/4 + b/4).repeat(2).pick(b)
end
end
# reverse some slices
if args.fetch(:rev, one_in(4))
rev = ring(false) + knit(false, 3, true, 1).repeat(b/4).pick(b-1)
else # don't reverse
rev = ring(false)
end
p = [0.25, 0.5].choose
with_fx :echo, amp: 0.5, mix: 1.0, pre_mix: 0.28, phase: 0.1875, decay: 1, max_phase: 2.0 do
with_fx :slicer, phase: p, wave: 0, mix: rrand(0.5, 0.8) do
with_fx :bitcrusher, sample_rate: 11025, bits: 8 do
if args.fetch(:bar1_clean, false)
amen_bar1_clean_slices
else
play_amen_slices b, slices, rev
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment