Curating a Sonic Pi Music Playlist

Amazing amazing :smiley: thank you all :slight_smile:

1 Like

Here is my attempt to replicate a GoGo Penguin track in Sonic Pi:

5 Likes

I tried uploading one of my ambient tracks to spotify but the free distribution platform Iā€™m using declined my track because my cover wasnā€™t quality or whatever :pleading_face:

When I finally get it posted on spotify Iā€™ll post it here! Also, if anyone here is up to helping me with the cover art that would be nice. My cover photo was just a frame of a modified preset on hydra. Hereā€™s the hydra code if anyoneā€™s interested:

osc(-5.38, 0.0021, -0.478).color(0.056, 0.441, 0.313).rotate(0.585, 0.124).modulate(noise(-1.075), () => 1.376 * Math.sin(0.019 * time)).out(o0);
1 Like

would love to help with your artwork :slight_smile:

This is awesome!

Here are the links to all my current work:

1 Like

Still incredibly impressed by this.

1 Like

Thanks for the feature!!!

All the albums that I posted so far on https://enkid0.bandcamp.com are made 100% with Sonic Pi. Is that url sufficient for you, or would you rather have a link per album (8 links) orā€¦ a link per track? (that would be more complicated =)).

@enkid0 Donā€™t worry I will do the digging :slight_smile:
@modulo thank you for sharing :slight_smile:

1 Like

Thanks for the continual share ā€¦ I have some exciting news coming soon ā€¦ :smiley:

1 Like

Thank you! It means a lot to me.

1 Like

Iā€™m putting my Sonic Pi-made tracks in here. Primarily Iā€™m using SPi to arrange ā€œliving backing tracksā€ for others in the band to play to. But Iā€™ve started to try composing in SPi too.

Iā€™ll add that some of samples are made with tools outside SPi, but Iā€™m using a lot of the in-built sounds too.

2 Likes

Thatā€™s ace. Can I ask what are you using for the bass on this track?

Robin - what a mix. How did you code in all that Bach? So many notes, hard enough when I used to try playing it. I especially like the Rachmaninoff, thatā€™s a great sound going on there.

Some of the tracks remind me of the Radiophonic workshop - not so much their left-field stuff but when then made those synth-based theme tunes for bbc programmes. Is it the sine waves? :smiley:

Believe it or not, I just used the SPi fm synth, which doesnā€™t always sound right, but with some tweaking sometimes itā€™s surprisingly believable. My goal was to complete this project with SPi built-in samples and synths only. Here is the entire code: https://github.com/garenhart/gogo-penguin-hopopono. Just make sure to read the readme if you want to run it. BTW, I really enjoyed listening to your tracks!

1 Like

Thanks so much, great to see the code - and well commented too. Iā€™m definitely going to steal your bass sound though :smile:

2 Likes

All 4 tracks are coolā€¦ but ā€˜One Dropā€™ really hits.

As a lover of dub Iā€™d really like to see that code, Sir.

Might I offer this as a trade?

Respec.

Eliā€¦

2 Likes

Thanks for the kind words, and nice work yourself! Lots of good-sounding elements in there which I will shamelessly copy :smile: Iā€™ll single out the ruff on the snare, thatā€™s good. I need more of those touches.

One of my band wanted a dub track, so mine is a live/endless backing track for that, King Tubby style - well, hopefully. In performance Iā€™ll switch the different bits in an out and muck about with the reverb. Take it down to the bare minimum and bring it up again, you know.

Thereā€™s a few samples in there, mostly mine, one from Freesound. Although the samples were made in SPi and recorded - the reason being the effects (echo and reverb) were taking too much CPU run live.

As requested:

# Rubber Dub
# Coded by: KniKnoo. https://gist.github.com/kniknoo/9bba301ab048cbfa350777d39a6098f6
# Remixed by: Just Eli... https://soundcloud.com/just-eli-139271289/

use_bpm 75
use_debug false
use_random_seed 98736
set_sched_ahead_time! 1

# Array used to start and stop loops outputting sounds,
tracker = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

n = (ring :r, :r, :d2, :d3, :f3, :r, :d1, :f2)

