pdをやりなおす(4)

ディレイ

#N canvas 0 0 450 300 12; #X obj 150 104 *~; #X obj 168 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 149 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 228 24 pd wow; #X obj 228 104 *~; #X obj 246 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 151 209 delread~ hoge 1000; #X obj 150 160 delwrite~ hoge 1000; #X obj 151 255 dac~; #X connect 0 0 7 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 4 1; #X connect 6 0 8 0; #X connect 6 0 8 1;


adc~はオーディオ入力。PCに接続したマイクなどから音を入力する。
「pd wow」はテスト音源。トグルをクリックして音源を選択する。


ディレイへの入力はdelwrite~、ディレイからの出力はdelread~を使う。
第一の引数はディレイの名前。第二の引数は、delwrite~の場合はディレイの最大時間、delread~はディレイタイムをミリ秒で指定する。
この場合は1秒遅れて音が出る。

#N canvas 0 0 450 300 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 49 160 delwrite~ hoge 1000; #X obj 222 246 dac~; #X obj 278 24 delread~ hoge 0; #X obj 278 63 delread~ hoge 300; #X obj 278 104 delread~ hoge 600; #X obj 278 145 delread~ hoge 900; #X obj 221 201 /~ 2; #X connect 0 0 6 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 8 0 12 0; #X connect 9 0 12 0; #X connect 10 0 12 0; #X connect 11 0 12 0; #X connect 12 0 7 0; #X connect 12 0 7 1;


異なるディレイタイムのdelread~を重ねるとエコーになる。

#N canvas 0 0 450 300 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 50 219 delwrite~ hoge 1000; #X obj 258 68 dac~; #X obj 238 24 delread~ hoge 300; #X obj 239 158 *~; #X obj 257 119 nbx 5 24 0 1 0 1 empty empty feedback 0 -8 0 12 -262144 -1 -1 0.7 256; #X connect 0 0 6 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 8 0 7 1; #X connect 8 0 9 0; #X connect 9 0 6 0; #X connect 10 0 9 1;


フィードバックディレイで同様の効果を作る。
delread~の出力を再度delwrite~に返すことでフィードバックループになる。
feedbackの数値は減衰率。1以上になると信号が消えなくなり、音が歪む。

#N canvas 0 0 450 300 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 50 219 delwrite~ hoge 1000; #X obj 258 113 dac~; #X obj 238 67 delread~ hoge 10; #X obj 238 155 *~ 0.95; #X obj 50 161 /~ 2; #X connect 0 0 10 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 10 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 8 0 7 1; #X connect 8 0 9 0; #X connect 9 0 6 0; #X connect 10 0 6 0;


フィードバックディレイのディレイタイムを極めて短時間(10ms)にしたもの。
ディレイというよりは金属的な反響音になる。


(さらにディレイタイムを短くしていくと初歩的なローパスフィルタになるのだが、これを試すにはfexpr~を使う必要がある。fexpr~については省略)

#N canvas 0 0 450 300 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 49 160 delwrite~ hoge 1000; #X obj 246 208 dac~; #X obj 245 160 vd~ hoge; #X obj 248 43 hsl 128 15 0 1000 0 0 empty empty delay_time -2 -8 0 12 -262144 -1 -1 10300 1; #X floatatom 268 80 0 0 0 0 - - -; #X obj 245 121 lop~ 1; #X connect 0 0 6 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 8 0 7 1; #X connect 9 0 10 0; #X connect 9 0 11 0; #X connect 11 0 8 0;


vd~はdelread~と同じくディレイの出力だが、ディレイタイムを変えることができる。
ここで、適当に「delay_time」を動かすと、単にディレイタイムが変わるだけでなく、スクラッチのような効果が起こる。
vd~の手前にlop~があるためだが、何故だろうか。

#N canvas 0 0 450 300 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 49 160 delwrite~ hoge 1000; #X obj 246 208 dac~; #X obj 245 160 vd~ hoge; #X obj 244 116 *~ 1000; #X obj 244 76 phasor~; #X obj 244 30 nbx 5 24 -1e+037 1e+037 0 1 empty empty freq 0 -8 0 12 -262144 -1 -1 0.5 256; #X connect 0 0 6 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 8 0 7 1; #X connect 9 0 8 0; #X connect 10 0 9 0; #X connect 11 0 10 0;


