録音と再生

音声ファイルの作成と再生

#N canvas 0 0 661 400 12; #X msg 272 121 open test.wav; #X msg 284 152 start; #X msg 290 179 stop; #X msg 441 121 open test.wav; #X obj 272 245 writesf~ 2; #X obj 441 245 readsf~ 2; #X msg 453 152 1; #X msg 459 179 0; #N canvas 0 0 466 316 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 31 321 pd DAC; #X obj 31 175 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 8300 1; #N canvas 114 249 388 390 Pd 0; #X obj 265 8 inlet; #X obj 105 318 outlet~; #X obj 106 282 *~; #X obj 245 318 outlet~; #X obj 246 282 *~; #X obj 126 153 mtof; #X msg 19 128 1; #X obj 62 99 del 10; #X obj 19 63 b; #X msg 62 128 0; #X obj 106 224 *~; #X obj 126 182 phasor~; #X obj 126 74 * 128; #X obj 126 103 + 128; #X obj 211 182 * -1; #X obj 211 220 + 1; #X obj 19 178 lop~ 2; #X connect 0 0 8 0; #X connect 0 0 12 0; #X connect 0 0 14 0; #X connect 0 0 4 1; #X connect 2 0 1 0; #X connect 4 0 3 0; #X connect 5 0 11 0; #X connect 6 0 16 0; #X connect 7 0 9 0; #X connect 8 0 7 0; #X connect 8 0 6 0; #X connect 9 0 16 0; #X connect 10 0 2 0; #X connect 10 0 4 0; #X connect 11 0 10 1; #X connect 12 0 13 0; #X connect 13 0 5 0; #X connect 14 0 15 0; #X connect 15 0 2 1; #X connect 16 0 10 0; #X restore 116 179 pd; #X obj 119 40 hsl 200 15 0 1 0 0 empty empty note -2 -6 0 8 -261681 -1 -1 8900 1; #X obj 508 277 bng 15 250 50 0 empty empty done 20 7 0 8 -262144 -1 -1; #X connect 0 0 4 0; #X connect 1 0 4 0; #X connect 2 0 4 0; #X connect 3 0 5 0; #X connect 5 0 8 1; #X connect 5 1 8 2; #X connect 5 2 12 0; #X connect 6 0 5 0; #X connect 7 0 5 0; #X connect 9 0 8 0; #X connect 10 0 8 1; #X connect 10 0 4 0; #X connect 10 1 8 2; #X connect 10 1 4 1; #X connect 11 0 10 0;

音声信号を録音し、音声ファイルとして保存するには「writesf~」を用いる。ここで「writesf~ 2」はステレオ(2ch)音声ファイルの作成であり、引数を省いた場合モノラル音声ファイルの作成となる。メッセージ「open[ファイルパス名]」でファイルが作成される(この例の場合はpdファイルと同じディレクトリにtest.wavを作成する)。次にメッセージ「start」で録音を開始する。ここでnoteとしたスライダを操作して、音声を録音してみる。メッセージ「stop」で録音は停止する。

音声ファイルを再生するには「readsf~」を用いる。メッセージ「open[ファイルパス名]」でファイルを開き、数値1により再生を開始、数値0により再生を停止する。数値1の前に毎回メッセージ「open」を要することに注意。

Arrayを用いた録音と再生

#N canvas 0 0 813 640 12; #X obj 87 126 soundfiler; #N canvas 0 0 450 300 graph5 0; #X array aa 155948 float 0; #X coords 0 1 155947 -1 300 100 1; #X restore 317 35 graph; #X floatatom 87 156 0 0 0 0 samples - -; #X obj 87 66 openpanel; #X obj 87 41 bng 15 250 50 0 empty empty load 0 -6 0 8 -262144 -1 -1; #X msg 87 96 read -resize \$1 aa; #N canvas 0 0 466 316 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 88 554 pd DAC; #X obj 88 408 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 12700 1; #X msg 645 96 \; aa normalize; #X obj 193 488 tabplay~ aa; #X obj 276 521 bng 15 250 50 0 empty empty done 20 7 0 8 -262144 -1 -1; #X obj 193 382 bng 15 250 50 0 empty empty play 0 -6 0 8 -262144 -1 -1; #X msg 229 418 set aa; #X msg 229 448 set bb; #N canvas 0 0 450 300 graph5 0; #X array bb 44100 float 0; #X coords 0 1 44099 -1 300 100 1; #X restore 316 217 graph; #X msg 632 493 set aa; #X msg 632 523 set bb; #X obj 498 567 tabwrite~ bb; #X obj 632 438 bng 15 250 50 0 empty empty rec 0 -6 0 8 -262144 -1 -1; #X msg 632 463 stop; #X obj 502 391 hsl 128 15 0 8000 0 0 empty empty note -2 -6 0 8 -262144 -1 -1 10300 1; #X msg 645 272 \; bb resize 441000; #X msg 645 226 \; bb resize 44100; #X obj 499 416 osc~; #X connect 0 0 2 0; #X connect 3 0 5 0; #X connect 4 0 3 0; #X connect 5 0 0 0; #X connect 7 0 6 0; #X connect 9 0 6 2; #X connect 9 0 6 1; #X connect 9 1 10 0; #X connect 11 0 9 0; #X connect 12 0 9 0; #X connect 13 0 9 0; #X connect 15 0 17 0; #X connect 16 0 17 0; #X connect 18 0 17 0; #X connect 19 0 17 0; #X connect 20 0 23 0; #X connect 23 0 17 0;