fade_in = (line 0, 2, inclusive: true, steps: 40).ramp
fade_in1 = (line 0, 3, inclusive: true, steps: 15).ramp
fade_out = (line 3, 1, inclusive: true, steps: 40).ramp
fade_out1 = (line 2, 0.5, inclusive: true, steps: 15).ramp
fade_out2 = (line 3, 1.5, inclusive: true, steps: 40).ramp
fade_through = fade_in+fade_out
fade_through1 = fade_in+fade_out1
fade_through2 = fade_in+fade_out2

dchord = chord(:g4, :minor, num_octaves: 3)
synth_cutoffs = range(60, 100, 0.5).mirror
synth_rhythm = (ring 1.5, 1.5, 1)
synth_transpositions = (stretch 0, 36) + (stretch -12, 6) + (stretch 12, 6)
synth_phases = (stretch 0.75, 15) + [0.25]
synth_pans = (ring -0.5, 0.5)
synth_volume = 1

dubpad_cutoffs = range(70, 100, 5).mirror
dubpad_phases = (ring 8, 8, 8, 0.5)
dubpad_mixes = (ring 0.5, 0.5, 0.5, 0)
dchord = chord(:g4, :minor, num_octaves: 3)

# Repeat a loop.
define :repeat_loop do |i|
  tracker[i] = 2
end


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

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

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
  tracker[10] = 0
  tracker[11] = 0
  
end


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

define :dubpad do |ch, amp|
  with_fx :echo, amp: amp, mix: dubpad_mixes.look,
  phase: 1.5, decay: 2 do
    with_fx :reverb, room: 0.8 do
      with_fx :ixi_techno, phase: dubpad_phases.tick, cutoff_min: 70 do
        with_synth :tb303 do
          with_synth_defaults attack: 0.1, release: 8,
          cutoff: dubpad_cutoffs.look, res: 0.5 do
            play_chord ch
            play_chord ch.map { |n| n + 0.3 } # Detune chord
          end
        end
      end
    end
  end
end

live_loop :bar do
  sleep 1
end

live_loop :beats do
  sync :bar
  sleep 4
end

live_loop :kick do
  if tracker[0]>0 then
    sample :drum_heavy_kick
    sleep 1
  else
    sleep 1
  end
end

with_fx :reverb, mix: 0.35, room: 0.1, damp: 0.9 do
  live_loop :snare do
    if tracker[1]>0 then
      use_sample_defaults sustain: 0, release: 0.25
      sleep 0.75
      sn_roll if rand > 0.8
      sleep 0.25
      sample :sn_dolf
      del = [0.25, 0.5, 0.75].choose
      cue :bass
      sleep del
      sample :drum_snare_soft, amp: 0.7 if rand > 0.5
      sleep 1 - del
    else
      sleep 1
    end
  end
end


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

live_loop :hats2 do
  if tracker[2]>0 then
    sample [:elec_tick, :elec_blip].choose, sustain: 0.006, amp: 0.8, hpf: 100 if rand > 0.3
    sleep 0.25
  else
    sleep 1
  end
end

live_loop :bass do
  if tracker[3]>0 then
    if rand(1) > 0.75
      n = (ring :r, :r, :d2, :d3, :f3, :r, :d1, :f2)
    else
      n=n.shuffle
    end
    use_synth :fm
    use_transpose +12
    use_synth_defaults release: 0.125 + rrand(0, 0.2), amp: 0.25, pan: rrand(-0.5, 0.5)
    use_transpose +12
    play n.look, cutoff: rrand(30, 130)
    sleep 0.25
    tick
  else
    sleep 1
  end
end

with_fx :gverb, mix: 0.1, room: 20, amp: 0.6 do
  live_loop :skank do
    if tracker[4]>0 then
      with_fx :bitcrusher, mix: 0.7, amp: 0.5, bits: 8, sample_rate: 3136 do
        use_synth :dpulse
        use_synth_defaults release: 0.125
        sleep 0.5
        if rand > 0.8
          with_fx :echo, phase: [0.25, 0.333, 0.375, 0.75].choose, decay: 4, mix: 0.5 do
            play (chord, :g4, :m, invert: -1)
          end
        else
          play (chord, :g4, :m, invert: -1)
        end
        3.times do
          sleep 1
          play (chord, :g4, :m, invert: -1)
        end
        sleep 0.5
      end
      
    else
      sleep 1
    end
  end
