Created
January 31, 2023 06:24
-
-
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
This file contains hidden or 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
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