Generate sounds
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できますが、その場合末尾で止まってしまいます)。リングは特殊なリストで、末尾に到達すると先頭に戻ってきます。先程の例では、スケールは末尾の音まで到達したところで先頭に戻って、再び順に要素を見ていっています。scale
とchord
はどちらもリングを返します。リストを作成してその後リングが欲しくなった場合には、.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して、ワイルドに行ってみよう!