演奏

パッチへの介入

pdでの演奏は換言すればパッチへの介入と言える。パッチの起動、パッチ上での値の変更、パッチの終了はこれに含まれる。既に起動している、あるひとつのパッチへの介入手段については、1)マウスやトラックボールなどポインティングデバイスを用いた、GUIオブジェクトの操作(あるいはパッチの書き換え)、2)「key」オブジェクトなどを用いたPCキーボード操作、3)「notein」オブジェクトなどを用いたMIDI機器操作、4)「fiddle~」などを用いた外部入力音声による操作、などが考えられる。

少なからずパッチの中に自動化された処理が含まれているために、pdでの演奏は、自動演奏や作曲の要素がいつでも混在しており、明確な境界線を引くことは考えがたい。演奏のその場で0からパッチを書くという稀な場合を除けば、pdでの演奏は、予め自ら用意した枠組みへの介入ということになる。何も介入する余地が無ければ、そのパッチを作曲作品だということにしてもいい。また複数のパッチを渡り歩くことも、演奏のうちに数えられる。

例えば同様のキーボード操作によって、周波数を決定する場合もあれば、音声ファイルを選択し再生を開始する場合もあり得る。これら「何を演奏するか」という問題については既に述べたと考えるので、ここで問題としたいのは「どう演奏するか」、パッチの操作方法について考える。

PCキーボード、MIDI機器による操作は「key」「notein」などオブジェクトの説明で確認済みとしてここでは述べない。またシーケンスの作成、乱数の扱いに関して若干例を示す。

XYコントローラ

#N canvas 0 0 440 400 10; #X obj 159 31 r xy1; #X obj 159 61 unpack; #X floatatom 159 94 5 0 0 0 - - -; #X floatatom 196 94 5 0 0 0 - - -; #X obj 37 61 metro 100; #X obj 37 31 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X msg 37 94 \; cnv get_pos; #N canvas 0 0 462 312 DAC 0; #X obj 175 248 dac~; #X obj 175 205 *~; #X obj 194 172 inlet~; #X obj 234 205 *~; #X obj 253 172 inlet~; #X obj 175 61 inlet; #X obj 175 108 lop~ 5; #X obj 69 124 > 0; #X msg 69 162 \; pd dsp \$1; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 0 1; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 6 0; #X connect 6 0 1 0; #X connect 6 0 3 0; #X connect 7 0 8 0; #X restore 38 300 pd DAC; #X obj 38 154 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 249 186 /~ 3; #N canvas 0 0 299 267 perc 0; #X obj 138 183 *~; #X obj 138 212 outlet~; #X obj 151 77 osc~; #X obj 93 77 phasor~; #X obj 93 106 expr~ pow($v1 \, 4); #X obj 151 19 inlet; #X obj 93 19 inlet; #X obj 92 138 lop~ 100; #X obj 93 48 / -20; #X obj 151 48 * 10; #X connect 0 0 1 0; #X connect 2 0 0 1; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 9 0; #X connect 6 0 8 0; #X connect 7 0 0 0; #X connect 8 0 3 0; #X connect 9 0 2 0; #X restore 159 127 pd perc; #X obj 248 61 unpack; #X floatatom 248 94 5 0 0 0 - - -; #X floatatom 285 94 5 0 0 0 - - -; #X obj 333 61 unpack; #X floatatom 333 94 5 0 0 0 - - -; #X floatatom 370 94 5 0 0 0 - - -; #X obj 248 31 r xy2; #X obj 333 31 r xy3; #N canvas 460 0 500 600 Pd 1; #X obj 25 31 cnv 36 36 36 xy1 cnv 1 10 18 2 28 -260818 -262144 0; #X obj 64 69 cnv 36 36 36 xy2 cnv 2 10 18 2 28 -24198 -262144 0; #X obj 102 108 cnv 36 36 36 xy3 cnv 3 10 18 2 28 -250685 -262144 0; #X restore 367 300 pd; #N canvas 0 0 299 267 perc 0; #X obj 138 183 *~; #X obj 138 212 outlet~; #X obj 151 77 osc~; #X obj 93 77 phasor~; #X obj 93 106 expr~ pow($v1 \, 4); #X obj 151 19 inlet; #X obj 93 19 inlet; #X obj 92 138 lop~ 100; #X obj 93 48 / -20; #X obj 151 48 * 10; #X connect 0 0 1 0; #X connect 2 0 0 1; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 9 0; #X connect 6 0 8 0; #X connect 7 0 0 0; #X connect 8 0 3 0; #X connect 9 0 2 0; #X restore 248 127 pd perc; #N canvas 0 0 299 267 perc 0; #X obj 138 183 *~; #X obj 138 212 outlet~; #X obj 151 77 osc~; #X obj 93 77 phasor~; #X obj 93 106 expr~ pow($v1 \, 4); #X obj 151 19 inlet; #X obj 93 19 inlet; #X obj 92 138 lop~ 100; #X obj 93 48 / -20; #X obj 151 48 * 10; #X connect 0 0 1 0; #X connect 2 0 0 1; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 9 0; #X connect 6 0 8 0; #X connect 7 0 0 0; #X connect 8 0 3 0; #X connect 9 0 2 0; #X restore 333 127 pd perc; #X connect 0 0 1 0; #X connect 1 0 2 0; #X connect 1 1 3 0; #X connect 2 0 10 0; #X connect 3 0 10 1; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 8 0 7 0; #X connect 9 0 7 2; #X connect 9 0 7 1; #X connect 10 0 9 0; #X connect 11 0 12 0; #X connect 11 1 13 0; #X connect 12 0 20 0; #X connect 13 0 20 1; #X connect 14 0 15 0; #X connect 14 1 16 0; #X connect 15 0 21 0; #X connect 16 0 21 1; #X connect 17 0 11 0; #X connect 18 0 14 0; #X connect 20 0 9 0; #X connect 21 0 9 0;