「soundfiler」により、Arrayに音声ファイルを読み込むことが出来る。ここで、loadとしたbangによりグラフ「aa」に任意の音声ファイルが読み込まれる(pdが解釈できるパスに限られる)。メッセージ「read」に含まれるオプション「-resize」は音声ファイルに合わせてArrayの配列長を変更する。またメッセージ「;[Array名]normalize」はArrayのデータを上限1、下限-1に正規化する。

「tabplay~」はbangによりArrayを音声信号として再生する。メッセージ「set[Array名]」は再生するArrayの指定である。

「tabwrite~」はbangによりArrayに音声信号を書き込み、メッセージ「stop」で書き込みを停止する。またArrayの終端に至ると書き込みは自動的に停止する。配列長が44100であれば、1秒間の録音が可能ということである。noteとしたスライダの操作で、Arrayに音声信号を録音、「tabplay~」でArrayを再生して確認してみる。

#N canvas 0 0 839 613 10; #N canvas 0 0 466 316 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 81 527 pd DAC; #X obj 81 363 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 12700 1; #N canvas 0 0 450 300 graph8 0; #X array q1 44100 float 0; #X coords 0 1 44099 -1 100 100 1; #X restore 690 33 graph; #X obj 117 40 vsl 15 128 0 5000 0 0 empty empty mod 0 -8 0 8 -228992 -1 -1 900 1; #X obj 144 40 vsl 15 128 0 5000 0 0 empty empty car 0 -8 0 8 -228992 -1 -1 10600 1; #X obj 171 40 vsl 15 128 0 5000 0 0 empty empty dep 0 -8 0 8 -228992 -1 -1 5000 1; #X obj 198 40 vsl 15 128 0 1000 0 0 empty empty decay 0 -8 0 8 -228992 -1 -1 2000 1; #X obj 240 100 bng 36 250 50 0 empty empty store 0 -6 0 8 -225271 -24198 -1; #X msg 253 212 stop; #X obj 240 292 tabwrite~; #X obj 253 185 del 1000; #X obj 482 100 tabplay~ q1; #X obj 503 131 tabplay~ q2; #N canvas 0 0 450 300 graph8 0; #X array q2 44100 float 0; #X coords 0 1 44099 -1 100 100 1; #X restore 690 143 graph; #N canvas 0 0 450 300 graph8 0; #X array q3 44100 float 0; #X coords 0 1 44099 -1 100 100 1; #X restore 690 253 graph; #X msg 358 163 set q1; #X msg 358 190 set q2; #X msg 358 217 set q3; #X obj 257 531 writesf~; #X msg 306 463 start; #X msg 306 490 stop; #X obj 419 502 readsf~; #N canvas 0 0 450 300 graph8 0; #X array q4 44100 float 0; #X coords 0 1 44099 -1 100 100 1; #X restore 690 363 graph; #X msg 358 244 set q4; #N canvas 0 0 513 470 __________fmperc 0; #X obj 103 153 osc~; #X obj 103 191 *~; #X obj 104 273 +~; #X obj 104 310 osc~; #X obj 103 232 *~; #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 103 76 inlet; #X obj 203 76 inlet; #X obj 152 76 inlet; #X obj 105 395 outlet~; #X obj 397 29 inlet; #X connect 0 0 1 0; #X connect 1 0 4 0; #X connect 2 0 3 0; #X connect 3 0 6 0; #X connect 4 0 2 0; #X connect 5 0 6 1; #X connect 5 0 1 1; #X connect 6 0 13 0; #X connect 7 0 5 0; #X connect 8 0 7 0; #X connect 9 0 8 2; #X connect 10 0 0 0; #X connect 11 0 4 1; #X connect 12 0 2 1; #X connect 14 0 8 0; #X restore 117 181 pd __________fmperc; #X obj 482 33 key; #X obj 482 60 sel 49 50 51 52; #X obj 482 226 /~ 4; #X obj 112 478 catch~; #X obj 117 258 throw~; #X obj 482 253 throw~; #X obj 419 529 throw~; #X obj 524 163 tabplay~ q3; #X obj 545 190 tabplay~ q4; #X msg 257 436 open perc.wav; #X msg 455 464 open perc.wav; #X obj 419 412 bng 15 250 50 0 empty empty play 0 -6 0 8 -262144 -1 -1; #X obj 419 437 t b b; #X msg 419 464 1; #X obj 118 232 /~ 4; #X connect 1 0 0 0; #X connect 3 0 24 0; #X connect 4 0 24 1; #X connect 5 0 24 2; #X connect 6 0 24 3; #X connect 7 0 24 4; #X connect 7 0 9 0; #X connect 7 0 10 0; #X connect 8 0 9 0; #X connect 10 0 8 0; #X connect 11 0 27 0; #X connect 12 0 27 0; #X connect 15 0 9 0; #X connect 16 0 9 0; #X connect 17 0 9 0; #X connect 19 0 18 0; #X connect 20 0 18 0; #X connect 21 0 31 0; #X connect 23 0 9 0; #X connect 24 0 9 0; #X connect 24 0 39 0; #X connect 25 0 26 0; #X connect 26 0 11 0; #X connect 26 1 12 0; #X connect 26 2 32 0; #X connect 26 3 33 0; #X connect 27 0 30 0; #X connect 28 0 0 2; #X connect 28 0 0 1; #X connect 28 0 18 0; #X connect 32 0 27 0; #X connect 33 0 27 0; #X connect 34 0 18 0; #X connect 35 0 21 0; #X connect 36 0 37 0; #X connect 37 0 38 0; #X connect 37 1 35 0; #X connect 38 0 21 0; #X connect 39 0 29 0;

