pdをやりなおす(3)

制御オブジェクト

#N canvas 0 0 450 300 12; #X obj 200 71 key; #X floatatom 119 127 5 0 0 0 - - -; #X obj 200 131 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 200 169 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X floatatom 200 207 5 0 0 0 - - -; #X obj 278 127 > 53; #X obj 278 169 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X connect 0 0 1 0; #X connect 0 0 2 0; #X connect 0 0 5 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 5 0 6 0;

keyはキーボードからの入力を文字コードで出力する。
文字コードを左側のナンバーボックスで見ることができる。


次に、中央の列にbangがある。
bangは数値等の値を受けて、その内容に関係なくbangとして出力する。


bangの下にトグルが続いているが、もし何かの値を受けてスイッチしたい場合は、このように手前にbangを置く必要がある。
トグルはintと同様に数値を格納している(トグルの下のナンバーボックスを確認)。


右側の「> 53」は比較演算子である。
この場合、53より大きい数値を受けると1(真)、そうでなければ0(偽)を返す。
キー入力では、例えば0〜5のキーで偽となる。


比較演算子は他にもいくつかある。

#N canvas 0 0 450 300 12; #X obj 205 108 ==; #X obj 261 49 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 205 146 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 187 185 *~; #X obj 261 146 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 243 185 *~; #X obj 204 230 dac~; #X obj 261 108 !=; #X obj 118 146 osc~ 440; #X connect 0 0 2 0; #X connect 1 0 0 0; #X connect 1 0 7 0; #X connect 2 0 3 1; #X connect 3 0 6 0; #X connect 4 0 5 1; #X connect 5 0 6 1; #X connect 7 0 4 0; #X connect 8 0 3 0; #X connect 8 0 5 0;


比較演算子を使ったゲートの例。
一番上のトグルを繰り返しクリックすると左右のチャンネルに切り替わる。
「==」は二つの値が等しい場合、「!=」は二つの値が異なる場合に1を返す。
ここでは引数を省略しているので、それぞれ「== 0」「!= 0」の意味になる。

#N canvas 0 0 586 427 12; #X obj 290 56 hradio 15 1 0 4 empty empty empty 0 -8 0 10 -262144 -1 -1 0; #X obj 158 248 *~; #X obj 108 119 noise~; #X obj 108 172 lop~ 500; #X obj 272 248 *~; #X obj 389 248 *~; #X obj 222 172 hip~ 500; #X obj 339 172 bp~ 500 10; #X obj 249 340 dac~; #X obj 273 296 /~ 4; #X obj 176 208 == 1; #X obj 290 208 == 2; #X obj 407 208 == 3; #X floatatom 378 103 5 0 0 0 - - -; #X connect 0 0 10 0; #X connect 0 0 11 0; #X connect 0 0 12 0; #X connect 0 0 13 0; #X connect 1 0 9 0; #X connect 2 0 3 0; #X connect 2 0 6 0; #X connect 2 0 7 0; #X connect 3 0 1 0; #X connect 4 0 9 0; #X connect 5 0 9 0; #X connect 6 0 4 0; #X connect 7 0 5 0; #X connect 9 0 8 0; #X connect 9 0 8 1; #X connect 10 0 1 1; #X connect 11 0 4 1; #X connect 12 0 5 1;


同じく比較演算子によるゲートの例。
一番上にあるのはラジオボタン。プロパティからボタンの個数を設定できる。
ボタンは整数を出力する。ボタン操作で3種のフィルタを切り替えて聴き比べられる。

#N canvas 0 0 450 300 12; #X obj 155 70 key; #X obj 155 121 select 49 50 51; #X obj 155 170 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 155 208 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 189 170 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 189 208 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 223 170 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 223 208 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X floatatom 257 170 5 0 0 0 - - -; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 4 0; #X connect 1 2 6 0; #X connect 1 3 8 0; #X connect 2 0 3 0; #X connect 4 0 5 0; #X connect 6 0 7 0;


selectは引数にある値と同じ値を受けた場合に、対応するアウトレットからbangを出力する。
右端のアウトレットは、引数に含まれない値を受けた場合に、これを返す。
この例では1,2,3のキーをタイプすることでトグルを操作できる。

