pdをやりなおす(5)

乱数

#N canvas 0 0 667 306 12; #X obj 71 123 random 100; #X obj 71 50 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X floatatom 71 162 5 0 0 0 - - -; #X obj 71 85 metro 200; #X obj 244 85 samphold~; #X obj 304 45 phasor~ 5; #X obj 244 45 noise~; #X obj 244 123 *~ 500; #X obj 245 162 osc~; #X obj 245 203 *~; #X obj 245 247 dac~; #X obj 307 162 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 449 85 random 500; #X obj 545 50 delay; #X obj 449 50 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; #X floatatom 449 123 5 0 0 0 - - -; #X obj 545 123 line~; #X obj 449 203 *~; #X obj 449 247 dac~; #X msg 545 85 1 \, 0 50; #X obj 448 162 osc~ 100; #X connect 0 0 2 0; #X connect 1 0 3 0; #X connect 3 0 0 0; #X connect 4 0 7 0; #X connect 5 0 4 1; #X connect 6 0 4 0; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 9 0 10 0; #X connect 9 0 10 1; #X connect 11 0 9 1; #X connect 12 0 13 0; #X connect 12 0 15 0; #X connect 13 0 12 0; #X connect 13 0 19 0; #X connect 14 0 12 0; #X connect 16 0 17 1; #X connect 17 0 18 0; #X connect 17 0 18 1; #X connect 19 0 16 0; #X connect 20 0 17 0;


randomはbangを受けて、0から引数-1の範囲の整数で乱数を返す。
中央はsamphold~を使ってランダムな音声信号を得る例。
右はrandomとdelayをたすき掛けにしてランダムなリズムを得る例。

定位(パン)

#N canvas 0 0 467 264 12; #N canvas 243 54 453 449 pan 0; #X obj 290 268 cos~; #X obj 271 307 *~; #X obj 235 268 inlet~; #X obj 157 268 cos~; #X obj 138 307 *~; #X obj 102 268 inlet~; #X obj 138 352 outlet~; #X obj 270 352 outlet~; #X obj 290 141 /~ 8; #X obj 290 106 +~ 1; #X obj 289 69 inlet~; #X obj 289 232 +~ 0.75; #X connect 0 0 1 1; #X connect 1 0 7 0; #X connect 2 0 1 0; #X connect 3 0 4 1; #X connect 4 0 6 0; #X connect 5 0 4 0; #X connect 8 0 3 0; #X connect 8 0 11 0; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 11 0 0 0; #X restore 72 144 pd pan; #X obj 72 190 dac~; #X obj 164 38 osc~ 0.1; #X obj 71 38 osc~ 100; #X obj 71 101 *~; #X obj 89 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #N canvas 243 54 586 549 lin_panning 0; #X obj 277 90 sig~; #X obj 174 337 snapshot~; #X obj 63 123 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 280 24 hsl 128 15 0 1 0 0 empty empty pan -2 -8 0 12 -262144 -1 -1 6400 1; #X obj 174 378 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 -1 -1 6400 1; #X obj 353 395 expr sqrt($f1*$f1+$f2*$f2); #X floatatom 353 430 4 0 0 0 power - -; #X obj 63 162 metro 10; #X floatatom 277 56 5 0 0 0 - - -; #X obj 277 337 snapshot~; #X obj 277 378 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 -1 -1 6300 1; #X obj 278 162 expr~ 1-$v1; #X connect 0 0 11 0; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 1 0 5 0; #X connect 2 0 7 0; #X connect 3 0 8 0; #X connect 5 0 6 0; #X connect 7 0 1 0; #X connect 7 0 9 0; #X connect 8 0 0 0; #X connect 9 0 10 0; #X connect 9 0 5 1; #X connect 11 0 9 0; #X restore 268 91 pd lin_panning; #N canvas 243 54 586 549 cos_panning 0; #X obj 175 291 cos~; #X obj 277 253 +~ 0.75; #X obj 277 90 sig~; #X obj 174 337 snapshot~; #X obj 63 123 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 280 24 hsl 128 15 0 1 0 0 empty empty pan -2 -8 0 12 -262144 -1 -1 12700 1; #X obj 174 378 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 -1 -1 0 1; #X obj 353 395 expr sqrt($f1*$f1+$f2*$f2); #X floatatom 353 430 4 0 0 0 power - -; #X obj 63 162 metro 10; #X floatatom 277 56 5 0 0 0 - - -; #X obj 278 162 /~ 4; #X obj 277 291 cos~; #X obj 276 337 snapshot~; #X obj 276 378 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 -1 -1 12700 1; #X connect 0 0 3 0; #X connect 1 0 12 0; #X connect 2 0 11 0; #X connect 3 0 6 0; #X connect 3 0 7 0; #X connect 4 0 9 0; #X connect 5 0 10 0; #X connect 7 0 8 0; #X connect 9 0 3 0; #X connect 9 0 13 0; #X connect 10 0 2 0; #X connect 11 0 0 0; #X connect 11 0 1 0; #X connect 12 0 13 0; #X connect 13 0 14 0; #X connect 13 0 7 1; #X restore 268 124 pd cos_panning; #N canvas 243 54 586 549 cos_panning_1 0; #X obj 175 291 cos~; #X obj 277 253 +~ 0.75; #X obj 277 90 sig~; #X obj 174 337 snapshot~; #X obj 63 123 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 280 24 hsl 128 15 -1 1 0 0 empty empty pan -2 -8 0 12 -262144 -1 -1 12700 1; #X obj 174 378 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 -1 -1 0 1; #X obj 353 395 expr sqrt($f1*$f1+$f2*$f2); #X floatatom 353 430 4 0 0 0 power - -; #X obj 63 162 metro 10; #X floatatom 277 56 5 0 0 0 - - -; #X obj 277 291 cos~; #X obj 276 337 snapshot~; #X obj 276 378 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262144 -1 -1 12700 1; #X obj 278 125 +~ 1; #X obj 278 162 /~ 8; #X connect 0 0 3 0; #X connect 1 0 11 0; #X connect 2 0 14 0; #X connect 3 0 6 0; #X connect 3 0 7 0; #X connect 4 0 9 0; #X connect 5 0 10 0; #X connect 7 0 8 0; #X connect 9 0 3 0; #X connect 9 0 12 0; #X connect 10 0 2 0; #X connect 11 0 12 0; #X connect 12 0 13 0; #X connect 12 0 7 1; #X connect 14 0 15 0; #X connect 15 0 0 0; #X connect 15 0 1 0; #X restore 268 158 pd cos_panning_1; #X connect 0 0 1 0; #X connect 0 1 1 1; #X connect 2 0 0 2; #X connect 3 0 4 0; #X connect 4 0 0 0; #X connect 4 0 0 1; #X connect 5 0 4 1;