end

with_fx :echo, mix: 0.8, phase: 0.75, decay: 4 do
  with_fx :flanger, stereo_invert_wave: 1, feedback: 0.5, amp: 0.5 do
    
    live_loop :lead do
      if tracker[5]== 1 then
        with_fx :flanger, stereo_invert_wave: 1, feedback: 0.5, amp: 0.5 do
          sync :bass
          sync :bass
          use_synth :mod_beep
          rps = (range 6, 9).choose
          use_synth_defaults res: 0.9, attack: 0.25, noise: 2, release: 2 , cutoff: 100, amp: 0.2,
            note_slide: 0.02, sustain: 0.25 * rps / 1.25, decay: 0.25 * rps / 1.25, sustain_level: 0.8,
            mod_range: 0.5, mod_phase: 0.125, mod_wave: 2, pulse_width: 0.2
          mynote = (note_range, :g4, :g6, pitches: (scale, :g, :minor_pentatonic))
          play mynote.reverse.tick
          rps.times do
            control note: mynote.tick - [0, 12].choose
            sleep [0.25, 0.25, 0.5, 0.5, 0.75].choose
          end
          tracker[5] = 0
          sleep 2.5
        end
      else
        sleep 1
      end
    end
    
    if tracker[5] > 0 then
      with_fx :flanger, stereo_invert_wave: 1, feedback: 0.5, amp: 0.5 do
        sync :bass
        sync :bass
        use_synth :mod_beep
        rps = (range 6, 9).choose
        use_synth_defaults res: 0.9, attack: 0.25, noise: 2, release: 2 , cutoff: 100, amp: 0.2,
          note_slide: 0.02, sustain: 0.25 * rps / 1.25, decay: 0.25 * rps / 1.25, sustain_level: 0.8,
          mod_range: 0.5, mod_phase: 0.125, mod_wave: 2, pulse_width: 0.2
        mynote = (note_range, :g4, :g6, pitches: (scale, :g, :minor_pentatonic))
        play mynote.reverse.tick
        rps.times do
          control note: mynote.tick - [0, 12].choose
          sleep [0.25, 0.25, 0.5, 0.5, 0.75].choose
        end
        sleep 2.5
      end
    else
      sleep 1
    end
    
  end
end

live_loop :boom do
  sync :kick
  if tracker[6] == 1 then
    with_fx :reverb, room: 1 do
      sample :bd_boom, amp: 3
    end
    sample :drum_tom_hi_hard, amp: 3, rate: 0.2
    tracker[6]=0
    sleep 4
  end
  
  if tracker[6]>0 then
    with_fx :reverb, room: 1 do
      sample :bd_boom, amp: 1
    end
    sample :drum_tom_hi_hard, amp: 3, rate: 0.2
    sleep 4
  else
    sleep 1
  end
end

live_loop :alien_woosh do
  sync :kick
  if tracker[7] == 1 then
    with_fx :reverb, room: 1 do
      sample :ambi_dark_woosh
      tracker[7]=0
      sleep 4
    end
  end
  
  if tracker[7]>0 then
    with_fx :reverb, room: 1 do
      sample :ambi_dark_woosh
      sleep 4
    end
  else
    sleep 1
  end
end

live_loop :zawa do
  sync :kick
  if tracker[8] == 1 then
    with_fx :reverb, room: 1 do
      with_fx :slicer do
        with_fx :pitch_shift, pitch: -12 do
          use_synth :zawa
          
          [3,5,6,7,8,10].choose.times do |i|
            play chord(:e3, :minor).choose, release: [0.2, 0.4, 0.6, 0.8, 1].choose, pan: [1,0,-1].choose, cutoff: rrand(80, 110)
            tracker[8]=0
            sleep [0.25,0.5,0.75].choose
          end
        end
      end
    end
  end
end

