A Rainy Night in Bristol

Dont fancy pubbin and clubbin in the wet… so I sat
home and wrote my own…

As usual, you can switch between versions using the uncomment/comment section
at the end of the code…

Eli…

#Classic Techno?
# Anthemic House?
# God knows...
#Eli...

use_debug false
use_bpm 120
set_volume! 5

tracker = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

kick_vol = (line 0.2, 3, inclusive: true, steps: 5).ramp
notes = (scale :e3, :minor_pentatonic).shuffle


define :start_loop do |i|
  tracker[i] = 1
end


define :stop_loop do |i|
  tracker[i] = 0
end

define :sn_roll do #|length|
  in_thread do
    sn_amp = 0.5
    4.times do
      sample :sn_dolf, amp: sn_amp, sustain: 0, release: 0.125
      sleep 0.0625
      sn_amp += 0.07
    end
  end
end

drum_vol = (line 0.2, 2, inclusive: true, steps: 5).ramp


define :stop_all do
  tracker[0] = 0
  tracker[1] = 0
  tracker[2] = 0
  tracker[3] = 0
  tracker[4] = 0
  tracker[5] = 0
  tracker[6] = 0
  tracker[7] = 0
  tracker[8] = 0
  tracker[9] = 0
end

live_loop :bar do
  sleep 1
end

live_loop :beats do
  sync :bar
  sleep 4
  cue :bass
end


live_loop :kick do
  if tracker[0]>0 then
    sync :bar
    sample :bd_ada,amp: 0.4*kick_vol.look
    sleep 2
    sample :bd_ada,amp: 0.4*kick_vol.look
    sleep 2
  else
    sleep 1
  end
  tick
end

live_loop :hats do
  if tracker[1]>0 then
    
    sample :drum_cymbal_closed, sustain: 0.125, amp: 0.3*drum_vol.look if rand > 0.9
    sleep 0.5
    sample :drum_cymbal_closed, sustain: 0.125, amp: 0.5*drum_vol.look
    sleep 0.5
  else
    sleep 1
  end
  tick
end

live_loop :rim do
  if tracker[2]>0 then
    sync :kick
    with_fx :distortion do
      sleep 0.5
      sample :elec_blip, sustain: 0.006, cutoff:110, rate: 0.5, amp: 0.2*drum_vol.look
      sleep 0.25
      if rand(1) < 0.65 then
        sample :elec_blip, sustain: 0.005, cutoff:110, rate: 0.5, amp: 0.1*drum_vol.look
        sleep 0.125
      else
        sleep 0.125
      end
      sleep 0.125
    end
  else
    sleep 1
  end
  tick
end

with_fx :reverb, mix: 0.35, room: 0.1, damp: 0.9 do
  live_loop :snare do
    if tracker[3]>0 then
      sync :kick
      use_sample_defaults sustain: 0, release: 0.25
      del = [0.25, 0.5, 0.75].choose
      cue :bass
      sleep del
      sample :drum_snare_soft, amp: 0.3*drum_vol.look if rand > 0.5
      sleep 1 - del
      sample :drum_snare_soft, amp: 0.4*drum_vol.look if rand > 0.5
      sleep del
    else
      sleep 1
    end
    tick
  end
end


live_loop :drums do
  if tracker[4]>0 then
    sync :bar
    sample :bd_tek, amp: 5, beat_stretch: 1
    sleep 1
  else
    sleep 0.25
  end
end

live_loop :roll do
  if tracker[5]>0 then
    sn_roll
    sleep 1
  else
    sleep 0.25
  end
  sleep 4
end



live_loop :intro1 do
  if tracker[6]>0 then
    sync :bar
    use_synth :supersaw
    use_synth_defaults cutoff: rrand(70, 110), release: rrand(1, 4), amp: 1
    with_fx :panslicer, mix: 0.5 do
      with_fx :hpf, cutoff: 70 do
        with_fx :reverb, mix: 0.4 do
          with_fx :echo, mix: 0.2 do
            2.times do
              play_chord chord(:D3, :minor )
              sleep 0.75
            end
            sleep 0.5
            play_chord chord(:D4, :minor ), attack: 4, release: 2
            sleep 2
          end
        end
      end
    end
  else
    sleep 0.25
  end
end

live_loop :xylo do
  if tracker[7]>0 then
    sync :beats
    x = 0
    xylophone = [62,57,x,60,x,55,x,x,53,x,55,x,52,x,57,x,
                 62,57,x,60,x,55,x,x,53,x,55,x,52,x,57,x,
                 62,57,x,60,x,55,x,x,53,x,55,x,52,x,57,x,
                 62,57,x,60,x,55,x,x,53,x,55,x,52,x,57,x,
                 62,57,x,60,x,55,x,x,53,x,55,x,52,x,57,x].ring
    
    xylophone_offset =[0,0,50,0,50,0,50,50,0,50,0,50,0,50,0,50,
                       0,0,48,0,48,0,48,48,0,48,0,48,0,48,0,48,
                       0,0,62,0,62,0,62,62,0,62,0,62,0,62,0,62,
                       0,0,48,0,48,0,48,48,0,48,0,48,0,48,0,48,
                       0,0,62,0,62,0,62,62,0,62,0,62,0,62,0,62].ring
    
    xylophone_octave = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                        0,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1,
                        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                        0,0,1,0,1,0,1,1,0,1,0,1,0,1,0,1].ring
    
    if xylophone_octave.look == 1 then
      use_synth :supersaw
    else
      use_synth :supersaw
    end
    with_fx :reverb, mix: 0.4 do
      with_fx :echo, mix: 0.2 do
        64.times do
          play xylophone.look+xylophone_offset.look+(12*xylophone_octave.look), amp: rrand_i(0.4,0.6),
            duration: 0.25
          sleep 0.5
          tick
        end
      end
    end
  else
    sleep 0.25
  end
