1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Sonic Pi】リングバッファを用いてドラムを何拍目に鳴らすか直感的に指定する

Last updated at Posted at 2023-01-05

はじめに

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_resettick_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を組み合わせて用いることにより、このような直感的な記述が可能となる。
リングバッファはループ演奏と相性がいいため、積極的に取り入れていきたい。

さいごに

間違いや改善等ありましたら、コメントいただけますと大変嬉しいです!

参考

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?