live_loop :pad do
  sync :kick
  if tracker[9] == 1 then
    dubpad dchord, 0.125
    tracker[9] = 0
    sleep 16
  end
  if tracker[9] > 0 then
    dubpad dchord, 0.125
    sleep 16
  end
  sleep 0.1
end

live_loop :synth do
  sync :kick
  if tracker[10] == 1 then
    ch = invert_chord(dchord, rand_i(3))
    sleep synth_rhythm.tick
    # get random values for 1-shot synth.
    tick_advance = rrand_i(0,10)
    tick_advance.times do
      tick
    end
    with_fx :echo, amp: synth_volume, mix: 0.3,
    decay: 8, phase: synth_phases.look do
      with_fx :pan, pan: synth_pans.look do
        with_fx :reverb, room: 0.7, damp: 0.8 do
          with_synth_defaults attack: 0.05, release: 0.3 do
            with_transpose synth_transpositions.look do
              with_synth :sine do
                play_chord ch
              end
              cutoff = synth_cutoffs.look
              with_fx :ixi_techno, cutoff_min: cutoff,
              cutoff_max: cutoff - 30, phase: 1, res: 0.3 do
                with_synth :dsaw do
                  play_chord ch, attack: 0.1
                  tracker[10] = 0
                end
              end
            end
          end
        end
      end
    end
  end
  
  if tracker[10] > 0 then
    ch = invert_chord(dchord, rand_i(3))
    sleep synth_rhythm.tick
    with_fx :echo, amp: synth_volume, mix: 0.3,
    decay: 8, phase: synth_phases.look do
      with_fx :pan, pan: synth_pans.look do
        with_fx :reverb, room: 0.7, damp: 0.8 do
          with_synth_defaults attack: 0.05, release: 0.3 do
            with_transpose synth_transpositions.look do
              with_synth :sine do
                play_chord ch
              end
              cutoff = synth_cutoffs.look
              with_fx :ixi_techno, cutoff_min: cutoff,
              cutoff_max: cutoff - 30, phase: 1, res: 0.3 do
                with_synth :dsaw do
                  play_chord ch, attack: 0.1
                end
              end
            end
          end
        end
      end
    end
  else
    sleep 0.1
  end
end

live_loop :burp do
  sync :kick
  if tracker[11] == 1 then
    with_fx :reverb, room: 1 do
      with_fx :echo, mix: 0.3, phase: 0.25 do
        with_fx :slicer do
          with_fx :pitch_shift, pitch: 12 do
            sample :misc_burp, rate: 0.2, amp: 3
            tracker[11] = 0
            sleep 4
          end
        end
      end
    end
  end
  
  if tracker[11]>0 then
    with_fx :reverb, room: 1 do
      with_fx :echo, mix: 0.3, phase: 0.25 do
        with_fx :slicer do
          with_fx :pitch_shift, pitch: 12 do
            sample :misc_burp, rate: 0.2, amp: 3
            sleep 4
          end
        end
      end
    end
  else
    sleep 1
  end
end

kick = 0
snare = 1
hats = 2
bass = 3
skank = 4
lead = 5
boom = 6
alien_whoosh = 7
zawa = 8
dub_pad = 9
dub_synth = 10
burp= 11
boom = 6

start_loop lead
sleep 8

repeat_loop kick
sleep 2
repeat_loop snare
repeat_loop hats
sleep 4
repeat_loop bass
sleep 4
repeat_loop skank
sleep 4
start_loop lead
sleep 8
repeat_loop dub_pad
sleep 16
stop_loop dub_pad
repeat_loop dub_synth
sleep 32
start_loop zawa
sleep 8
start_loop burp
sleep 12
start_loop boom
sleep 12
start_loop burp
sleep 12
start_loop zawa
sleep 12
stop_loop dub_synth
sleep 8
repeat_loop dub_pad
sleep 12
start_loop lead
sleep 16
stop_loop dub_pad
sleep 4
start_loop lead
sleep 16
start_loop zawa
sleep 4
stop_all

And you might also be interested in an effects
suite I called ā€˜Dub Generationā€™ but never actually
posted to the forums before now I dont think:

"                                  Dub Generation" # V3.0
#___________________________________________________________________________________
"TRACK"#___0___1___2___3___4___5___6___7___8___9__10___11___12___13__14___15___16__17__18 |
track =   [0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 ,  0 ,  0 ,  0 , 0 ,  0 ,  0 , 0 , 0  ]
"             0 to deactivate, 1 for 1-shot effect, 2 for continuous loop."#              |
#_________________________________________________________________________________________|
#            __Track___________Track______________Track_____________Track_______          |
#           /                |                  |                 |             \         |
#           |  0 Kick        | 6  Rim           | 12 Whoosh       | 18 Dub Pad  |         |
#           |  1 Boom        | 7  Bass          | 13 Train        |             |         |
#           |  2 Beat 1      | 8  Skank         | 14 Zawa         |             |         |
#           |  3 Beat 2      | 9  Swirl         | 15 Burp         |             |         |
#           |  4 Snare/Roll  | 10 Guitar 1      | 16 Ghostly keys |             |         |
#           |  5 Hat         | 11_Guitar 2      | 17 Synth tune   |             |         |
#           \________________|__________________|_________________|_____________/         |
#_________________________________________________________________________________________|
"KICK PATTERN"# 0___1___2___3___4___5___6___7                                             |
kick_pattern = [1 , 0 , 0 , 1 , 0 , 1 , 1 , 0].ring
#_________________________________________________________________________________________|
"                             ALT-R or CLICK 'RUN' to ACTIVATE"#                           |
#_________________________________________________________________________________________|
#
#                   Note: Not all effect/volume changes are instantaneous...
#                         you will need to judge them for yourself.
#
#                                 Control Panel by: Eli...
#
# Extra 'BOOM' added for my friend Xomby.  'Respec'...















x=0
set_bpm = 100

kick = 0
boom = 1
base_drum = 2
secondary_drum = 3
snare = 4
hat = 5
rim = 6
bass = 7
skank = 8
lead = 9
guitar1 = 10
guitar2 = 11
alien_whoosh = 12
train = 13
zawa = 14
burp = 15
ghostly_keys = 16
dub_synth = 17
dub_pad = 18

synth_cutoffs = range(60, 100, 0.5).mirror
synth_rhythm = (ring 1.5, 1.5, 1)
synth_transpositions = (stretch 0, 36) + (stretch -12, 6) + (stretch 12, 6)
synth_phases = (stretch 0.75, 15) + [0.25]
synth_pans = (ring -0.5, 0.5)
synth_volume = 1

dubpad_cutoffs = range(70, 100, 5).mirror
dubpad_phases = (ring 8, 8, 8, 0.5)
dubpad_mixes = (ring 0.5, 0.5, 0.5, 0)
dchord = chord(:e3, :minor, num_octaves: 3)
dubpad_volume = 1

n = (ring :r, :r, :d2, :d3, :f3, :r, :d1, :f2)

define :combo do |s, t, u|
  start_loop s
  start_loop t
  start_loop u
  sleep 4
  stop_loop s
  stop_loop t
  stop_loop u
end

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

define :dubpad do |ch, amp=0.25|
  with_fx :echo, amp: amp, mix: dubpad_mixes.look,
  phase: 1.5, decay: 2 do
    with_fx :reverb, room: 0.8 do
      with_fx :ixi_techno, phase: dubpad_phases.tick, cutoff_min: 70 do
        with_synth :tb303 do
          with_synth_defaults attack: 0.1, release: 8,
          cutoff: dubpad_cutoffs.look, res: 0.5 do
            play_chord ch
            play_chord ch.map { |n| n + 0.3 } # Detune chord
          end
        end
      end
    end
  end
end

# Repeat a loop.
define :repeat_loop do |i|
  track[i] = 2
end

# Bring in a loop.
define :start_loop do |i|
  track[i] = 1
end

# Remove a loop.
define :stop_loop do |i|
  track[i] = 0
end

tick_set 1

live_loop :ticker, auto_cue: false do
  use_bpm set_bpm
  tick
  cue :ticker
  sleep 1
end

live_loop :beats do
  sync :ticker
  set :kick, kick_pattern.tick
  cue :beats
end

live_loop :bar do
  sync :beats
  sleep 4