「tabwrite~」「tabplay~」を用いた簡単な楽器の例を示す。4本のスライダにより音色を調整し、メッセージ「set」により録音先を決定した上で、storeとしたbangにより、音色のテストとArrayへの録音を行う。録音した音はキーボードから1,2,3,4のキーで演奏できる。「writesf~」により、演奏の音声ファイルへの録音、「readsf~」による録音ファイルの再生が可能である。

再生のバリエーション

#N canvas 0 0 643 618 12; #X obj 87 126 soundfiler; #N canvas 0 0 450 300 graph5 0; #X array aa 421888 float 0; #X coords 0 1 421887 -1 300 100 1; #X restore 284 37 graph; #X floatatom 87 156 0 0 0 0 samples - -; #X obj 87 66 openpanel; #X obj 87 41 bng 15 250 50 0 empty empty load 0 -6 0 8 -262144 -1 -1; #X msg 87 96 read -resize \$1 aa; #N canvas 0 0 466 316 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 88 554 pd DAC; #X obj 88 408 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X msg 484 156 \; aa normalize; #X obj 248 403 phasor~; #X obj 248 439 *~; #X floatatom 248 376 5 0 0 1 Hz - -; #X obj 248 346 expr 44100/$f1; #X obj 488 505 tabread4~; #X obj 488 535 tabosc4~; #X obj 248 474 tabread~ aa; #X connect 0 0 2 0; #X connect 2 0 12 0; #X connect 2 0 10 1; #X connect 3 0 5 0; #X connect 4 0 3 0; #X connect 5 0 0 0; #X connect 7 0 6 0; #X connect 9 0 10 0; #X connect 10 0 15 0; #X connect 11 0 9 0; #X connect 12 0 11 0; #X connect 15 0 6 2; #X connect 15 0 6 1;

「tabread~」を用いたArrayの再生を示す。ここで「phasor~」を用いてArrayの読み出しを行っていることに注目する。「phasor~」の出力に配列長を乗算することで、Array全体がループ再生される。また「phasor~」の周波数を変化させることで、再生速度が操作できる。周波数を負数にした場合、逆再生が行われる。