複数の値の同時操作は、より動的な演奏を意味する。物理的にはMIDIフェーダーなどを用いることで実現可能と思える。一方ポインティングデバイスでの操作について、bang、トグル、ナンバーボックス、スライダはいずれにしても同時にひとつの値のみ操作する(当然、分岐によって、結果として複数値が同時に変化することはあり得る)。Canvasを用いたXYコントローラは、少なくともふたつの値を同時に操作できる。

この例では、まず「metro」を開始することで、サブパッチに置かれたCanvasへメッセージ「get_pos」を送り問い合わせを行なう。各Canvasが返してくる数値リストは、パッチ上でのCanvasの縦横の位置(座標)である。例ではこの値を用いて音高とテンポの操作を行なっているが、当然、値の操作の結果するものが別様であってもよく、この事は以下全てに共通する。尚、Canvasを動かすには、編集モードに入る必要がある。囲み選択で複数のCanvasを同時に動かすこともできる。

ところで目次に"trigon"として挙げてあるパッチは、Canvasではなく図形データ構造を用いて、同様の操作系を作っている。三角形の各角の座標で音源の操作を行なう。現状、図形データ構造の使用は理解し難いものであるためここでは述べない。図形データ構造の詳細はPd Documentation(pd\doc\1.manual\index.htm) 2.9. Data structures。

グラフシーケンサ

#N canvas -2 -5 833 626 10; #N canvas 0 0 462 312 DAC 0; #X obj 175 248 dac~; #X obj 175 205 *~; #X obj 194 172 inlet~; #X obj 234 205 *~; #X obj 253 172 inlet~; #X obj 175 61 inlet; #X obj 175 108 lop~ 5; #X obj 69 124 > 0; #X msg 69 162 \; pd dsp \$1; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 0 1; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 6 0; #X connect 6 0 1 0; #X connect 6 0 3 0; #X connect 7 0 8 0; #X restore 57 371 pd DAC; #X obj 57 225 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 6900 1; #N canvas 0 0 450 300 graph1 0; #X array q1 131 float 0; #X coords 0 1 130 0 262 100 1; #X restore 320 57 graph; #X obj 126 133 osc~; #X obj 125 170 *~; #X obj 125 207 +~; #X obj 124 242 osc~; #X obj 185 90 r~ a1; #X obj 124 281 *~; #X obj 605 57 hsl 128 15 0 5 0 0 empty empty speed -2 -6 0 8 -261681 -1 -1 300 1; #X obj 602 82 tabosc4~ q1; #X obj 602 109 *~; #X obj 635 109 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0 10 -261681 -1 -1 -364 256; #X msg 710 123 \; q1 const 0; #N canvas 0 0 450 300 graph1 0; #X array q2 131 float 0; #X coords 0 1 130 0 262 100 1; #X restore 320 179 graph; #X obj 605 179 hsl 128 15 0 5 0 0 empty empty speed -2 -6 0 8 -261681 -1 -1 600 1; #X obj 602 231 *~; #X obj 635 231 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0 10 -261681 -1 -1 9999 256; #N canvas 0 0 450 300 graph1 0; #X array q3 131 float 0; #X coords 0 1 130 0 262 100 1; #X restore 322 302 graph; #X obj 607 302 hsl 128 15 0 5 0 0 empty empty speed -2 -6 0 8 -261681 -1 -1 3300 1; #X obj 604 354 *~; #X obj 637 354 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0 10 -261681 -1 -1 396 256; #N canvas 0 0 450 300 graph1 0; #X array q4 131 float 0; #X coords 0 1 130 0 262 100 1; #X restore 322 427 graph; #X obj 607 427 hsl 128 15 0 5 0 0 empty empty speed -2 -6 0 8 -261681 -1 -1 600 1; #X obj 602 204 tabosc4~ q2; #X obj 602 258 s~ a2; #X obj 602 136 s~ a1; #X msg 712 246 \; q2 const 0; #X obj 604 327 tabosc4~ q3; #X obj 604 381 s~ a3; #X msg 712 371 \; q3 const 0; #X obj 604 452 tabosc4~ q4; #X obj 604 506 s~ a4; #X msg 712 493 \; q4 const 0; #X obj 184 133 r~ a2; #X obj 183 170 r~ a3; #X obj 183 242 r~ a4; #X obj 604 479 max~ 0; #X connect 1 0 0 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 6 0 8 0; #X connect 7 0 3 0; #X connect 8 0 0 1; #X connect 8 0 0 2; #X connect 9 0 10 0; #X connect 10 0 11 0; #X connect 11 0 26 0; #X connect 12 0 11 1; #X connect 15 0 24 0; #X connect 16 0 25 0; #X connect 17 0 16 1; #X connect 19 0 28 0; #X connect 20 0 29 0; #X connect 21 0 20 1; #X connect 23 0 31 0; #X connect 24 0 16 0; #X connect 28 0 20 0; #X connect 31 0 37 0; #X connect 34 0 4 1; #X connect 35 0 5 1; #X connect 36 0 8 1; #X connect 37 0 32 0;