ディレイタイムの指定にphasor~を使っている。「freq」の数値をいろいろ変えてみる。
ディレイタイムの動く速度が変わることでピッチ(音の高さ)が変化する。


(ここでディレイタイムとピッチとの関係を考えるとなかなか難しいが、とりあえずは考えないことにする)


さて、この例ではディレイタイムが0に戻る瞬間に波形が途切れてノイズが発生する。
これを回避するには、例えばディレイタイムが戻る時に一瞬音量を落とすことが考えられる。

#N canvas 0 0 553 327 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 49 160 delwrite~ hoge 1000; #X obj 245 160 vd~ hoge; #X obj 244 116 *~ 1000; #X obj 244 70 phasor~; #X obj 244 30 nbx 5 24 -1e+037 1e+037 0 1 empty empty freq 0 -8 0 12 -262144 -1 -1 0.5 256; #X obj 246 242 dac~; #X obj 246 201 *~; #X obj 364 116 cos~; #X obj 365 160 -~ 1; #X obj 366 242 expr~ pow($v1 \, 0.4); #X obj 365 201 /~ -2; #X connect 0 0 6 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 7 0 12 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 9 0 13 0; #X connect 10 0 9 0; #X connect 12 0 11 0; #X connect 12 0 11 1; #X connect 13 0 14 0; #X connect 14 0 16 0; #X connect 15 0 12 1; #X connect 16 0 15 0;


phasor~の出力を利用してノイズ回避のために窓かけという処理をしている。
「cos~」「-~ 1」「/~ -2」「expr~ pow($v1, 0.4)」の部分がこれにあたる。
簡単に言えば、短いフェードイン・アウトを生成している。

#N canvas 0 0 553 327 12; #X obj 49 104 *~; #X obj 67 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 48 24 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 127 24 pd wow; #X obj 127 104 *~; #X obj 145 68 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 49 160 delwrite~ hoge 1000; #X obj 245 160 vd~ hoge; #X obj 244 67 phasor~; #X obj 244 30 nbx 5 24 -1e+037 1e+037 0 1 empty empty freq 0 -8 0 12 -262144 -1 -1 80 256; #X obj 246 201 *~; #X obj 366 243 expr~ pow($v1 \, 0.4); #X obj 247 289 dac~; #X obj 246 243 *~ 0.7; #X obj 244 116 *~ 50; #X obj 364 116 cos~; #X obj 365 160 -~ 1; #X obj 365 201 /~ -2; #X connect 0 0 6 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 7 0 10 0; #X connect 8 0 14 0; #X connect 8 0 15 0; #X connect 9 0 8 0; #X connect 10 0 13 0; #X connect 11 0 10 1; #X connect 13 0 6 0; #X connect 13 0 12 0; #X connect 13 0 12 1; #X connect 14 0 7 0; #X connect 15 0 16 0; #X connect 16 0 17 0; #X connect 17 0 11 0;


先程のパッチにフィードバックを加えただけだが、非常に大雑把なピッチシフターのような効果になる。
これをさらに改良すると本格的なピッチシフターを作ることができるだろう。

配列テーブルへの音声読み込み

#N canvas 0 0 858 574 12; #X obj 72 298 osc~ 1000; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 516 61 graph; #X obj 517 343 loadbang; #X msg 517 378 \; array1 ylabel -4 -1 0 1; #X obj 72 99 metro 500; #X obj 73 383 *~; #X obj 72 53 tgl 15 0 empty empty start 17 7 0 12 -262144 -1 -1 1 1 ; #X obj 72 163 tabwrite~ array1; #X obj 303 53 catch~ hoge; #X obj 91 343 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #X obj 73 432 throw~ hoge; #X obj 182 383 *~; #X obj 200 343 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 182 432 throw~ hoge; #X obj 181 298 phasor~ 1000; #X obj 298 383 *~; #X obj 316 343 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 298 432 throw~ hoge; #X obj 297 298 noise~; #X obj 302 149 *~; #X obj 320 108 nbx 5 20 -1e+037 1e+037 0 1 empty empty amp 0 -8 0 12 -262144 -1 -1 1 256; #X obj 178 99 r~ moge; #X obj 303 194 s~ moge; #X connect 0 0 5 0; #X connect 2 0 3 0; #X connect 4 0 7 0; #X connect 5 0 10 0; #X connect 6 0 4 0; #X connect 8 0 19 0; #X connect 9 0 5 1; #X connect 11 0 13 0; #X connect 12 0 11 1; #X connect 14 0 11 0; #X connect 15 0 17 0; #X connect 16 0 15 1; #X connect 18 0 15 0; #X connect 19 0 22 0; #X connect 20 0 19 1; #X connect 21 0 7 0;