Arrayを用いた再生には他にも「tabread4~」「tabosc4~」を用いることができるが、その場合はこれらのオブジェクトの機能である多項式補間(出力波形が滑らかになる)が可能となるために、Arrayの配列長が2の累乗+3である必要がある。予め配列長を決定した上で、「soundfiler」へのメッセージ「read」から「-resize」を省いて音声を読み込むなどの方法が考えられる。

#N canvas 0 0 695 661 10; #X obj 87 129 soundfiler; #N canvas 0 0 450 300 graph5 0; #X array aa 671232 float 0; #X coords 0 1 671231 -1 300 100 1; #X restore 284 37 graph; #X floatatom 87 159 0 0 0 0 samples - -; #X obj 87 69 openpanel; #X obj 87 41 bng 15 250 50 0 empty empty load 0 -6 0 8 -262144 -1 -1; #X msg 87 99 read -resize \$1 aa; #N canvas 0 0 466 316 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 545 pd DAC; #X obj 48 399 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 12700 1; #X msg 484 159 \; aa normalize; #X obj 266 295 phasor~; #X floatatom 266 268 5 0 0 1 Hz - -; #X obj 267 478 tabread~ aa; #X obj 170 433 -~ 0.5; #X obj 170 493 cos~; #X obj 170 523 *~; #X obj 170 463 *~ 0.5; #X obj 485 295 hsl 128 15 0 1 0 0 empty empty start -2 -6 0 8 -262144 -1 -1 0 1; #X obj 267 418 +~; #X obj 266 238 expr 44100/$f1; #X obj 267 448 *~; #X obj 171 572 *~; #X obj 184 549 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 281 549 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 172 608 throw~; #X obj 79 516 catch~; #X obj 482 351 samphold~; #X obj 388 351 samphold~; #X floatatom 388 295 5 0 0 2 div - -; #X obj 267 388 /~; #X obj 268 572 *~; #X connect 0 0 2 0; #X connect 2 0 18 0; #X connect 2 0 19 1; #X connect 3 0 5 0; #X connect 4 0 3 0; #X connect 5 0 0 0; #X connect 7 0 6 0; #X connect 9 0 12 0; #X connect 9 0 28 0; #X connect 9 0 26 1; #X connect 9 0 25 1; #X connect 10 0 9 0; #X connect 11 0 14 1; #X connect 11 0 29 0; #X connect 12 0 15 0; #X connect 13 0 14 0; #X connect 14 0 20 0; #X connect 15 0 13 0; #X connect 16 0 25 0; #X connect 17 0 19 0; #X connect 18 0 10 0; #X connect 19 0 11 0; #X connect 20 0 23 0; #X connect 21 0 20 1; #X connect 22 0 29 1; #X connect 24 0 6 1; #X connect 24 0 6 2; #X connect 25 0 17 1; #X connect 26 0 28 1; #X connect 27 0 26 0; #X connect 28 0 17 0; #X connect 29 0 23 0;

「phasor~」の出力に様々な計算を行うことで、多様な再生が可能となる。この例で、divとしたナンバーは配列長を分割し、ループ再生の範囲を狭める。startとしたスライダは再生の開始位置を変える。「phasor~」の周波数で再生速度が変わるのは前述の通りである。これによりArrayの任意の範囲の任意の速度での再生が可能となった。

ここでdivにより、再生範囲を非常に短くし、再生速度を上げることで、スライダで指定した位置で音を静止させたような効果を作ることが出来る。ところでこれは、非常に短い音を大量に集めるという、細粒合成(Granular Synthesis)の考え方に近いものがある。

任意の範囲のループにより波形の断裂が生じるが、これを回避するためにループと同期させてエンベロープを適用することができる。ここでは「phasor~」の出力を「-~ 0.5」「*~ 0.5」「cos~」に通すことでエンベロープを作っている。トグルの切替により、エンベロープの有無による音色の差を確認する。

またこの例では省いているが、FFTと同様エンベロープのオーバーラップにより、エンベロープによるトレモロ効果を軽減することが出来るだろう。

さらに「samphold~」を用いて、ナンバーやスライダの操作時に発生する波形の断裂を回避している。「samphold~」は右入力の音声信号が減少した時にのみ、左入力の値を出力する。0~1までの直線波形を繰り返す「phasor~」を「samphold~」の右入力に用いた場合は、「phasor~」の周期の変わり目にのみ、値を出力することになる。

この他「tabread~」への入力信号を様々にすることで、録音された音声の時間領域での様々な操作、音声の変形が可能になるだろう。