この例ではグラフと「tabosc4~」を用いて、複数の値を同時に動かす方法を示す。「tabosc4~」の周波数、グラフへの適当な描画、「tabosc4~」の出力の乗算により、単純FMの各係数と音量を操作している。グラフに描画した値は、放って置けば繰り返しになるが、常に書き換えが可能であるため即興性も含む。また「tabosc4~」の周波数が各々異なることで周期のずれが生じ、反復を基礎としながら毎時異なる結果に至る。このような反復のポリフォニーは、少ないデータから莫大な変化を得るための常套手段である。

ステップシーケンサ

#N canvas 0 0 608 670 10; #N canvas 0 0 462 312 DAC 0; #X obj 175 248 dac~; #X obj 175 205 *~; #X obj 194 172 inlet~; #X obj 234 205 *~; #X obj 253 172 inlet~; #X obj 175 61 inlet; #X obj 175 108 lop~ 5; #X obj 69 124 > 0; #X msg 69 162 \; pd dsp \$1; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 0 1; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 6 0; #X connect 6 0 1 0; #X connect 6 0 3 0; #X connect 7 0 8 0; #X restore 69 555 pd DAC; #X obj 69 409 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 7700 1; #X obj 153 367 vsl 15 128 0 8 0 0 empty empty mod 0 -8 0 8 -262144 -1 -1 600 1; #X obj 183 367 vsl 15 128 0 10000 0 0 empty empty hi 0 -8 0 8 -262144 -1 -1 8000 1; #X obj 214 367 vsl 15 128 0 1000 0 0 empty empty decay 0 -8 0 8 -262144 -1 -1 2500 1; #X obj 434 436 f; #X obj 446 466 + 1; #X obj 485 466 % 16; #X msg 483 347 15000; #X obj 483 376 /; #X msg 393 376 0; #X obj 434 407 metro; #X obj 434 317 tgl 15 0 empty empty qo 0 -6 0 8 -261681 -1 -1 1 1; #X obj 393 347 sel 1; #N canvas 0 0 450 300 graph1 0; #X array note 16 float 0; #X coords 0 24 15 0 400 100 1; #X restore 70 134 graph; #N canvas 0 0 555 269 rhythm 0; #X obj 20 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X msg 20 148 \$1 0; #X obj 53 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 87 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 120 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 154 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 187 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 220 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 253 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 286 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 319 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 351 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 384 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 417 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 450 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 483 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 516 125 tgl 20 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X msg 53 148 \$1 1; #X msg 87 148 \$1 2; #X msg 120 148 \$1 3; #X msg 154 148 \$1 4; #X msg 187 148 \$1 5; #X msg 220 148 \$1 6; #X msg 253 148 \$1 7; #X msg 286 148 \$1 8; #X msg 319 148 \$1 9; #X msg 351 148 \$1 10; #X msg 384 148 \$1 11; #X msg 417 148 \$1 12; #X msg 450 148 \$1 13; #X msg 483 148 \$1 14; #X msg 516 148 \$1 15; #X obj 274 252 tabwrite q1; #X connect 0 0 1 0; #X connect 1 0 32 0; #X connect 2 0 17 0; #X connect 3 0 18 0; #X connect 4 0 19 0; #X connect 5 0 20 0; #X connect 6 0 21 0; #X connect 7 0 22 0; #X connect 8 0 23 0; #X connect 9 0 24 0; #X connect 10 0 25 0; #X connect 11 0 26 0; #X connect 12 0 27 0; #X connect 13 0 28 0; #X connect 14 0 29 0; #X connect 15 0 30 0; #X connect 16 0 31 0; #X connect 17 0 32 0; #X connect 18 0 32 0; #X connect 19 0 32 0; #X connect 20 0 32 0; #X connect 21 0 32 0; #X connect 22 0 32 0; #X connect 23 0 32 0; #X connect 24 0 32 0; #X connect 25 0 32 0; #X connect 26 0 32 0; #X connect 27 0 32 0; #X connect 28 0 32 0; #X connect 29 0 32 0; #X connect 30 0 32 0; #X connect 31 0 32 0; #X coords 0 0 1 1 400 50 1; #X restore 69 32 pd rhythm; #X obj 357 528 tabread q1; #X obj 357 623 s at; #X obj 434 622 s nt; #X obj 123 367 vsl 15 128 0 127 0 0 empty empty key 0 -8 0 8 -262144 -1 -1 8000 1; #X obj 357 564 sel 1; #X floatatom 434 499 5 0 0 0 - - -; #X obj 497 317 nbx 5 14 -1e+037 1e+037 0 0 empty empty bpm 0 -6 0 10 -261681 -1 -1 166 256; #X obj 434 564 spigot; #X obj 434 593 i; #N canvas 0 0 454 304 graph1 0; #X array q1 16 float 0; #X coords 0 1 15 0 50 50 1; #X restore 495 32 graph; #X obj 434 528 tabread note; #N canvas 0 0 469 457 _______fmperc 0; #X obj 103 153 osc~; #X obj 104 273 +~; #X obj 104 310 osc~; #X obj 273 120 line~; #X obj 105 359 *~; #X msg 273 91 \$1 \, \$2 \$3; #X obj 273 62 pack 1 0 f; #X obj 348 29 inlet; #X obj 203 79 inlet; #X obj 151 79 inlet; #X obj 105 395 outlet~; #X obj 397 29 r at; #X obj 32 55 r nt; #X obj 151 191 t b f; #X obj 32 116 mtof; #X obj 140 232 /; #X obj 74 55 inlet; #X obj 32 87 +; #X obj 103 191 *~; #X obj 103 232 *~; #X connect 0 0 18 0; #X connect 1 0 2 0; #X connect 2 0 4 0; #X connect 3 0 4 1; #X connect 3 0 18 1; #X connect 4 0 10 0; #X connect 5 0 3 0; #X connect 6 0 5 0; #X connect 7 0 6 2; #X connect 8 0 19 1; #X connect 9 0 13 0; #X connect 11 0 6 0; #X connect 12 0 17 0; #X connect 13 0 15 0; #X connect 13 1 15 1; #X connect 14 0 0 0; #X connect 14 0 15 0; #X connect 15 0 1 1; #X connect 16 0 17 1; #X connect 17 0 14 0; #X connect 18 0 19 0; #X connect 19 0 1 0; #X restore 123 510 pd _______fmperc; #X msg 488 204 \; note const 1; #X connect 1 0 0 0; #X connect 2 0 27 1; #X connect 3 0 27 2; #X connect 4 0 27 3; #X connect 5 0 6 0; #X connect 5 0 21 0; #X connect 6 0 7 0; #X connect 7 0 5 1; #X connect 8 0 9 0; #X connect 9 0 11 1; #X connect 10 0 5 0; #X connect 11 0 5 0; #X connect 12 0 13 0; #X connect 12 0 11 0; #X connect 13 0 10 0; #X connect 13 0 11 0; #X connect 16 0 20 0; #X connect 16 0 23 1; #X connect 19 0 27 0; #X connect 20 0 17 0; #X connect 21 0 16 0; #X connect 21 0 26 0; #X connect 22 0 8 0; #X connect 22 0 9 1; #X connect 23 0 24 0; #X connect 24 0 18 0; #X connect 26 0 23 0; #X connect 27 0 0 2; #X connect 27 0 0 1;