end

with_fx :reverb, room: 0.8 do
  live_loop :space_scanner do
    if tracker[8]>0 then
      use_synth :tb303
      with_fx :slicer, phase: 0.25, amp: 1.5 do
        co = (line 70, 130, steps: 8).tick
        play :e4, cutoff: co, release: 7, attack: 1, cutoff_attack: 4, cutoff_release: 4
        sleep 4
      end
    else
      sleep 0.25
    end
  end
end

live_loop :foo do
  if tracker[9]>0 then
    sync :bar
    use_synth :fm
    play (ring :e3, :c2, :a1).tick
    play (scale :e3, :minor_pentatonic).tick
    sleep 0.5
  else
    sleep 0.25
  end
end

live_loop :foo1 do
  if tracker[9]>0 then
    use_synth :blade
    sync :bar
    with_fx :reverb, reps: 8, room: 1 do
      tick
      co = (line 76, 130, steps: 8).tick(:cutoff)
      play (octs [:e3,:c3,:a3].choose, 3).look, cutoff: co, amp: 1
      play notes.look, amp: 4
      sleep 0.5
    end
  else
    sleep 0.25
  end
end

live_loop :loopy do
  if tracker[10] > 0 then
    
    notes = (scale :e3, :minor_pentatonic).ring.reverse
    sn = synth :prophet, note: :e1, release: 8, cutoff: 100
    repeat = (ring 16,16, 8, 16, 8, 4, 2).look
    repeat.times do
      control sn, note: notes.tick
      sleep 0.125
    end
    if look > 64 then
      with_fx :krush do
        play :e3, amp: 1, sustain: 4
        tracker[10] = 0
      end
    end
    sleep 0.25
  else
    sleep 1
  end
end


kick=0
hats=1
rim=2
snare=3
drum=4
roll=5
intro1=6
xylo=7
loopy=10

comment do
  # Very 80's... uncomment this one
  # for an anthemic high... Oy Oy!
  start_loop 10
  sleep 8
  start_loop 4
  start_loop 0
  start_loop 1
  start_loop 3
  sleep 8
  start_loop 6
  sleep 8
  stop_loop 4
  sleep 8
  stop_loop 6
  sleep 8
  start_loop 7
  sleep 8
  
end

uncomment do
  # Just messing around with some other
  # EDM-like sound effects...dont
  # forget to uncomment/comment stuff.
  start_loop 8
  sleep 8
  start_loop 9
  sleep 8
  start_loop 4
  stop_loop 8
  stop_loop 9
  sleep 8
  start_loop 0
  sleep 4
  start_loop 1
  stop_loop 2
  start_loop 3
  start_loop 4
  sleep 6
  stop_all
  start_loop 7
  sleep 16
  stop_loop 7
  sleep 16
  start_loop 6
  sleep 32
  stop_loop 6
  sleep 32
  stop
end
2 Likes

Nice Eli. I like it!

Very nice. You’re right, seems to have been many grey rainy days in Bristol lately!

1 Like

mn=[]; mn1=[]; mn2=[]; mn3=[];n=[]
for z in 1…1024; mn[z]=(hz_to_midi(11*z))
end; mn[0]=:r
for x in 0…15;mn1[x]=:r ;mn2[x]=:r; mn3[x]=:r; end
n=[24,27,32,36,40,48,0,0,0,0]
use_bpm 120
loop do
for x in 0…15
r=rand_i(10)
p=rand_i(15)
if p==5 then mn1[x]=mn[n[r]]; end
if p==6 then mn2[x]=mn[n[r]]; end
if p==7 then mn3[x]=mn[n[r]]; end
synth :fm, note: mn1[x]
synth :pluck, note: mn2[x], pan: -1.0
synth :pretty_bell, note: mn3[x], pan: 1.0
sleep 0.5; end; end

Very interesting but for noobs may i suggest you to comment your code ?

Could you explain what is the role of your tracker ?
thanks

In Eli’s defence he has discussed his tracker system in the past on this site. Take a look here

it will explain hw it works.

1 Like

I usually only post simple tracks… in actual fact you can track just about
anything…

tracker = [0,0,0]
loop_volume = [0,0,0]
note_duration = [0,0,0]

and make defines to set volumes, etc…

#Reduce any particular sound loop’s volume
define :reduce do |i, n |
if loop_volume[i] - n > 0 then
loop_volume[i] = loop_volume[i] - n
end
end

#Increase any particular sound loop’s volume
define :increase do |i, n |
if loop_volume[i] + n < 10 then
loop_volume[i] = loop_volume[i] + n
else
end
end

In the loop you’d have something like:

if tracker[7] > 0 then
play 63, amp: loop_volume[7]
else
sleep 0.1
end

So a ‘script’ might be something like…

start_loop 7
increase 7,5 # increase loop 7 volume by 5
sleep 8
reduce 7, 3
sleep 8
stop_loop 7

sorry i was’nt aware of this message. Tanks for mentioning it.

No probs nlb, you made a valid point.

Eli…