最初にmetroを開始し、osc~、phasor~、noise~から音源を選ぶ。
tabwrite~はbangを受け取ることで、入力された音声信号を配列テーブルに読み込む。
テーブルには音源の波形が表示される。音源によって波の形は全く異なる。


また、ampの数値をいろいろ試してみる。
音声信号にampの数値を乗算しているが、数値によって波形が縦方向に伸び縮みする。
波形の横軸は時間、縦軸は振幅(振れ幅)を意味するが、要するに振幅が大きいと音量が大きくなる。
テーブルからはみ出した信号、つまり-1〜+1を超える値は、出音としては正しく再生されない。

#N canvas 0 0 655 615 12; #X obj 44 106 *~; #X obj 62 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 43 26 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 122 26 pd wow; #X obj 122 106 *~; #X obj 140 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 44100 float 0; #X coords 0 1 44099 -1 200 140 1; #X restore 360 39 graph; #X obj 44 162 tabwrite~ array1; #X obj 201 89 bng 50 250 50 0 empty empty get 0 -9 0 12 -262144 -1 -1; #X obj 239 563 dac~; #X obj 238 508 tabplay~ array1; #X msg 47 274 bang; #X obj 455 279 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 455 360 random 10; #X obj 455 403 * 4410; #X obj 455 315 metro 100; #X msg 455 447 \$1 44100; #X msg 238 274 0 4410; #X connect 0 0 7 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 10 0 9 0; #X connect 10 0 9 1; #X connect 11 0 10 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 16 0; #X connect 15 0 13 0; #X connect 16 0 10 0; #X connect 17 0 10 0;


「get」をクリックしてテーブルに音声信号を読み込む。
tabplay~はテーブルのデータを音として再生する。
bangを受け取った場合はテーブルの最初から最後まで再生する。


次に「0 4410」をクリックすると、テーブルの0番目から4410個の値を再生する。
これはほとんどのPCで0.1秒分に相当する。
オーディオデバイスのサンプリング周波数が44.1kHzという場合、1秒間で44100個の値を再生する。


最後に、metroを開始するとテーブル上の開始位置をランダムにして再生する。

#N canvas 0 0 601 585 12; #X obj 48 367 *~; #X obj 66 331 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 47 287 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 126 287 pd wow; #X obj 126 367 *~; #X obj 144 331 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 44100 float 0; #X coords 0 1 44099 -1 200 140 1; #X restore 198 39 graph; #X obj 48 423 tabwrite~ array1; #X obj 205 350 bng 50 250 50 0 empty empty get 0 -9 0 12 -262144 -1 -1; #X obj 349 300 phasor~; #X obj 349 245 nbx 5 24 -1e+037 1e+037 0 1 empty empty freq 0 -8 0 12 -262144 -1 -1 10 256; #X obj 352 506 dac~; #X obj 351 454 tabread4~ array1; #X obj 413 347 nbx 5 24 0 44100 0 1 empty empty length 0 -8 0 12 -262144 -1 -1 4410 256; #X obj 414 405 nbx 5 24 0 44100 0 1 empty empty locate 0 -8 0 12 -262144 -1 -1 0 256; #X obj 349 354 *~; #X obj 350 405 +~; #X connect 0 0 7 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 9 0 15 0; #X connect 10 0 9 0; #X connect 12 0 11 0; #X connect 12 0 11 1; #X connect 13 0 15 1; #X connect 14 0 16 1; #X connect 15 0 16 0; #X connect 16 0 12 0;