グラフシーケンサを発展させて、簡単なステップシーケンサを作っている。「pd rhythm」のトグル列でリズムを決定し、グラフ「note」で音の高さを決定する。「metro」を用いたカウンタでグラフを読み出している。読み出した値は「pd fmperc」に送られる。ここで、リズムや音の高さ、音色などを随時変更することを、演奏と呼ぶことができる。

#N canvas 0 0 612 674 10; #N canvas 0 0 462 312 DAC 0; #X obj 175 248 dac~; #X obj 175 205 *~; #X obj 194 172 inlet~; #X obj 234 205 *~; #X obj 253 172 inlet~; #X obj 175 61 inlet; #X obj 175 108 lop~ 5; #X obj 69 124 > 0; #X msg 69 162 \; pd dsp \$1; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 0 1; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 6 0; #X connect 6 0 1 0; #X connect 6 0 3 0; #X connect 7 0 8 0; #X restore 69 555 pd DAC; #X obj 69 409 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 4800 1; #X obj 153 367 vsl 15 128 0 8 0 0 empty empty mod 0 -8 0 8 -262144 -1 -1 4500 1; #X obj 183 367 vsl 15 128 0 10000 0 0 empty empty hi 0 -8 0 8 -262144 -1 -1 5500 1; #X obj 214 367 vsl 15 128 0 1000 0 0 empty empty decay 0 -8 0 8 -262144 -1 -1 8000 1; #X obj 435 409 f; #X obj 447 439 + 1; #X obj 486 439 % 16; #X msg 484 320 15000; #X obj 484 349 /; #X msg 394 349 0; #X obj 435 380 metro; #X obj 435 290 tgl 15 0 empty empty qo 0 -6 0 8 -261681 -1 -1 1 1; #X obj 394 320 sel 1; #N canvas 0 0 450 300 graph1 0; #X array note 16 float 0; #X coords 0 24 15 0 400 100 1; #X restore 70 134 graph; #X obj 338 628 s at; #X obj 435 629 s nt; #X obj 123 367 vsl 15 128 0 127 0 0 empty empty key 0 -8 0 8 -262144 -1 -1 5900 1; #X obj 338 599 sel 1; #X floatatom 435 472 5 0 0 0 - - -; #X obj 498 290 nbx 5 14 -1e+037 1e+037 0 0 empty empty bpm 0 -6 0 10 -261681 -1 -1 153 256; #X obj 435 571 spigot; #X obj 435 600 i; #N canvas 0 0 454 304 graph1 0; #X array prob 16 float 0; #X coords 0 100 15 0 400 100 1; #X restore 69 19 graph; #X obj 435 503 tabread note; #N canvas 0 0 469 457 _______fmperc 0; #X obj 103 153 osc~; #X obj 104 273 +~; #X obj 104 310 osc~; #X obj 273 120 line~; #X obj 105 359 *~; #X msg 273 91 \$1 \, \$2 \$3; #X obj 273 62 pack 1 0 f; #X obj 348 29 inlet; #X obj 203 79 inlet; #X obj 151 79 inlet; #X obj 105 395 outlet~; #X obj 397 29 r at; #X obj 32 55 r nt; #X obj 151 191 t b f; #X obj 32 116 mtof; #X obj 140 232 /; #X obj 74 55 inlet; #X obj 32 87 +; #X obj 103 191 *~; #X obj 103 232 *~; #X connect 0 0 18 0; #X connect 1 0 2 0; #X connect 2 0 4 0; #X connect 3 0 4 1; #X connect 3 0 18 1; #X connect 4 0 10 0; #X connect 5 0 3 0; #X connect 6 0 5 0; #X connect 7 0 6 2; #X connect 8 0 19 1; #X connect 9 0 13 0; #X connect 11 0 6 0; #X connect 12 0 17 0; #X connect 13 0 15 0; #X connect 13 1 15 1; #X connect 14 0 0 0; #X connect 14 0 15 0; #X connect 15 0 1 1; #X connect 16 0 17 1; #X connect 17 0 14 0; #X connect 18 0 19 0; #X connect 19 0 1 0; #X restore 123 510 pd _______fmperc; #X msg 488 204 \; note const 1; #X obj 351 503 tabread prob; #X obj 279 503 random 100; #X obj 338 535 <; #X msg 484 88 \; prob const 10; #X connect 1 0 0 0; #X connect 2 0 25 1; #X connect 3 0 25 2; #X connect 4 0 25 3; #X connect 5 0 6 0; #X connect 5 0 19 0; #X connect 6 0 7 0; #X connect 7 0 5 1; #X connect 8 0 9 0; #X connect 9 0 11 1; #X connect 10 0 5 0; #X connect 11 0 5 0; #X connect 11 0 28 0; #X connect 12 0 13 0; #X connect 12 0 11 0; #X connect 13 0 10 0; #X connect 13 0 11 0; #X connect 17 0 25 0; #X connect 18 0 15 0; #X connect 19 0 24 0; #X connect 19 0 27 0; #X connect 20 0 8 0; #X connect 20 0 9 1; #X connect 21 0 22 0; #X connect 22 0 16 0; #X connect 24 0 21 0; #X connect 25 0 0 2; #X connect 25 0 0 1; #X connect 27 0 29 1; #X connect 28 0 29 0; #X connect 29 0 18 0; #X connect 29 0 21 1;

