さてスケージューリングについて書いてきましたが、実際に音のパラメータへの値の受け渡しをやっていませんでした。 Patternオブジェクトが力を発揮するのもこのパラメータへの値の受け渡しの部分でしょう。 まず簡単なSynthDefを用意しておきましょう。
( SynthDef( "testSynth", {arg freq = 1200, amp = 0.3; var src, env; src = SinOsc.ar( freq , 0 , amp ); env = EnvGen.ar( Env.perc( 0, 1, 1, -12 ), doneAction:2 ); Out.ar( 0 , src * env ); }).store; ) ここでSynthDefにはあらかじめ外部からアクセスしたい値を引数として用意しておきます(argで定義します) ここではfreqとampを用意しました。初期値を代入しておくと、パラメータが渡されなかった場合に初期値が使われます。
前回のRoutineを使ったシーケンスで試してみましょう。
( var freqPattern; freqPattern = Pseq([ 400, 500, 600, 700 ],inf).asStream; r = Routine({ loop{ Synth.new( "testSynth" , [ \freq, freqPattern.next ] ); 0.5.wait; } }).play; )
r.stop; Synthクラスを使うとシンセの生成をします、ノードナンバーの指定など自動で行ってくれます。 Synth.new( "testSynth" , [ \freq, freqPattern.next ] ); このとき引数に渡す値を指定出来ます。バックスラッシュ+SynthDefに用意した引数の名前(シンボルといいます*1)で指定します。 第二引数に配列で、シンボル, 値, シンボル, 値... と対になるように書きます。 [ \freq, freqPattern.next ]
さて、同じことをPatternオブジェクトのみで行えます。Patternクラスにはplayで再生出来るEventStreamPlayerというオブジェクトがあります*2。 シンボル名を指定してシンセの引数に渡してくれるPbindクラスを使ってみましょう。
( Pbind( \instrument, "testSynth" , \freq, Pseq([ 400, 500, 600, 700 ],inf), \dur, 0.5 ).play; ) Pbindの引数は先ほどSynthクラスの第二引数のようにシンボル, 値, シンボル, 値... と対になるように書きます。 ここではいくつかのシンボル名は特別な意味を持っています*3。上の例では、 \instrument : SynthDef名 \dur : 次のイベントまでの時間 です。 他にもいくつかのシンボルは特別な意味を持ちますが、自分でSynthDefの引数としてデザインした名前は指定して値を渡す事ができます。 上の例では\freqと\ampが自分がデザインしたものとして使用出来ます。
PbindはPatternオブジェクトなので他のPatternオブジェクトに入れ子にしたりできます。 これを使って、楽器のパートごとにイベントをつくったりいくつものパターンを同時に再生したりできます。 Pparは平行してパターンを再生出来ます。
( Ppar( [ Pbind( \instrument, "testSynth" , \freq, Pseq([ 400, 500, 600, 700 ],inf), \dur, 0.5 ),
Pbind( \instrument, "testSynth" , \freq, Pseq([ 4000, 5000, 6000, 7000 ],inf), \dur, 0.25 ) ]
).play; ) 違うパターンを持ったPbindを並列で並べてみました。
Pseqで直列に並べてみましょう。
( Pseq( [ Pbind( \instrument, "testSynth" , \freq, Pseq([ 400, 500, 600, 700 ],1), \dur, 0.5 ),
Pbind( \instrument, "testSynth" , \freq, Pseq([ 4000, 5000, 6000, 7000 ],1), \dur, 0.25 ) ]
).play; )
さてこのように入れ子を使って複雑なパターンを作り出せます。Pで始まるPatternクラスはほかにもいろいろありますので、 自分の目的にあったものを探して研究してみると良いと思います。
*1シンボル(Symbol)はイベントプレイヤーが使うDictionaryのkey valueです。playされた各イベントはシンセを呼ぶ際このkey valueを参照して値を渡します。 *2通常PatternクラスをplayするとEventStreamPlayerを返します
*3\freqも特別なシンボルです。default SynthDefなどでは周波数として使われます。