# Droid Skit - A simple electro creation

**URL:** <https://in-thread.sonic-pi.net/t/droid-skit-a-simple-electro-creation/2419>\
**Category:** Creations & Ideas\
**Created:** [May 24, 2019, 3:48pm UTC](https://in-thread.sonic-pi.net/t/droid-skit-a-simple-electro-creation/2419 "2019-05-24T15:48:00Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![binarysweets](https://dub1.discourse-cdn.com/flex017/user_avatar/in-thread.sonic-pi.net/binarysweets/32/2683_2.png) [@binarysweets](https://in-thread.sonic-pi.net/u/binarysweets)\
**Post date:** [May 24, 2019, 3:48pm UTC](https://in-thread.sonic-pi.net/t/droid-skit-a-simple-electro-creation/2419/1 "2019-05-24T15:48:00Z")

</div>

```ruby
# Title: Droid Skit (Stock Edit)
# Artist: Binarysweets
# Date: May 2019
# Original: https://binarysweets.bandcamp.com/track/droid-skit
#
# Sonic Pi v3.1 (Win 10)

use_bpm 137
barLength = 32
use_random_seed 423
use_tuning :pythagorean

define :getPitchFromNote do |note, sampleBaseNote, fineTune|
  return note - sampleBaseNote + fineTune
end
define :run do |parts|
  parts.each { |part|
    in_thread do
      send part
    end
  }
end
define :bar do
  sleep barLength
end

define :lead1 do |switch = 1|
  pattern = (ring :Ds, :F, :Fs, :Gs, :As, :B, :Cs, :Ds, :Ds, :Cs, :B, :As, :Gs, :Fs, :F, :Ds) if switch == 1
  pattern = (ring :Ds, :Cs, :B, :Cs, :As, :Ds, :Fs, :F, :Fs, :Gs, :F, :B, :Ds, :As, :Gs, :Ds) if switch == 2
  pattern = (ring :Ds, :Cs, :B, :Cs, :As, :Ds, :Fs, :F, :Fs, :Gs, :F, :B, :Ds, :As, :Gs, :Ds) + (ring :Ds4, :Cs4, :B4, :Cs4, :As4, :Ds4, :Fs4, :F4, :Fs4, :Gs4, :F4, :B4, :Ds5, :As5, :Gs5, :Ds5) if switch == 3
  ampLine = (line 0.7, 0.9, steps: 64).mirror
  ampLine2 = (line 0.1, 0.4, steps: 64).mirror
  relLine = (line 2, 3, steps: 64).mirror
  idx = get[:leadCounter]
  
  (barLength).times do ; tick
    idx += 1
    with_synth :dpulse do
      with_swing (line 0.01, 0.05, steps: 8).look, pulse: 4 do
        play pattern.look, amp: ampLine[idx], release: (ring 0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.3).look
      end
    end
    
    with_synth :fm do
      with_swing (line -0.01, 0.06, steps: 16).look, pulse: 4 do
        play pattern.look, amp: ampLine2[idx], release: relLine[idx]
      end
    end
    
    sleep (ring 1, 0.5, 1, 1.5, 0.5, 0.25, 0.25, 3).look
    set :leadCounter, idx
  end
end
define :lead2 do
  lead1 2
end
define :lead3 do
  lead1 3
end

define :leadAcc do
  pattern = (ring :Ds3, :F3, :Fs3, :Gs3, :As3, :B3, :Cs3, :Ds3)
  
  with_fx :echo, decay: 16, phase: 0.125 do
    (barLength / 4).times do ; tick
      with_synth :dpulse do
        with_swing (line 0.01, 0.05, steps: 8).look, pulse: 4 do
          play pattern.look, amp: rrand(0.1, 0.3), release: 1
        end
      end
      
      with_synth :fm do
        with_swing (line -0.01, 0.05, steps: 16).look, pulse: 4 do
          play pattern.look, amp: rrand(0.2, 0.4), release: 1
        end
      end
      
      sleep 4
    end
  end
end

define :lowBells do
  use_octave 2
  pattern = (ring :Ds, :F, :Fs, :Gs, :As, :B, :Cs, :Ds, :Ds, :F, :Fs, :Gs, :As, :B, :Cs, :Ds).reverse.repeat(3) + (ring :Ds, :F, :Fs, :Gs, :As, :B, :Cs, :Ds, :Ds, :F, :Fs, :Gs, :As, :B, :Cs, :Ds)
  idx = get[:lowBellsCounter]
  
  (barLength * 2).times do ; tick
    idx += 1
    with_swing (line -0.02, 0.05, steps: 8).look, pulse: 4 do
      play pattern.look, amp: rrand(0.02, 0.03), release: 2, pan: (line -0.5, 0.5, steps: 128).mirror[idx]
    end
    
    sleep 0.5
    set :lowBellsCounter, idx
  end
end

define :bass1 do |switch = false|
  pattern = (ring :Ds2, :F2, :Fs2, :Gs2, :As2, :B2, :Cs2, :Ds2, :Ds2, :Cs2, :B2, :As2, :Gs2, :Fs2, :F2, :Ds2)
  sleeps = (ring 1, 0.5, 1, 1.5, 0.5, 0.25, 0.25, 3) if switch == false
  sleeps = (ring 1, 0.5, 1, 1.5) if switch == true
  
  (barLength).times do ; tick
    with_synth :dtri do
      with_fx :distortion, distort: 0.5, mix: 0.1 do
        with_swing (line 0.01, 0.05, steps: 8).look, pulse: 4 do
          play pattern.look, amp: 0.3, sustain: 0.4, decay: 0.2, release: 0.125
          #with_octave -1 do
          # play pattern.look, amp: 0.3, sustain: 0.4, decay: 0.2, release: 0.125
          #end
        end
      end
    end
    
    sleep sleeps.look
  end
end
define :bass2 do
  bass1 true
end

define :chords1 do |switch = false|
  pattern = (ring chord(:Ds, :minor7), chord(:Ds, :minor7), chord(:Ds, :minor7), chord(:Fs, :major7)) if switch == false
  pattern = (ring chord_degree(1, :DS, :minor, 4), chord_degree(3, :DS, :minor, 4), chord_degree(4, :DS, :minor, 4), chord_degree(5, :DS, :minor, 4)) if switch == true
  
  (barLength / 8).times do ; tick
    with_synth :fm do
      with_fx :rlpf, cutoff: (line 60, 100, steps: 16).mirror.look do
        with_swing rrand(-0.01, 0.03), pulse: 4 do
          play pattern.look, amp: 0.7, release: 4
        end
      end
    end
    
    sleep 8
  end
end
define :chords2 do
  chords1 true
end

define :beats1 do
  s = :loop_compus
  sample :loop_breakbeat
  pattern = (ring 1,0,0,0, 2,0,0,1, 1,0,1,0, 2,0,0,0, 1,0,1,0, 2,0,0,1, 1,0,0,0, 3,1,0,0).repeat(3) + (ring 1,0,0,0, 2,0,0,1, 1,0,0,0, 2,0,0,0, 0,0,1,0, 2,0,2,1, 1,0,0,0, 3,0,0,0)
  
  with_fx :eq, low_note: 60, low: -0.5 do
    (barLength * 4).times do ; tick
      with_fx :distortion, distort: 0.4, mix: 0.1 do
        with_swing (line 0.01, 0.05, steps: 8).look, pulse: 4 do
          sample s, slice: 0, num_slices: 32, amp: rrand(8, 8.2) if pattern.look == 1
          sample s, slice: 4, num_slices: 32, amp: rrand(8, 8.2) if pattern.look == 2
          sample s, slice: 4, num_slices: 32, amp: rrand(8, 8.2), rate: 0.95 if pattern.look == 3
        end
      end
      
      sleep 0.25
    end
  end
end

define :beats2 do
  s = :loop_compus
  
  with_fx :eq, low_note: 60, low: -0.8 do
    (barLength).times do ; tick
      with_fx :bitcrusher, bits: (line 2, 16, steps: 16).mirror.look do
        with_swing (line 0.01, 0.05, steps: 8).look, pulse: 4 do
          sample :bd_pure, amp: rrand(6, 6.2), rate: 1
          sample s, slice: 4, num_slices: 32, amp: rrand(8, 8.2), rate: 1 if spread(1, 9).look
        end
        
        sleep 1
      end
    end
  end
end

define :hats do
  s = :loop_compus
  
  with_fx :eq, low_note: 60, low: -0.8 do
    (barLength * 2).times do ; tick
      with_swing (line 0.01, 0.05, steps: 8).look, pulse: 4 do
        sample s, slice: 1, num_slices: 32, amp: rrand(4, 4.2) if (spread 6, 11).look
        sample s, slice: 1, num_slices: 32, amp: rrand(4, 4.2) if (spread 9, 4).look
      end
      
      sleep 0.5
    end
  end
end

define :slowLead do |_pan = 0.3|
  use_synth :chiplead
  pattern = (ring :Ds5, :F5, :Fs5, :Gs5, :As5, :B5, :Cs5, :Ds6)
  phaseLine = (line 5, 10, steps: 8)
  
  (barLength / 4).times do ; tick
    with_fx :wobble, amp: 1, phase: phaseLine.look, wave: 3 do
      with_swing rrand(-0.01, 0.03), pulse: 4 do
        play pattern.look, amp: 0.3, attack: 0.2, sustain: 2, decay: 2, release: 6, pan: _pan
      end
    end
    
    sleep 8
  end
end
define :slowLeadL do
  slowLead -0.3
end

define :tabla do
  s = (ring "tabla_dhec.flac", "tabla_na.flac", "tabla_na_o.flac", "tabla_na_s.flac", "tabla_re.flac",
       "tabla_tas1.flac", "tabla_tas2.flac", "tabla_tas3.flac", "tabla_te_m.flac", "tabla_te2.flac").shuffle
  
  (barLength * 4).times do
    with_swing rrand(-0.03, 0.03), pulse: 4 do
      sample s[tick], amp: rrand(0.2, 0.4), pan: -0.2, rate: 1
    end
    
    sleep 0.25
  end
end

# Reset globals
set :leadCounter, 1
set :lowBellsCounter, 1

# Structure
run [:chords1, :leadAcc] ; bar
run [:chords2, :leadAcc] ; bar

run [:beats2, :chords1, :lowBells] ; bar
run [:beats2, :chords2, :lowBells] ; bar
run [:bass1, :beats1, :chords1, :hats, :lowBells] ; bar
run [:bass1, :beats1, :chords2, :hats, :lowBells, :tabla] ; bar

run [:bass1, :beats1, :chords1, :hats, :lowBells, :tabla, :lead1] ; bar
run [:bass1, :beats1, :chords2, :hats, :lowBells, :tabla, :lead1] ; bar
run [:bass2, :beats1, :hats, :lowBells, :tabla, :lead2] ; bar
run [:bass2, :beats1, :hats, :lowBells, :tabla, :lead3] ; bar

run [:bass1, :beats1, :hats, :lowBells, :tabla] ; bar
run [:bass1, :beats1, :hats, :lowBells, :tabla, :slowLead] ; bar
run [:beats2, :chords1, :leadAcc, :slowLeadL] ; bar
run [:beats2, :chords2, :leadAcc] ; bar

run [:bass1, :beats2, :chords1, :lowBells, :lead1] ; bar
run [:bass1, :beats2, :chords2, :lowBells, :lead1] ; bar
```

---

<div class="post-metadata">

**Author:** ![chris.krakou](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@chris.krakou](https://in-thread.sonic-pi.net/u/chris.krakou)\
**Post date:** [May 24, 2019, 8:08pm UTC](https://in-thread.sonic-pi.net/t/droid-skit-a-simple-electro-creation/2419/2 "2019-05-24T20:08:52Z")

</div>

Magnificent track. I’m gonna have to sit down with a cup of coffee and go through it.

The first beat got took me by surprise, not gonna lie.

---

<div class="post-metadata">

**Author:** ![binarysweets](https://dub1.discourse-cdn.com/flex017/user_avatar/in-thread.sonic-pi.net/binarysweets/32/2683_2.png) [@binarysweets](https://in-thread.sonic-pi.net/u/binarysweets)\
**Post date:** [May 25, 2019, 4:19pm UTC](https://in-thread.sonic-pi.net/t/droid-skit-a-simple-electro-creation/2419/3 "2019-05-25T16:19:31Z")

</div>

Thanks! If you have any questions about the code let me know, and enjoy your coffee 🙂

---

<div class="post-metadata">

**Author:** ![perpetual\_monday](https://dub1.discourse-cdn.com/flex017/user_avatar/in-thread.sonic-pi.net/perpetual_monday/32/955_2.png) [@perpetual\_monday](https://in-thread.sonic-pi.net/u/perpetual_monday)\
**Post date:** [May 25, 2019, 8:31pm UTC](https://in-thread.sonic-pi.net/t/droid-skit-a-simple-electro-creation/2419/4 "2019-05-25T20:31:57Z")

</div>

Nice work! I’m new to Sonic Pi and am glad for examples that demonstrate arranging and mixing multiple parts in a clean way. It sounds great! Saved for further learning / studying.
