はじめに
Sonic Piにおいてドラムのビートを直感的に指定したい。
何拍目を音符にして何拍目を休符にするかを簡単にカスタマイズしたい。
まずはサンプルコード
live_loop :hihat do
if 'x-x-x-x-xxxxx-x-'.ring.tick == "x" then
sample :drum_cymbal_closed
end
sleep 0.25
end
4/4拍子の曲を想定としている。このコードでは4小節分のハイハットシンバルの音を指定している。
これは1, 3, 5, 7, 9, 10, 11, 12, 13, 15拍目に:drum_cymbal_closed
の音を鳴らすコードである。
例えば
if 'x-x-x-x-xxxxx-x-'.ring.tick == "x" then
の箇所を
if '-x-x-x-x-x-x-x-x'.ring.tick == "x" then
とすると、偶数拍で音が鳴るようになる。
'x'と'-'を入れ替えると音符と休符が入れ替わり、直感的にビートをカスタマイズすることができる。
解説
ring
SonicPi::Core::RingVector
というリングバッファを作成する。
これにより文字列をリングバッファに変換する。
puts '12345678'.ring
上記の出力は
(ring "1", "2", "3", "4", "5", "6", "7", "8")
である。
また、リングバッファは、指定したインデックスの値をバッファのサイズで割った余りをインデックスとして扱う。
puts '12345678'.ring[2]
puts '12345678'.ring[11]
上記の出力は
"3"
"4"
である。
tick
tickは呼び出されるたび、デフォルトのtickの値をインクリメントし、値を返す。
puts tick
puts tick
puts tick
puts tick
上記の出力は
0
1
2
3
である。tick値はlive_loopごとに独立して存在している。
そのため、tickを呼び出す際に、他のlive_loopへの影響を気にする必要はない。
また、tick_reset
やtick_set
でtick値を操作することも可能である。
まとめ
もう一度サンプルコードを示す。
live_loop :hihat do
if 'x-x-x-x-xxxxx-x-'.ring.tick == "x" then
sample :drum_cymbal_closed
end
sleep 0.25
end
Sonic Piのringとtickを組み合わせて用いることにより、このような直感的な記述が可能となる。
リングバッファはループ演奏と相性がいいため、積極的に取り入れていきたい。
さいごに
間違いや改善等ありましたら、コメントいただけますと大変嬉しいです!
参考