end

live_loop :kick do
  if track[0] > 0 then
    sync :beats
    kicker = get :kick
    puts kicker
    sample :bd_tek, amp: 1 if kicker == 1
    if track[0] == 1 then
      track[0] = 0
    end
  else
    sleep 0.25
  end
end

live_loop :boom do
  use_bpm set_bpm
  sync :kick
  if track[1] > 0 then
    with_fx :reverb, room: 1 do
      sample :bd_boom, amp: 3
    end
    sample :drum_tom_hi_hard, amp: 3, rate: 0.2
    if track[1] == 1 then
      track[1]=0
      sleep 1
    end
  else
    sleep 1
  end
end

live_loop :base_drums do
  use_bpm set_bpm
  sync :kick
  if track[2] > 0 then
    with_fx :reverb, room: 0.5, phase: 0.5 do
      with_fx :echo, mix: 0.3, phase: 0.25 do
        2.times do
          sample :drum_heavy_kick, amp: 1, release: 1
          sleep 1.5
          sample :drum_snare_hard, amp: 0.3, release: 1
          sleep 1.5
        end
        if track[2] == 1 then
          track[2]=0
          
        end
      end
    end
  else
    sleep 1
  end
end

live_loop :secondary_drums do
  use_bpm set_bpm
  sync :kick
  if track[3] > 0 then
    with_fx :reverb, room: 0.5, phase: 0.5 do
      with_fx :echo, mix: 0.3, phase: 0.25 do
        sleep 1.5
        
        sample :drum_snare_hard, amp: 0.3, release: 1
        sleep 1.5
        
        sample :drum_heavy_kick, amp: 0.8, release: 1
        sleep 1.5
        
        sample :drum_snare_hard, amp: 0.5, release: 1
        sleep 0.5
        
        sample :drum_bass_soft, amp: 0.25, release: 1
        sleep 0.25
        sample :drum_bass_hard, amp: 0.75, release: 1
        sleep 0.25
        sample :drum_bass_soft, amp: 0.5, release: 1
        sleep 0.5
        if track[3] == 1 then
          track[3]=0
        end
        
      end
    end
  else
    sleep 1
  end
end

with_fx :reverb, mix: 0.35, room: 0.1, damp: 0.9 do
  live_loop :snare do
    use_bpm set_bpm
    if track[4]>0 then
      use_sample_defaults sustain: 0, release: 0.25
      sleep 0.75
      sn_roll if rand > 0.8
      sleep 0.25
      sample :sn_dolf
      del = [0.25, 0.5, 0.75].choose
      cue :bass
      sleep del
      sample :drum_snare_soft, amp: 0.7 if rand > 0.5
      sleep 1 - del
      if track[4] == 1 then
        track[4] = 0
      end
    else
      sleep 1
    end
  end
end

live_loop :hat1 do
  use_bpm set_bpm
  if track[5]>0 then
    sample :drum_cymbal_closed, sustain: 0.125, amp: 0.3 if rand > 0.9
    sleep 0.5
    sample :drum_cymbal_closed, sustain: 0.125, amp: 0.5
    sleep 0.5
    if track[5] == 1 then
      track[5] = 0
    end
  else
    sleep 1
  end
end


live_loop :rim do
  use_bpm set_bpm
  if track[6]>0 then
    sample [:elec_tick, :elec_blip].choose, sustain: 0.006, amp: 0.8, hpf: 100 if rand > 0.3
    sleep 0.25
    if track[6] == 1 then
      track[6] = 0
    end
  else
    sleep 1
  end
end

live_loop :bass do
  use_bpm set_bpm
  if track[7]>0 then
    if rand(1) > 0.75
      n = (ring :r, :r, :d2, :d3, :f3, :r, :d1, :f2)
    else
      n=n.shuffle
    end
    use_synth :fm
    use_transpose +12
    use_synth_defaults release: 0.125 + rrand(0, 0.2), amp: 0.25, pan: rrand(-0.5, 0.5)
    use_transpose +12
    play n.look, cutoff: rrand(30, 130)
    sleep 0.25
    tick
    if track[7] == 1 then
      track[7] = 0
    end
  else
    sleep 1
  end