この例では、トグルに変わってグラフ「prob」を直接操作することで、発音確率を決定する。つまり確率によるリズムパターンである。「random」の出力がグラフ「prob」の値より小さい場合に発音が起こる。発音確率に差をつけることで、結果としてリズムの変奏とも言えるものになる。

乱数のバリエーション

#N canvas 0 0 312 286 10; #N canvas 0 0 462 312 DAC 0; #X obj 175 248 dac~; #X obj 175 205 *~; #X obj 194 172 inlet~; #X obj 234 205 *~; #X obj 253 172 inlet~; #X obj 175 61 inlet; #X obj 175 108 lop~ 5; #X obj 69 124 > 0; #X msg 69 162 \; pd dsp \$1; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 0 1; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 6 0; #X connect 6 0 1 0; #X connect 6 0 3 0; #X connect 7 0 8 0; #X restore 48 196 pd DAC; #X obj 48 50 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 73 165 catch~; #N canvas 0 0 293 321 noise 0; #X obj 56 17 noise~; #X obj 56 69 samphold~; #X obj 56 95 *~ 127; #X obj 56 121 mtof~; #X obj 56 147 osc~; #X obj 105 40 phasor~; #X floatatom 105 17 5 0 0 0 - - -; #X obj 56 43 wrap~; #X obj 56 241 *~; #X obj 69 211 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 56 267 throw~; #X connect 0 0 7 0; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 8 0; #X connect 5 0 1 1; #X connect 6 0 5 0; #X connect 7 0 1 0; #X connect 8 0 10 0; #X connect 9 0 8 1; #X restore 177 48 pd noise; #N canvas 0 0 485 354 table 0; #N canvas 0 0 450 300 graph8 0; #X array prob 128 float 0; #X coords 0 127 127 0 128 128 1; #X restore 241 31 graph; #X obj 55 27 noise~; #X obj 55 79 *~ 127; #X obj 55 105 tabread~ prob; #X obj 55 157 mtof~; #X obj 55 183 osc~; #X obj 55 131 samphold~; #X obj 55 53 wrap~; #X obj 104 50 phasor~; #X floatatom 104 27 5 0 0 0 - - -; #X obj 56 251 *~; #X obj 69 221 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 56 277 throw~; #X connect 1 0 7 0; #X connect 2 0 3 0; #X connect 3 0 6 0; #X connect 4 0 5 0; #X connect 5 0 10 0; #X connect 6 0 4 0; #X connect 7 0 2 0; #X connect 8 0 6 1; #X connect 9 0 8 0; #X connect 10 0 12 0; #X connect 11 0 10 1; #X restore 177 108 pd table; #N canvas 0 0 346 458 adc 0; #X obj 83 -11 adc~; #X obj 103 164 snapshot~; #X obj 103 91 *~; #X obj 103 37 hip~; #X obj 125 11 hsl 128 15 0 10000 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 119 64 hsl 128 15 0 10000 0 0 empty empty empty -2 -6 0 8 -262144 -1 -1 0 1; #X obj 103 268 osc~; #X obj 103 328 *~; #X obj 116 298 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 103 354 throw~; #X obj 103 242 mtof; #X obj 103 216 * 127; #X obj 167 130 metro 100; #X obj 167 105 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 103 119 wrap~; #X floatatom 216 105 5 0 0 0 - - -; #X floatatom 103 189 0 0 0 0 - - -; #X connect 0 0 3 0; #X connect 0 1 3 0; #X connect 1 0 16 0; #X connect 2 0 14 0; #X connect 3 0 2 0; #X connect 4 0 3 1; #X connect 5 0 2 1; #X connect 6 0 7 0; #X connect 7 0 9 0; #X connect 8 0 7 1; #X connect 10 0 6 0; #X connect 11 0 10 0; #X connect 12 0 1 0; #X connect 13 0 12 0; #X connect 14 0 1 0; #X connect 15 0 12 1; #X connect 16 0 11 0; #X restore 177 78 pd adc; #N canvas 0 0 599 445 fb 0; #N canvas 0 0 450 300 graph8 0; #X array fbpb 128 float 0; #X coords 0 127 127 0 200 200 1; #X restore 326 44 graph; #X obj 63 213 mtof~; #X obj 63 239 osc~; #X obj 64 307 *~; #X obj 77 277 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 64 333 throw~; #X obj 141 68 metro 100; #X floatatom 190 44 5 0 0 0 - - -; #X obj 141 44 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 141 181 tabread fbpb; #X floatatom 141 155 0 0 0 0 - - -; #X floatatom 141 207 0 0 0 0 - - -; #X obj 141 233 s fb; #X obj 141 129 f; #X obj 154 102 r fb; #X obj 329 386 tabwrite~ fbpb; #X obj 329 282 noise~; #X obj 329 308 *~; #X obj 329 334 sqrt~; #X obj 297 362 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 329 360 *~ 128; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 3 1; #X connect 6 0 13 0; #X connect 7 0 6 1; #X connect 8 0 6 0; #X connect 9 0 11 0; #X connect 10 0 9 0; #X connect 10 0 1 0; #X connect 11 0 12 0; #X connect 13 0 10 0; #X connect 14 0 13 1; #X connect 16 0 17 0; #X connect 16 0 17 1; #X connect 17 0 18 0; #X connect 18 0 20 0; #X connect 19 0 15 0; #X connect 20 0 15 0; #X restore 177 138 pd fb; #X connect 1 0 0 0; #X connect 2 0 0 2; #X connect 2 0 0 1;