tabread4~は音声信号を使ってテーブルのデータを再生する。
ここではphasor~を使っている。「freq」「length」「locate」の数値を変えるとどうなるか。


「length」はphasor~によって再生する音の長さ、「locate」は再生の開始位置と考えられる。
「freq」と「length」の両方によってピッチが変わるが、それぞれの数値の関係を考えると難しいので、とりあえず考えないでおく。


諸々の改良を施したのが次の例。

#N canvas 0 0 822 610 12; #X obj 44 106 *~; #X obj 62 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 43 26 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 122 26 pd wow; #X obj 122 106 *~; #X obj 140 70 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 44100 float 0; #X coords 0 1 44099 -1 200 140 1; #X restore 461 34 graph; #X obj 44 162 tabwrite~ array1; #X obj 201 89 bng 50 250 50 0 empty empty get 0 -9 0 12 -262144 -1 -1; #X obj 45 356 *~; #X obj 46 512 *~; #X obj 47 557 dac~; #X obj 45 396 +~; #X obj 73 319 s~ ph; #X obj 91 396 r~ loc; #X obj 64 472 r~ window; #X obj 411 297 noise~; #X obj 412 494 samphold~; #X obj 413 397 +~; #X obj 412 348 *~; #X obj 477 350 hsl 128 15 0 44100 0 0 empty empty random -2 -8 0 10 -261682 -1 -1 0 1; #X obj 478 399 hsl 128 15 0 44100 0 0 empty empty locate -2 -8 0 10 -261682 -1 -1 0 1; #X obj 471 454 r~ ph; #X obj 643 340 cos~; #X obj 644 381 -~ 1; #X obj 644 422 /~ -2; #X obj 642 301 r~ ph; #X obj 644 466 s~ window; #X obj 45 436 tabread4~ array1; #X obj 412 534 s~ loc; #X text 641 266 // window; #X text 411 258 // locate; #X obj 44 282 phasor~; #X obj 214 259 nbx 5 24 -1e+037 1e+037 0 1 empty empty freq 0 -8 0 12 -261682 -1 -1 50 256; #X obj 214 494 samphold~; #X obj 273 454 r~ ph; #X obj 259 360 hsl 128 15 -8 8 0 1 empty empty pitch -2 -8 0 10 -261682 -1 -1 7700 1; #X obj 214 308 expr 44100/$f1; #X obj 214 454 *; #X obj 256 401 t b f; #X obj 166 308 s fq; #X obj 44 247 r fq; #X obj 214 534 s~ len; #X obj 92 356 r~ len; #X text 211 210 // length; #X connect 0 0 7 0; #X connect 1 0 0 1; #X connect 2 0 0 0; #X connect 3 0 4 0; #X connect 4 0 7 0; #X connect 5 0 4 1; #X connect 8 0 7 0; #X connect 9 0 12 0; #X connect 10 0 11 0; #X connect 10 0 11 1; #X connect 12 0 28 0; #X connect 14 0 12 1; #X connect 15 0 10 1; #X connect 16 0 19 0; #X connect 17 0 29 0; #X connect 18 0 17 0; #X connect 19 0 18 0; #X connect 20 0 19 1; #X connect 21 0 18 1; #X connect 22 0 17 1; #X connect 23 0 24 0; #X connect 24 0 25 0; #X connect 25 0 27 0; #X connect 26 0 23 0; #X connect 28 0 10 0; #X connect 32 0 9 0; #X connect 32 0 13 0; #X connect 33 0 37 0; #X connect 33 0 40 0; #X connect 34 0 42 0; #X connect 35 0 34 1; #X connect 36 0 39 0; #X connect 37 0 38 0; #X connect 38 0 34 0; #X connect 39 0 38 0; #X connect 39 1 38 1; #X connect 41 0 32 0; #X connect 43 0 9 1;


非常に簡単なグラニュラー再生の例。
完全とは言えないが、phasor~の周波数によってピッチが変わらないようにしてある。
samphold~は、出力する値をphasor~が0に戻る時だけ更新する。
「random」で開始位置がランダムに変化する変化幅を変えられる。

音声ファイル