end

with_fx :gverb, mix: 0.1, room: 20, amp: 0.6 do
  use_bpm set_bpm
  live_loop :skank do
    if track[8]>0 then
      with_fx :bitcrusher, mix: 0.7, amp: 0.5, bits: 8, sample_rate: 3136 do
        use_synth :dpulse
        use_synth_defaults release: 0.125
        sleep 0.5
        if rand > 0.8
          with_fx :echo, phase: [0.25, 0.333, 0.375, 0.75].choose, decay: 4, mix: 0.5 do
            play (chord, :g4, :m, invert: -1)
          end
        else
          play (chord, :g4, :m, invert: -1)
        end
        3.times do
          sleep 1
          play (chord, :g4, :m, invert: -1)
        end
        sleep 0.5
        if track[8] == 1 then
          track[8] == 0
        end
      end
    else
      sleep 1
    end
  end
end

with_fx :echo, mix: 0.8, phase: 0.75, decay: 4 do
  with_fx :flanger, stereo_invert_wave: 1, feedback: 0.5, amp: 0.5 do
    
    live_loop :lead do
      use_bpm set_bpm
      if track[9] > 0 then
        with_fx :flanger, stereo_invert_wave: 1, feedback: 0.5, amp: 0.5 do
          sync :bass
          sync :bass
          use_synth :mod_beep
          rps = (range 6, 9).choose
          use_synth_defaults res: 0.9, attack: 0.25, noise: 2, release: 2 , cutoff: 100, amp: 0.2,
            note_slide: 0.02, sustain: 0.25 * rps / 1.25, decay: 0.25 * rps / 1.25, sustain_level: 0.8,
            mod_range: 0.5, mod_phase: 0.125, mod_wave: 2, pulse_width: 0.2
          mynote = (note_range, :g4, :g6, pitches: (scale, :g, :minor_pentatonic))
          play mynote.reverse.tick
          rps.times do
            control note: mynote.tick - [0, 12].choose
            sleep [0.25, 0.25, 0.5, 0.5, 0.75].choose
          end
          if track[9]== 1 then
            tracker[9] = 0
          end
          sleep 2.5
        end
      else
        sleep 1
      end
    end
    
  end
end

live_loop :guitar1 do
  use_bpm set_bpm
  sync :kick
  if track[10] > 0 then
    with_fx :reverb, room: 1 do
      with_fx :echo, mix: 0.3, phase: 0.25 do
        with_fx :slicer do
          sample :guit_em9, rate: 1
          sleep 4
          if track[10] == 1 then
            track[10]=0
            sleep 1
          end
        end
      end
    end
  else
    sleep 1
  end
end

live_loop :guitar2 do
  use_bpm set_bpm
  sync :kick
  if track[11] > 0 then
    with_fx :reverb, room: 1 do
      with_fx :pitch_shift, pitch: -6 do
        sample :guit_e_fifths, rate: 1
        sleep 4
        if track[11] == 1 then
          track[11] = 0
          sleep 1
        end
      end
    end
  else
    sleep 1
  end
end

live_loop :alien_woosh do
  use_bpm set_bpm
  sync :kick
  if track[12] > 0 then
    with_fx :reverb, room: 1 do
      sample :ambi_dark_woosh
      sleep 4
      if track[12] == 1 then
        track[12]=0
        sleep 1
      end
    end
  else
    sleep 1
  end
end

live_loop :train do |s|
  use_bpm set_bpm
  sync :kick
  if track[13] > 0 then
    with_fx :reverb, room: 0.5, phase: 0.5 do
      if s
        sleep 2
        end_release = 4
      else
        end_release = 6
      end
      use_synth :bnoise
      play :Cs3, amp: 0.5, pan: -1
      sleep 0.25
      play :Es3, amp: 0.25, pan: 1
      sleep 0.5
      play :Cs2, amp: 0.4, pan: -1
      sleep 0.25
      play :Es2, amp: 0.25, pan: 1
      sleep 0.5
      play :Ds3, amp: 0.3, pan: -1
      sleep 0.25
      play :Bs3, amp: 0.25, pan: 1
      sleep 0.5
      play :Ds2, amp: 0.3, pan: -1
      sleep 0.25
      play :Bs2, amp: 0.25, pan: 1, release: end_release
      if track[13] == 1 then
        track[13]=0
        sleep 1.5
      end
    end
  else
    sleep 1
  end
