a = (ring 76,79,84,88,91)
b = (ring 40,40,48,48,55)
count = 0
live_loop :_20171230 do
use_bpm 120
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
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進める、という展開にしてみた。