#N canvas 0 0 889 557 12; #N canvas 0 0 450 300 (subpatch) 0; #X array array1 220480 float 0; #X coords 0 1 220479 -1 200 140 1; #X restore 523 52 graph; #X obj 523 354 soundfiler; #X obj 523 288 openpanel; #X obj 523 251 bng 24 250 50 0 empty empty open 0 -10 0 12 -262144 -1 -1; #X obj 190 227 writesf~; #X msg 364 171 open test.wav; #X msg 306 171 start; #X msg 190 171 stop; #X obj 318 61 t b b b; #X obj 318 25 bng 24 250 50 0 empty empty rec 0 -10 0 12 -262144 -1 -1; #X obj 235 432 readsf~; #X msg 331 378 open test.wav; #X obj 286 302 bng 24 250 50 0 empty empty play 0 -10 0 12 -262144 -1 -1; #X msg 286 378 1; #X obj 286 339 t b b; #X msg 235 378 0; #X obj 236 475 dac~; #X obj 26 150 +~; #X obj 26 107 *~; #X obj 44 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1 ; #X obj 25 27 adc~; #N canvas 0 0 482 383 wow 0; #X obj 67 203 phasor~; #X obj 69 77 samphold~; #X obj 68 34 noise~; #X obj 68 160 expr~ $v1*100+150; #X obj 130 34 phasor~ 5; #X obj 68 120 lop~ 2; #X obj 251 144 osc~ 2; #X obj 251 185 expr~ $v1*400+500; #X obj 229 242 vcf~ 10; #X obj 230 327 outlet~; #X obj 229 285 *~ 2; #X connect 0 0 8 0; #X connect 1 0 5 0; #X connect 2 0 1 0; #X connect 3 0 0 0; #X connect 4 0 1 1; #X connect 5 0 3 0; #X connect 6 0 7 0; #X connect 7 0 8 1; #X connect 8 0 10 0; #X connect 10 0 9 0; #X restore 104 27 pd wow; #X obj 104 107 *~; #X obj 122 71 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 1; #X obj 26 204 dac~; #X floatatom 523 387 0 0 0 0 - - -; #X obj 707 288 tabplay~ array1; #X obj 707 251 bng 24 250 50 0 empty empty play 0 -10 0 12 -262144 -1 -1; #X obj 707 321 dac~; #X msg 523 420 \; array1 resize \$1; #X obj 190 138 bng 15 250 50 0 empty empty done 17 7 0 10 -262144 -1 -1; #X obj 190 100 delay 5000; #X msg 523 321 read -resize \$1 array1; #X text 197 377 stop; #X floatatom 257 25 5 0 0 2 length - -; #X connect 1 0 25 0; #X connect 2 0 32 0; #X connect 3 0 2 0; #X connect 5 0 4 0; #X connect 6 0 4 0; #X connect 7 0 4 0; #X connect 8 0 31 0; #X connect 8 1 6 0; #X connect 8 2 5 0; #X connect 9 0 8 0; #X connect 10 0 16 0; #X connect 10 0 16 1; #X connect 11 0 10 0; #X connect 12 0 14 0; #X connect 13 0 10 0; #X connect 14 0 13 0; #X connect 14 1 11 0; #X connect 15 0 10 0; #X connect 17 0 24 0; #X connect 17 0 24 1; #X connect 17 0 4 0; #X connect 18 0 17 0; #X connect 19 0 18 1; #X connect 20 0 18 0; #X connect 21 0 22 0; #X connect 22 0 17 1; #X connect 23 0 22 1; #X connect 25 0 29 0; #X connect 26 0 28 0; #X connect 26 0 28 1; #X connect 27 0 26 0; #X connect 30 0 7 0; #X connect 31 0 30 0; #X connect 32 0 1 0; #X connect 34 0 31 1;


writesf~は入力された音を録音して音声ファイルに保存する。
最初に「open」でファイルを作成し、「start」で録音を始める。
「stop」で録音を停止し、ファイルを完成する。
ここではdelayによって録音する長さを決められる。


readsf~は音声ファイルの再生を行なう。
「open」でファイルを開き、1と0でファイルを再生・中止する。


soundfilerはテーブルに音声ファイルを読み込む。
ここでは音声ファイルの長さに従い、「;array1 resize $1」でテーブルの長さを調整している。


tabplay~はテーブルのデータを無加工で再生する。