#N canvas 0 0 450 300 12; #X obj 94 179 print; #X floatatom 94 87 5 0 0 0 - - -; #X obj 147 87 key; #X obj 149 179 s hoge; #X obj 253 87 r hoge; #X obj 253 134 unpack f i; #X obj 94 134 pack f i; #X floatatom 253 179 5 0 0 0 - - -; #X floatatom 320 179 5 0 0 0 - - -; #X connect 1 0 6 0; #X connect 2 0 6 1; #X connect 4 0 5 0; #X connect 5 0 7 0; #X connect 5 1 8 0; #X connect 6 0 0 0; #X connect 6 0 3 0;


packは複数の値をまとめ、unpackはまとめられた値を分解する。
引数で値の形式を指定する。


まずナンバーボックスをドラッグすると、コンソールに数値が表示される。
表示はふたつの数値の組になっている。ふたつ目の数値はキー入力に従う。
右インレットはcoldなので、左インレットに入力があった時だけ出力することがわかる。


また、packの出力は「s hoge」から「r hoge」に流れている(それぞれsend、receiveの省略形)。
unpackのそれぞれのアウトレットから分解された値が出力される。

#N canvas 0 0 450 300 12; #X obj 185 121 pack i 1000; #X obj 185 170 line; #X floatatom 185 221 5 0 0 0 - - -; #X obj 185 71 key; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 3 0 0 0;


packとlineの組み合わせ例。
lineは数値の組を受け取って動作するが、ここではpackから直接受けている。
キー入力するとその文字コードの値まで、1秒をかけて移動する。

#N canvas 0 0 450 300 12; #X obj 163 132 pack i f; #X obj 163 175 route 49 50; #X obj 163 49 key; #X floatatom 113 94 5 0 0 0 - - -; #X floatatom 163 224 5 0 0 0 - - -; #X floatatom 212 224 5 0 0 0 - - -; #X floatatom 267 224 5 0 0 0 - - -; #X floatatom 228 49 5 0 0 0 - - -; #X obj 228 89 t b f; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 1 1 5 0; #X connect 1 2 6 0; #X connect 2 0 0 0; #X connect 2 0 3 0; #X connect 7 0 8 0; #X connect 8 0 0 0; #X connect 8 1 0 1;


routeも値の組を受け取って動作する。
最初の値に従って出力するアウトレットを変え、2番目以降の値を振り分ける。
ここでは1か2のキーで出力先を変えている。
「t b f」の上のナンバーボックスをドラッグすると、対応するアウトレットから出力する。

#N canvas 0 0 450 300 12; #X floatatom 303 194 5 0 0 0 - - -; #X obj 303 111 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X floatatom 372 194 5 0 0 0 - - -; #X obj 372 111 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X floatatom 48 194 5 0 0 0 - - -; #X floatatom 48 73 5 0 0 0 - - -; #X floatatom 122 194 5 0 0 0 - - -; #X floatatom 122 73 5 0 0 0 - - -; #X obj 48 111 s xx; #X obj 48 152 r xx; #X obj 122 111 s xx; #X obj 122 152 r xx; #X obj 303 152 v yy; #X obj 372 152 v yy; #X floatatom 223 73 5 0 0 0 - - -; #X obj 223 111 v yy; #X connect 1 0 12 0; #X connect 3 0 13 0; #X connect 5 0 8 0; #X connect 7 0 10 0; #X connect 9 0 4 0; #X connect 11 0 6 0; #X connect 12 0 0 0; #X connect 13 0 2 0; #X connect 14 0 15 0;


数値等の値を扱うsendはsend~と異なり、同じ名前のものを複数作れる。


次に、value(vは省略形)はいわばプログラムにおける変数の役割をする。
send、receiveと似ているが、bangを受けた時だけ値を出力する。
また単体で格納も呼び出しも行なう。

#N canvas 0 0 450 300 12; #X obj 155 208 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 206 71 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 262 209 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 262 157 *; #X obj 155 156 spigot; #X obj 194 123 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X connect 1 0 3 0; #X connect 1 0 4 0; #X connect 3 0 2 0; #X connect 4 0 0 0; #X connect 5 0 4 1;