左右のチャンネルの音量を調節して、音の左右の位置を制御することを定位と言う。


「pd lin_panning」は単純な線形定位の例。左右の振幅の合計が1となる。
ところがこの場合では、音を中央に定位した場合、全体の音量が約0.7倍まで落ちる。
(「pan」を0.5にすると「power」の値は0.707になる)
これを音で聴くと多少奥に引っ込んだ感じになるだろう。


「pd cos_panning」はコサインを使った定位の例。
この場合は定位に関係なく音量が一定に保たれる。


「pd cos_panning_1」は先程の例を双極信号(-1〜+1)で制御するようにしたもの。
1が右、0が中央、-1が左となる。
これを書き換えて音声信号を使って定位できるようにしたものが「pd pan」。

スペクトルアナライザ

#N canvas 0 0 522 306 12; #N canvas 0 0 450 300 (subpatch) 0; #X array spec 256 float 0; #X coords 0 256 255 0 200 140 1; #X restore 30 80 graph; #N canvas 306 80 640 428 fft 0; #X obj 292 138 rfft~; #X obj 291 269 rifft~; #N canvas 0 0 450 300 pol2rec 0; #X obj 88 70 inlet~; #X obj 225 70 inlet~; #X obj 88 219 outlet~; #X obj 257 219 outlet~; #X obj 87 155 expr~ $v1*cos($v2); #X obj 258 155 expr~ $v1*sin($v2); #X connect 0 0 4 0; #X connect 0 0 5 0; #X connect 1 0 4 1; #X connect 1 0 5 1; #X connect 4 0 2 0; #X connect 5 0 3 0; #X restore 292 224 pd pol2rec; #N canvas 0 0 450 300 rec2pol 0; #X obj 30 62 inlet~; #X obj 29 147 expr~ sqrt($v1*$v1+$v2*$v2); #X obj 241 62 inlet~; #X obj 268 147 expr~ atan2($v2 \, $v1); #X obj 30 211 outlet~; #X obj 267 211 outlet~; #X connect 0 0 1 0; #X connect 0 0 3 0; #X connect 1 0 4 0; #X connect 2 0 1 1; #X connect 2 0 3 1; #X connect 3 0 5 0; #X restore 291 183 pd rec2pol; #X obj 146 228 tabwrite~ spec; #X obj 146 179 metro 500; #X obj 293 42 inlet~; #X obj 146 138 loadbang; #X obj 291 343 outlet~; #X obj 293 102 *~; #X obj 311 72 tabreceive~ hann; #X obj 413 344 block~ 1024 2; #X obj 292 306 /~ 2048; #X connect 0 0 3 0; #X connect 0 1 3 1; #X connect 1 0 12 0; #X connect 2 0 1 0; #X connect 2 1 1 1; #X connect 3 0 4 0; #X connect 3 0 2 0; #X connect 3 1 2 1; #X connect 5 0 4 0; #X connect 6 0 9 0; #X connect 7 0 5 0; #X connect 9 0 0 0; #X connect 10 0 9 1; #X connect 12 0 8 0; #X restore 295 216 pd fft; #X obj 295 253 dac~; #X obj 295 165 *~; #X obj 313 138 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 361 165 *~; #X obj 379 138 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 299 39 hsl 128 15 0 11025 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 2200 1; #X floatatom 296 67 0 0 0 0 freq - -; #X obj 296 105 osc~; #X obj 362 105 phasor~; #X obj 437 165 *~; #X obj 455 138 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 438 105 noise~; #N canvas 0 0 493 435 window 0; #X obj 127 235 osc~; #X obj 127 166 samplerate~; #X obj 127 268 *~ -0.5; #X obj 127 301 +~ 0.5; #X obj 107 343 tabwrite~ hann; #N canvas 0 0 452 302 (subpatch) 0; #X array hann 1024 float 0; #X coords 0 1 1023 -1 100 100 1; #X restore 296 71 graph; #X msg 168 206 0; #X obj 127 202 /; #X msg 278 235 \; hann resize \$1; #X obj 107 66 loadbang; #X obj 107 102 t b b b b; #X msg 236 206 1024; #X obj 236 239 / 2; #X obj 279 318 block~ 1024 2; #X connect 0 0 2 0; #X connect 1 0 7 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 6 0 0 1; #X connect 7 0 0 0; #X connect 9 0 10 0; #X connect 10 0 4 0; #X connect 10 1 1 0; #X connect 10 2 6 0; #X connect 10 3 11 0; #X connect 11 0 8 0; #X connect 11 0 12 0; #X connect 12 0 7 1; #X restore 382 216 pd window; #X connect 1 0 2 0; #X connect 1 0 2 1; #X connect 3 0 1 0; #X connect 4 0 3 1; #X connect 5 0 1 0; #X connect 6 0 5 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 8 0 10 0; #X connect 9 0 3 0; #X connect 10 0 5 0; #X connect 11 0 1 0; #X connect 12 0 11 1; #X connect 13 0 11 0;