ここで乱数の扱いについて、そのバリエーションを考える。まず「pd noise」では、音声信号を乱数として扱う例を示している。「phasor~」「samphold~」を用いて、「noise~」の出力を任意の時間間隔で取り出すことにより、扱いやすくしている。

「pd adc」では同様に、外部入力音声を乱数に変換する。高音域に集中することでより不規則なノイズ成分を取り出そうとしている。外部入力音声はコンピュータに依存しないため、より純粋な不確定性を得られると考える。

「pd table」では、乱数でグラフを読み出すことにより、偏りを持った乱数を作成する方法を示す。考え方としてはウェーブシェーピングと同様だが、この場合のグラフは確率テーブルと言える。この時、グラフの対角直線は一様乱数を意味する。分布が一様ではなく偏りを持つ場合、単なる乱数でも興味深いものになることがある。

「pd fb」ではグラフの読み出し結果でグラフを読み出すというフィードバックを試している。ほとんどの場合、この結果はあるパターンの反復に落ち着くようだが、その長さは一様ではない。また手描きのグラフでは長い上昇下降音形を発生させる事ができる。

周波数と音量の検出

#N canvas 0 0 826 610 10; #N canvas 0 0 462 312 DAC 0; #X obj 175 248 dac~; #X obj 175 205 *~; #X obj 194 172 inlet~; #X obj 234 205 *~; #X obj 253 172 inlet~; #X obj 175 61 inlet; #X obj 175 108 lop~ 5; #X obj 69 124 > 0; #X msg 69 162 \; pd dsp \$1; #X connect 1 0 0 0; #X connect 2 0 1 1; #X connect 3 0 0 1; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 6 0; #X connect 6 0 1 0; #X connect 6 0 3 0; #X connect 7 0 8 0; #X restore 48 196 pd DAC; #X obj 48 50 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 241 22 adc~; #X obj 228 184 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 228 236 line~; #X obj 193 285 *~; #X obj 165 208 mtof; #X obj 165 235 osc~; #X msg 228 209 1 \, 0 100; #X floatatom 165 184 5 0 0 0 - - -; #X obj 322 175 vsl 15 128 0 100 0 0 empty empty empty 0 -8 0 8 -262144 -1 -1 11048 1; #X obj 295 329 unpack; #X floatatom 295 356 5 0 0 0 - - -; #X floatatom 347 357 5 0 0 0 - - -; #X obj 295 380 mtof; #X obj 347 381 dbtopow; #X obj 296 444 *~; #X obj 474 208 unpack; #X floatatom 474 235 5 0 0 0 - - -; #X floatatom 514 235 5 0 0 0 - - -; #X obj 546 173 route 1 2 3; #X obj 474 267 osc~; #X obj 500 305 *~; #X msg 314 58 auto 0; #X msg 314 83 auto 1; #X obj 287 58 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 241 129 fiddle~ 1024 1 20 3; #X obj 514 267 lop~ 5; #X obj 592 507 throw~; #X obj 592 480 *~; #X obj 605 455 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 80 147 catch~; #X obj 296 524 throw~; #X obj 296 497 *~; #X obj 309 472 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 193 384 throw~; #X obj 193 357 *~; #X obj 206 329 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 566 208 unpack; #X floatatom 566 235 5 0 0 0 - - -; #X floatatom 606 235 5 0 0 0 - - -; #X obj 566 267 osc~; #X obj 592 305 *~; #X obj 606 267 lop~ 5; #X obj 657 208 unpack; #X floatatom 657 235 5 0 0 0 - - -; #X floatatom 697 235 5 0 0 0 - - -; #X obj 657 267 osc~; #X obj 683 305 *~; #X obj 697 267 lop~ 5; #X obj 295 407 osc~; #X obj 347 408 lop~ 5; #X obj 683 357 *~; #X obj 696 329 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 500 357 *~; #X obj 513 329 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 592 357 *~; #X obj 605 329 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 592 416 +~; #X connect 1 0 0 0; #X connect 2 0 26 0; #X connect 3 0 8 0; #X connect 4 0 5 1; #X connect 5 0 36 0; #X connect 6 0 7 0; #X connect 7 0 5 0; #X connect 8 0 4 0; #X connect 9 0 6 0; #X connect 11 0 12 0; #X connect 11 1 13 0; #X connect 12 0 14 0; #X connect 13 0 15 0; #X connect 14 0 50 0; #X connect 15 0 51 0; #X connect 16 0 33 0; #X connect 17 0 18 0; #X connect 17 1 19 0; #X connect 18 0 21 0; #X connect 19 0 27 0; #X connect 20 0 17 0; #X connect 20 1 38 0; #X connect 20 2 44 0; #X connect 21 0 22 0; #X connect 22 0 54 0; #X connect 23 0 26 0; #X connect 24 0 26 0; #X connect 25 0 26 0; #X connect 26 0 9 0; #X connect 26 1 3 0; #X connect 26 2 11 0; #X connect 26 3 10 0; #X connect 26 4 20 0; #X connect 27 0 22 1; #X connect 29 0 28 0; #X connect 30 0 29 1; #X connect 31 0 0 1; #X connect 31 0 0 2; #X connect 33 0 32 0; #X connect 34 0 33 1; #X connect 36 0 35 0; #X connect 37 0 36 1; #X connect 38 0 39 0; #X connect 38 1 40 0; #X connect 39 0 41 0; #X connect 40 0 43 0; #X connect 41 0 42 0; #X connect 42 0 56 0; #X connect 43 0 42 1; #X connect 44 0 45 0; #X connect 44 1 46 0; #X connect 45 0 47 0; #X connect 46 0 49 0; #X connect 47 0 48 0; #X connect 48 0 52 0; #X connect 49 0 48 1; #X connect 50 0 16 0; #X connect 51 0 16 1; #X connect 52 0 58 0; #X connect 53 0 52 1; #X connect 54 0 58 0; #X connect 55 0 54 1; #X connect 56 0 58 0; #X connect 57 0 56 1; #X connect 58 0 29 0;

