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
