【Sonic Pi】Sonic Piでringを使う

 

a = (ring 76,79,84,88,91) #melo
b = (ring 40,40,48,48,55) #bass
count = 0 #index

live_loop :_20171230 do
  use_bpm 120
  
  #beat------------------
  in_thread do
    sample :bd_klub,amp:choose([2,3])
    4.times do
      sample :drum_cymbal_pedal,rate:3,pan: -0.3 ,amp: rrand(1,2)
      sample :drum_snare_soft, rate:2 ,pan: -0.3,amp: rrand(1,3)
      sleep choose([0.25,0.5])
      sample :drum_cymbal_pedal,rate:2,pan: -0.3, amp: rrand(0,1)
      sample :bd_klub,amp:choose([0,1])
      sleep choose([0.25,0.5])
    end
  end
  
  
  #melo & bass------------------
  
  in_thread do
    use_synth :pulse
    play a[count],pan:-0.8,amp:1.5,attack:0.1
    sleep 0.5
    play a[count],pan:0.8,attack:0.1
    sleep 0.5
  end
  
  in_thread do
    use_synth :subpulse
    rrand_i(2,5).times do
      play b[count],amp: rrand(1,2)
      sleep 0.5
    end
  end
  
  sleep 1
  
  if one_in(3) #indexの更新!!!
    count = count-1
  else
    count = count+1
  end
  
  with_fx :reverb ,room:1,damp:1 do
    play a[count],amp:2,release:3,amp:1.5
    sleep 0.5
  end
  
  
  with_fx :panslicer, wave:0,phase: 0.5  do
    use_synth :sine
    in_thread do
      rrand_i(4,18).times do
        play a[count],amp:2 ,release:0.1
        sleep 0.1
      end
    end
  end
  
  sleep 1
  print count
end

 

Sonic Piでringを使ってみた。配列のようなもの。

rubyでは環状型配列?みたいな名前でおなじみらしい。ruby使ったことないので知らなかったけど、簡単にいうと、前と後ろが繋がっている配列ということらしい。

だからリングっていうだそうです、へぇ。

通常の配列だったら順番に進んでいって最後までたどり着くと終わるが、ringの場合は頭に戻るので、ポリリズムとか拍がズレていくような表現に使えるかも。

 

配列は[a,b,c]と書くが、ringは(ring a,b,c)と書くらしい。

あるいは[a,b,c].ringって書いても良いらしい。

 

上記のコードでは、aとbというringを作成してcountというindex用の変数を使って制御している。

配列もringも play a.look(配列を進めずに出力)や、play a.tick(配列を進めて出力)といった使い方があるが、スレッドで囲ったりすると進行がリセットされてしまうので、indexという方法で使ってみた。

countという変数を使って、 play a[count] という風に使うことで、ringから任意の数値を取り出せる。countは変数なので更新したり(あるいはしなかったり)することで展開を制御する。

bにはベースラインが組まれているが、同じ変数をindexに使っているので、メロディのシーケンスと同期してベースラインも出力される。

 

今回はif文を使って、1/3の確率で進行を1戻す、それ以外は1進める、という展開にしてみた。