「fiddle~」により、音声信号の周波数と音量をリアルタイムに測定し、値を得ることができる。例えば楽器音を入力して、その音でpdを操作できる。必ずしも思い通りに操作できるとは限らないが、楽器とpdの対話を偽装することも考えられ興味深い。当然この場合も、出力された値は、音高や音量としての使用に限らず、突拍子も無い対応関係を作ることも考えられる。

「fiddle~」には様々な設定が可能だが、本文では概要を述べるに留める。尚、「fiddle~」のヘルプパッチはversion 0.37.1現在、オブジェクト上から呼び出すことが出来ない(pd\extra\fiddle~\help-fiddle~.pd)。

まずメッセージ「auto 1」は常時値を出力する命令である。大量の値の出力が余計である、またはPCにとって過負荷である場合に、メッセージ「auto 0」によりbangごとの出力に切り替えることができる。

左から、第一出力はMIDIノートナンバーで入力音声の音高を出力し、第二出力は急激な音量差(アタック)を検出する。この直下に書いたパッチはごく簡単なギター/ベースシンセサイザとなる。

第三出力は音高(MIDIノートナンバー)と音量(デシベル値)をリストで出力する。第四出力は音量(デシベル値)のみ出力する。何の意図でこのような出力の割り当てを行なっているのかは不明である。

右端の出力は、入力音声を部分音に分解して、その周波数と音量をリストで出力する。つまり和音や音色のの検出が可能ということである。部分音の数はオブジェクトの第四引数で指定する。例えばCDなど既存曲の音声を「fiddle~」に入力し、部分音検出を聴いてみると、楽曲の輪郭がおぼろげにわかり興味深い。