【Sonic Pi】 変数とif文を使ってシーケンスを制御する

今日はSonic Piを。

DAWでできないようなループを作るのもいいけど、

ちゃんと16ビートとか作れたらなあと思って試してみた。

aは8ステップ、bは4ステップ。aを頭出しするときにbを1進める。

そうすることで実質 8 x 4の32ステップになる。

 

if文で音の出力を制御することで色々できる。

 

 

a = 0
b = 0
vol = 1

live_loop :_20180102 do
  use_bpm 120
  
  in_thread do
    cue :synth
    cue :chord
    cue :bass
    cue :beat
    a = a + 1 #シーケンスを進める
  end
  
  #syntn-------------------------------------
  in_thread do
    use_synth :supersaw
    if b == 4
      play_pattern_timed chord(:A5, :maj9),0.5, amp:0.5
    else
      play_pattern_timed chord(:A6, :maj9),0.25, amp:0.3
    end
  end
  
  #chord-------------------------------------
  in_thread do
    sync :chord
    use_synth :tri
    if a < 4
      play chord(:A3, :major), release:0.8
    else
      play chord(:G3, :major), release:0.8
    end
    
    if a == 8
      play chord(:C5, :major), amp:1,release:2
    end
  end
  
  
  #bass-------------------------------------
  in_thread do
    sync :bass
    
    if a == 7 && b == 2
      play 48, amp:2,release:0.5 if one_in(4)
      sleep 1
      play 36, amp:2,release:2
    end
    
    use_synth :sine
    if a < 4
      if one_in(3)
        play 45, release:0.8,amp: 1.5 #A
      else
        rrand_i(3,5).times do
          play 45, release:0.8,release:0.5,amp:rrand(0.8,1.2) #A
          sleep 0.5
        end
      end
      
    else
      if one_in(5)
        play 43, release:0.8,amp:1.5 #G
      else
        3.times do
          play 43, release:0.8,release:0.5,amp:rrand(0.8,1.2) #A
          sleep 0.5
        end
      end
    end
    
  end
  
  
  #beat--------------------------------
  in_thread do
    sync :beat
    
    #kick-----
    sample :bd_tek, amp:2
    
    
    #snare--------
    if b == 4
      4.times do
        sample :drum_snare_soft,amp:vol
        sleep 0.25
      end
      vol = vol + 0.5
    else
      vol = 1
      if a == 8
        sample :drum_snare_hard,amp:1.8
        sleep 0.5
        sample :drum_snare_hard,amp:2
      end
    end
    
    
    if a == 3 || a == 7
      sleep 0.5
      sample :drum_cymbal_open,amp:rrand(0.5,1),rate:3
    else
      sleep 0.5
      sample :drum_cymbal_closed,amp:2,rate:1
    end
    
  end
  
  sleep 1
  
  #ループの処理---------------------
  if a == 8
    a = 0 
    if b < 4
      b = b + 1
    else
      b = 0
    end
  end
  
  print a,b #コンソールでシーケンスを確認
end

 

 b = 4の時のロールができたときは嬉しかったです。

慣れればもっともっと複雑なことができそう。