bangは特殊な値であり、例えばこのように、0を掛け算して遮断する、ということができない。
spigotは右インレットの値に従ってbangを遮断することができる。
トグルのオン・オフでbangの流れが変わるのを確認する。

#N canvas 0 0 450 300 12; #X floatatom 167 70 0 0 0 0 - - -; #X obj 72 70 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 100 118 delay 1000; #X obj 72 174 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X floatatom 345 70 0 0 0 0 - - -; #X obj 246 70 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X obj 278 118 delay 1000; #X obj 246 174 timer; #X floatatom 246 212 5 0 0 0 - - -; #X connect 0 0 2 1; #X connect 1 0 2 0; #X connect 1 0 3 0; #X connect 2 0 3 0; #X connect 4 0 6 1; #X connect 5 0 6 0; #X connect 5 0 7 0; #X connect 6 0 7 1; #X connect 7 0 8 0;


delayは値を受け取った時点から、引数で指定された時間後にbangを遅れて返す。
時間指定は右インレットから変更できる。
ここでは、まず最初にトグルに直接bangが入り、次にdelayから再びbangが入る。
従って一定時間だけトグルがオンになる仕組みになっている。


timerはふたつのbangの時間間隔を測る。

#N canvas 0 0 450 300 12; #X floatatom 175 75 0 0 0 0 - - -; #X obj 115 122 pipe 1000; #X floatatom 115 75 5 0 0 0 - - -; #X floatatom 115 171 5 0 0 0 - - -; #X obj 261 121 until; #X obj 261 164 i; #X obj 313 164 + 1; #X msg 261 74 5; #X floatatom 261 217 5 0 0 0 - - -; #X connect 0 0 1 1; #X connect 1 0 3 0; #X connect 2 0 1 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 5 0 8 0; #X connect 6 0 5 1; #X connect 7 0 4 0;


pipeは入力された値を、指定した時間後に遅れて返す。
時間指定は右インレットから変更できる。
ナンバーボックスをドラッグすると、同じ動きがそのまま遅延して出力されるのが確認できる。


untilは入力された数だけ繰り返しbangを出力する。繰り返しは一瞬で行なわれる。
もし引数も停止機構もなしにbangを与えると一瞬で膨大なbangが生成され、PCがフリーズするので注意。

#N canvas 0 0 450 300 12; #X obj 158 140 openpanel; #X symbolatom 158 184 0 0 0 0 - - -; #X obj 158 97 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X msg 214 95 symbol C:/; #X connect 0 0 1 0; #X connect 2 0 0 0; #X connect 3 0 0 0;


openpanelは「ファイルを開く」ダイアログを表示、選択したファイルのパスを出力する。
soundfilerにパスを与えて音声ファイルを読み込む、などの用法がある。

#N canvas 0 0 450 300 12; #X msg 233 127 \; pd dsp \$1; #X obj 233 78 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 130 78 noise~; #X obj 132 176 dac~; #X obj 131 123 /~ 10; #X connect 1 0 0 0; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 4 0 3 1;


メッセージボックスを使った小技。トグル操作でpdのオーディオ処理を開始・中止できる。
「; pd dsp $1」のうち$1が変数であり、トグルの値が代入される。


このようにpdでは$記号が変数の印として随所に用いられる。変数の詳細は以下を参照。
File>Open>doc>2.control.examples>14.dollarsigns.pd


pdのexampleファイルには、これと同様のメッセージをloadbangで叩いて、パッチを開くと同時にオーディオを開始するものもある。
ただし自作のパッチにおいて、バグ取りが完全でない場合は使うべきではないと考える。


プログラムとは、単に上から実行するだけでなく、同じ処理を繰り返したり、条件によって処理を変えたりする(制御構造)。
こうした機能を持つものを仮に制御オブジェクトと呼ぶなら、pdのオブジェクトの大部分が制御オブジェクトと言える。
(音を出すオブジェクトはosc~、phasor~、noise~の3種のみ)
今回はその一部の、最も基本的なものだけを示したが、ほとんどの処理は以上で作ることができると考える。