Generate sounds

tick

chordを覚えているでしょうか?chord関数は、ある和音の音を返します:

play (chord :c, :major).choose
# Cメジャーの和音(:c, :e, :g)のいずれかをランダムに鳴らします

また、scaleという関数もあります。scaleは、和音の音だけでなく、スケール 内の全ての音を返します:

play (scale :c, :major).choose
# Cメジャーのスケール(:c, :d, :e, :f, :g, :a, :b)のいずれかをランダムに鳴らします

chooseを使うとリストからランダムに要素を1つ取得することができます。よりリストの構造に沿って要素を取得していきたい場合、Sonic Piにはtickと呼ばれる非常に強力な関数があります:

live_loop :arp do
  play (scale :e3, :minor_pentatonic).tick, release: 0.1
  sleep 0.125
end

ここでは、E3マイナーペンタトニックスケールを取得して順に要素を取得しています。これはscaleの宣言の末尾に.tickを追加することで実現されています。tickはlive_loop内でローカルなので、複数のlive_loopがそれぞれ独立したtickを持つことができます。

live_loop :arp do
  play (scale :e3, :minor_pentatonic).tick, release: 0.1
  sleep 0.125
end

live_loop :arp2 do
  use_synth :dsaw
  play (scale :e2, :minor_pentatonic, num_octaves: 3).tick, release: 0.25
  sleep 0.25
end

リング

何かをtickしたとき、それは リング と呼ばれるものです(ええ、もちろんリストもtickできますが、その場合末尾で止まってしまいます)。リングは特殊なリストで、末尾に到達すると先頭に戻ってきます。先程の例では、スケールは末尾の音まで到達したところで先頭に戻って、再び順に要素を見ていっています。scalechordはどちらもリングを返します。リストを作成してその後リングが欲しくなった場合には、.ringをつけるかring関数を呼ぶとリングに変更できます:

puts [1, 2, 3, 4].ring #=> (ring 1, 2, 3, 4)
puts (ring 1, 2, 3, 4) #=> (ring 2, 2, 3, 4)
live_loop :arp do
  play [:c, :e, :d, :f].ring.tick, release: 0.1
  sleep 0.125
end

次の例は、少し複雑なものです。ここではchordのリストがリングになり、順にtickされていきます:

live_loop :keys do
  use_synth :blade
  play [(chord :Ab, :major7), (chord :Db, :major7), (chord :Bb, :minor7), (chord :Eb, '7')].ring.tick, attack: 0.1, release: 1
  sleep 1
end

そして、次にそれをリード’メロディー’に引き上げましょう:

live_loop :keys do
  use_synth :blade
  play [(chord :Ab, :major7), (chord :Db, :major7), (chord :Bb, :minor7), (chord :Eb, "7")].ring.tick, attack: 0.1, release: 1
  sleep 1
end

live_loop :lead do
  use_synth :dsaw
  play (scale :Ab, :major, num_octaves: 3).mirror.tick, attack: 0.05, release: 0.25, cutoff: rrand(80, 110), amp: 0.5
  sleep 0.25
end

tickして、ワイルドに行ってみよう!