end

live_loop :zawa do
  use_bpm set_bpm
  sync :kick
  if track[14] > 0 then
    with_fx :reverb, room: 1 do
      with_fx :slicer do
        with_fx :pitch_shift, pitch: -12 do
          use_synth :zawa
          [3,5,6,7,8,10].choose.times do |i|
            play chord(:e4, :minor).choose, release: [0.2, 0.4, 0.6, 0.8, 1].choose, pan: [1,0,-1].choose, cutoff: rrand(80, 110)
            sleep [0.25,0.5,0.75].choose
            if track[14] == 1 then
              track[14]=0
              sleep [0.25,0.5,0.75].choose
            end
          end
        end
      end
    end
  else
    sleep 1
  end
end

live_loop :burp do
  use_bpm set_bpm
  sync :kick
  if track[15] > 0 then
    with_fx :reverb, room: 1 do
      with_fx :echo, mix: 0.3, phase: 0.25 do
        with_fx :slicer do
          with_fx :pitch_shift, pitch: 12 do
            sample :misc_burp, rate: 0.2, amp: 3
            sleep 4
            if track[15] == 1 then
              track[15] = 0
              sleep 4
            end
          end
        end
      end
    end
  else
    sleep 1
  end
end

live_loop :ghostly_keys do
  use_bpm set_bpm
  sync :kick
  if track[16] > 0 then
    with_fx :reverb, room: 0.8 do
      with_fx :echo, delay: 0.5, decay: 4 do
        use_synth :dark_ambience
        play chord([:b3, :b4, :e3, :e4].choose, :minor).choose,
          amp: 1.5, release: 6
        [5,6,7,8,9,10].choose.times do |i|
          use_synth :piano
          play chord([:b1, :b2, :b3, :e1, :e2, :e3].choose,
          :minor).choose, cutoff: rrand(40, 100),
            amp: 0.75, attack: 0, release: rrand(1, 2),
            cutoff_max: 110, pan: [-1, 0, 1].choose
          sleep [0.25, 0.5, 0.5, 0.5, 1, 1].choose
          if track[16] == 1 then
            track[16] = 0
            sleep 1
          end
        end
      end
    end
  else
    sleep 1
  end
end

live_loop :synth do
  use_bpm set_bpm
  sync :kick
  if track[17] > 0 then
    ch = invert_chord(dchord, rand_i(3))
    sleep synth_rhythm.tick
    # get random values for 1-shot synth.
    tick_advance = rrand_i(0,10)
    tick_advance.times do
      tick
    end
    with_fx :echo, amp: synth_volume, mix: 0.3,
    decay: 8, phase: synth_phases.look do
      with_fx :pan, pan: synth_pans.look do
        with_fx :reverb, room: 0.7, damp: 0.8 do
          with_synth_defaults attack: 0.05, release: 0.3 do
            with_transpose synth_transpositions.look do
              with_synth :sine do
                play_chord ch
              end
              cutoff = synth_cutoffs.look
              with_fx :ixi_techno, cutoff_min: cutoff,
              cutoff_max: cutoff - 30, phase: 1, res: 0.3 do
                with_synth :dsaw do
                  play_chord ch, attack: 0.1
                  sleep synth_rhythm.look
                  if track[17] == 1 then
                    track[17] = 0
                  end
                end
              end
            end
          end
        end
      end
    end
  else
    sleep 0.1
  end
end

live_loop :pad do
  use_bpm set_bpm
  sync :kick
  if track[18] > 0 then
    dubpad dchord, 0.25
    sleep 16
    if track[18] == 1 then
      track[18] = 0
      sleep 1
    end
  else
    sleep 1
  end
end

Regards,

Eliā€¦

2 Likes

Blimey Eli thatā€™s amazing! Iā€™ve got it playing now. Thatā€™s a great idea have the control in an array at the top.