現実の物音には様々な高さ(周波数)の音が同時に含まれている。
周波数ごとの音量の分布を示したものを周波数スペクトルと呼ぶ。


rfft~、rifft~を使ったスペクトルアナライザの例だが、非常に大雑把なので、例えば単一の周波数しか持たないはずのosc~のスペクトルが山型に滲む。


phasor~のスペクトルは複数のピークが等間隔に並んでいるのが見える。
要はこれらのピークが倍音で、基準の周波数の整数倍になっている。
倍音成分が強いとピッチを明確に聴き取ることができる。


一方、noise~のスペクトルは周波数の全域に一様に分布している。
こうなるとピッチの感覚はなくなる。

ボコーダ

#N canvas 0 0 416 387 12; #N canvas 0 123 640 428 fft 0; #X obj 182 130 rfft~; #X obj 179 302 rifft~; #N canvas 0 0 450 300 pol2rec 0; #X obj 88 70 inlet~; #X obj 225 70 inlet~; #X obj 88 219 outlet~; #X obj 257 219 outlet~; #X obj 87 155 expr~ $v1*cos($v2); #X obj 258 155 expr~ $v1*sin($v2); #X connect 0 0 4 0; #X connect 0 0 5 0; #X connect 1 0 4 1; #X connect 1 0 5 1; #X connect 4 0 2 0; #X connect 5 0 3 0; #X restore 180 257 pd pol2rec; #N canvas 0 0 450 300 rec2pol 0; #X obj 30 62 inlet~; #X obj 29 147 expr~ sqrt($v1*$v1+$v2*$v2); #X obj 241 62 inlet~; #X obj 268 147 expr~ atan2($v2 \, $v1); #X obj 30 211 outlet~; #X obj 267 211 outlet~; #X connect 0 0 1 0; #X connect 0 0 3 0; #X connect 1 0 4 0; #X connect 2 0 1 1; #X connect 2 0 3 1; #X connect 3 0 5 0; #X restore 181 175 pd rec2pol; #X obj 183 34 inlet~; #X obj 179 376 outlet~; #X obj 183 94 *~; #X obj 397 34 tabreceive~ hann; #X obj 293 130 rfft~; #N canvas 0 0 450 300 rec2pol 0; #X obj 30 62 inlet~; #X obj 29 147 expr~ sqrt($v1*$v1+$v2*$v2); #X obj 241 62 inlet~; #X obj 268 147 expr~ atan2($v2 \, $v1); #X obj 30 211 outlet~; #X obj 267 211 outlet~; #X connect 0 0 1 0; #X connect 0 0 3 0; #X connect 1 0 4 0; #X connect 2 0 1 1; #X connect 2 0 3 1; #X connect 3 0 5 0; #X restore 292 175 pd rec2pol; #X obj 294 34 inlet~; #X obj 294 94 *~; #X obj 180 216 *~; #X obj 180 339 /~ 2048; #X obj 299 376 block~ 1024 4; #X connect 0 0 3 0; #X connect 0 1 3 1; #X connect 1 0 13 0; #X connect 2 0 1 0; #X connect 2 1 1 1; #X connect 3 0 12 0; #X connect 4 0 6 0; #X connect 6 0 0 0; #X connect 7 0 6 1; #X connect 7 0 11 1; #X connect 8 0 9 0; #X connect 8 1 9 1; #X connect 9 0 12 1; #X connect 9 1 2 1; #X connect 10 0 11 0; #X connect 11 0 8 0; #X connect 12 0 2 0; #X connect 13 0 5 0; #X restore 175 270 pd fft; #X obj 175 308 dac~; #N canvas 0 0 493 435 window 0; #X obj 127 235 osc~; #X obj 127 166 samplerate~; #X obj 127 268 *~ -0.5; #X obj 127 301 +~ 0.5; #X obj 107 343 tabwrite~ hann; #N canvas 0 0 452 302 (subpatch) 0; #X array hann 1024 float 0; #X coords 0 1 1023 -1 100 100 1; #X restore 296 71 graph; #X msg 168 206 0; #X obj 127 202 /; #X msg 278 235 \; hann resize \$1; #X obj 107 66 loadbang; #X msg 236 206 1024; #X obj 107 102 t b b b b; #X obj 236 239 / 1; #X obj 279 343 block~ 1024 1; #X connect 0 0 2 0; #X connect 1 0 7 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 6 0 0 1; #X connect 7 0 0 0; #X connect 9 0 11 0; #X connect 10 0 8 0; #X connect 10 0 12 0; #X connect 11 0 4 0; #X connect 11 1 1 0; #X connect 11 2 6 0; #X connect 11 3 10 0; #X connect 12 0 7 1; #X restore 247 270 pd window; #X obj 45 189 readsf~; #X obj 45 77 openpanel; #X msg 45 151 open \$1; #X obj 45 115 symbol; #X obj 127 77 t b b; #X msg 127 151 1; #N canvas 0 0 450 300 chord 0; #X obj 116 129 phasor~; #X obj 116 97 mtof; #X obj 189 132 phasor~; #X obj 189 100 mtof; #X obj 260 132 phasor~; #X obj 260 100 mtof; #X obj 331 132 phasor~; #X obj 331 100 mtof; #X obj 189 68 + 4; #X obj 260 68 + 3; #X obj 331 68 + 4; #X obj 188 224 hip~ 5000; #X obj 188 192 *~ 0.2; #X obj 116 17 inlet; #X obj 188 261 outlet~; #X connect 0 0 12 0; #X connect 1 0 0 0; #X connect 2 0 12 0; #X connect 3 0 2 0; #X connect 4 0 12 0; #X connect 5 0 4 0; #X connect 6 0 12 0; #X connect 7 0 6 0; #X connect 8 0 3 0; #X connect 8 0 9 0; #X connect 9 0 5 0; #X connect 9 0 10 0; #X connect 10 0 7 0; #X connect 11 0 14 0; #X connect 12 0 11 0; #X connect 13 0 1 0; #X connect 13 0 8 0; #X restore 215 78 pd chord; #X obj 215 44 nbx 3 18 -1e+037 1e+037 0 1 empty empty midi_note_num 0 -8 0 12 -262144 -1 -1 45 256; #X msg 126 189 0; #X obj 45 44 bng 20 250 50 0 empty empty open 0 -8 0 12 -262144 -1 -1; #X obj 127 44 bng 20 250 50 0 empty empty play 0 -8 0 12 -262144 -1 -1; #X connect 0 0 1 0; #X connect 0 0 1 1; #X connect 3 0 0 0; #X connect 3 1 11 0; #X connect 4 0 6 0; #X connect 5 0 3 0; #X connect 6 0 5 0; #X connect 7 0 8 0; #X connect 7 1 6 0; #X connect 8 0 3 0; #X connect 9 0 0 1; #X connect 10 0 9 0; #X connect 11 0 3 0; #X connect 12 0 4 0; #X connect 13 0 7 0;


rfft~など、FFTに関するオブジェクトを使ってボコーダを作った例。
要するに二つの音源のスペクトルを掛け算して、一方の音をもう一方の音でフィルタしている。
「open」で適当な音声ファイルを開いて「play」で再生してみる。