This was an attempt to create something which doesn’t have to be ‘music’, but at least ‘interesting’ to listen to for a few minutes. Randomising whilst avoiding total cacophony is hard
use_random_seed 17
notes = [:a, :b, :c, :d, :e, :f, :g]
scales = [:minor, :major, :m6, :diminished]
chords = [(chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose)]
pat = (ring chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose)
x = 0
panner1 = (ring -1, -0.8, -0.6, -0.4, -0.2, 0, 0, 0, 0.2, 0.4, 0.6, 0.8, 1, 1, 1, 0.8, 0.6, 0.4, 0.2, 0, 0, 0, -0.2, -0.4, -0.6, -0.8, -1, -1)
rater1 = (ring 2.75, 2.7, 2.65, 2.6, 2.55, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 2.9, 2.85, 2.8)
rater2 = (ring 0.5, 0.45, 0.4, 0.35)
releaser1 = [0.1, 0.125, 0.15, 0.15, 0.15, 0.15, 0.175, 0.2]
attacker1 = (ring 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.10, 0.09, 0.08, 0.07, 0.06, 0.05, 0.04, 0.03, 0.02)
amper1 = (ring 0.5, 0.55, 0.6, 0.65)
sleep 0.8
in_thread(name: :beeper) do
live_loop :beeper1 do
if one_in 5 then
synthMem = "tri"
use_synth :tri
i = 1.2
min = 0.015
else
if one_in 5 then
synthMem = "dull_bell"
use_synth :dull_bell
i = 0.8
min = 0.01
else
synthMem = "beep"
use_synth :beep
i = 1.8
min = 0.02
end
end
sync :startbeeper
puts "startbeeper1: ", synthMem
32.times do
play pat.look, amp: i, attack: attacker1.tick, release: releaser1.choose
i -= min
i = 0 if i < 0
sleep 0.25
end
sleep 1
if one_in 2 then
16.times do
play pat.look, amp: i, attack: attacker1.tick * 2, release: releaser1.choose * 2
i -= min
i = 0 if i < 0
sleep 0.2
if one_in 2 then
play pat.look, amp: i, attack: attacker1.tick * 2, release: releaser1.choose * 2
end
sleep 0.3
end
else
sleep 16 * 0.5
end
sleep 1
32.times do
play pat.look, amp: i, attack: attacker1.tick, release: releaser1.choose
i -= min
i = 0 if i < 0
sleep 0.25
end
puts "new chords, new pat"
chords = [(chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose), (chord notes.choose, scales.choose)]
pat = (ring chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose, chords.choose)
end
end
in_thread(name: :bass) do
sync :startbass1
puts "started bass1"
live_loop :bass1 do
sample :bd_boom, amp: 2, rate: 1.75
sleep 4
if one_in 64 then
puts"stopped bass1"
sync :restartbass1
puts"restarted bass1"
end
end
sync :startbass2
puts "startbass2"
live_loop :bass2 do
sample :bd_klub, amp: 3, rate: 0.8
sleep 0.5
if one_in 128 then
puts"stopped bass2"
cue :bass2alt
sync :restartbass2
puts"restarted bass2"
end
end
live_loop :bass2alt do
sync :bass2alt
puts "started bass2alt"
8.times do
sample :bd_klub, amp: 2.8, rate: 0.6
sleep 0.25
end
end
sync :startbass3
puts "startbass3"
live_loop :bass3 do
sample :bd_pure, amp: 3.5, rate: rater1.look(:rate) - 1.8
sleep 0.125
if one_in 64 then
puts"stopped bass3"
cue :ambi2
sync :restartbass3
puts"restarted bass3"
end
end
end
in_thread(name: :slowAmbi) do
live_loop :slowAmbi do
use_synth :hollow
sync :slowAmbi
puts "slowAmbi"
2.times do
play pat.tick, amp: 3, attack: 0.05, release: 7
sleep 8
end
end
live_loop :ambi2 do
use_synth :dark_ambience
sync :ambi2
puts "ambi2"
2.times do
sleep 2
play pat.look, amp: 2.5, attack: 3, release: 7
sleep 12
end
end
end
in_thread(name: :fastTicker) do
live_loop :fastTicker do
x += 1
if one_in 4 then
puts "elec_triangle - blip"
amp = 2.8
32.times do
sample :elec_triangle, amp: amp, rate: rater1.tick(:rate), pan: panner1.tick(:pan)
amp -= 0.05
amp = 2.8 if amp < 0
if one_in 8 then
sleep 0.1
sample :elec_filt_snare, amp: amp / 4, rate: rater1.look(:rate) / 9, pan: panner1.tick
sleep 0.15
else
sleep 0.25
end
end
else
if one_in 4 then
puts "elec_soft_kick"
64.times do
sample :elec_soft_kick, amp: 2, rate: rater1.tick(:rate) - 1.8, pan: panner1.tick(:pan)
sleep 0.25
end
else
if one_in 4 then
puts "elec_tick"
64.times do
sample :elec_tick, amp: 2, rate: rater1.tick(:rate) - 1.8, pan: panner1.tick(:pan)
if one_in 4 then
sleep 0.125
sample :elec_tick, amp: 1.4, rate: rater1.look(:rate) - 1.2, pan: panner1.look(:pan)
sleep 0.125
else
sleep 0.25
end
end
else
puts "cymbals"
4.times do
sample :drum_cymbal_hard, rate: rater2.tick
sleep 0.2
if one_in 2 then
sample :drum_cymbal_pedal, rate: rater2.look - 0.25
else
sample :drum_cymbal_soft, rate: rater2.look - 0.25
end
sleep 0.6
sample :ambi_choir, rate: rater2.look - 0.2, amp: amper1.tick
sleep 3.2
end
end
end
end
cue :slowAmbi
puts "x", x
cue :startbass1 if x == 1
if x == 2 then
cue :startbass2
sample :misc_crow, rate: 0.23
end
if x == 3 then
cue :startbass3
sample :misc_crow, rate: 0.18
end
if one_in 2 then
cue :startbeeper
if one_in 2 then
sample :misc_crow, rate: rrand(0.15, 0.25)
end
end
if one_in 4 then
puts "recue basses..."
cue :restartbass1
cue :restartbass2
cue :restartbass3
end
if one_in 32 then
puts "pat shuffled"
pat.shuffle
end
if one_in 16 then
puts "panner1 reversed"
panner1.reverse
end
sleep 1
end
end