pdをやりなおす(1)

参考

オーディオプログラミング言語の比較
http://en.wikipedia.org/wiki/Comparison_of_audio_synthesis_environments


開発者Miller Puckette氏サイト http://crca.ucsd.edu/~msp/
電子音楽の理論とテクニック」http://crca.ucsd.edu/~msp/techniques.htmが参考になるかもしれない。例をpdで挙げている。

導入

pd-extendedをダウンロードする。入手先 http://puredata.info/downloads
各種拡張ライブラリが予め含まれており、インストーラで導入できるので便利。

音声のテスト

無事pdのダウンロードとインストールが完了、起動したものとする。


Media>Test Audio and MIDI、テストパッチを開く。
「TEST SIGNAL」ラジオボタンを押してみて(-40または-20)音が聴こえればOK。
聴こえない場合はPCを含めオーディオ設定を調べる。
オーディオ処理を示すcompute audioのチェックボックスにチェックがあることを確認。
(通常は自分でチェックを入れる)


以降は最大音量が出るのでオーディオ設定に注意して次へ。

基本操作

File>New、新規パッチウィンドウを開く。
pdでは、ここに各種オブジェクトを並べ、線でつなぐことでプログラミングをする。


Put>Object、新規オブジェクトを置く。
箱の中に「osc~」とタイプし、箱の外で1回クリック。
osc~オブジェクトを作成した。これはオシレータである。
もうひとつオブジェクトを作成する。今度は「dac~」オーディオ出力。


pdにどんなオブジェクトが用意されているのかを知るには、ウィンドウ内の何もない場所で右クリック>Help。
標準オブジェクトの一覧が見られる。
オブジェクトを右クリック>Helpでオブジェクトのヘルプが見られる。


音声信号を扱うオブジェクトは多くの場合、名前の末尾が~(チルダ)になっている。
例えば掛け算を行なうオブジェクトには*と*~の2種がある。


さて、先程のosc~の左下角にポインタを移動すると、ポインタが○の形になる。
そのままdac~の左上角までポインタをドラッグすると線が伸び、再びポインタが○になる。
ここでマウスボタンを離すと太線が引かれる。太線は音声の経路を意味する。
なお、数値等の値を扱うオブジェクト(チルダなし)には音声信号は入力できない(結線できない)。


オブジェクトにはこのように端子の印が描かれている。
上側にあるのは入力(インレット)、下側にあるのは出力(アウトレット)。


dac~のもうひとつのインレットにも太線を引く。
線を消すにはEditモードで線の上にポインタを置く→×になるのでクリック→Edit>Cut。


キーボードショートカットは各自確認すること。


さてオシレータをオーディオ出力につないだが、このままでは音が聴こえない。
Put>Number、ナンバーボックスを作成。
ナンバーボックスのoutからosc~の左インレットに線を引く。
すると今度は細線が引かれる。細線は数値等の値の経路を意味する。


Edit>Edit mode、演奏モードに切り替える。
ナンバーボックスをクリックし「100」とタイプすると100Hzのサイン波が出る。
ナンバーボックスをドラッグすると数が連続的に変化する。
Shift+ドラッグでナンバーボックスの増減は0.01刻みになる。


以上、pdで音を出すための最も簡単なパッチ(プログラム)を書いた。
File>Save、適当な名前で保存する。


保存したpdファイルをテキストエディタで開いてみる。
(ファイルの場所は通常C:\Program Files\pd)

#N canvas 0 0 450 300 12; #X obj 200 134 osc~; #X obj 201 176 dac~; #X floatatom 200 96 5 0 0 0 - - -; #X connect 0 0 1 0; #X connect 0 0 1 1; #X connect 2 0 0 0;


pdのコードはこのようにテキストで記述されている(改行は省略した)。
以後、作例はこのようにテキストで示す。
空のテキストファイルにコードを貼り付け、拡張子pdで保存。pdから開いて実行する。

音量を操作する

めでたく音が出たとはいえ、実はこのままでは具合が悪い。
pdウィンドウのpeak metersチェックボックスを入れてみると、OUTの値が100となり、CLIPが赤く点灯している。
osc~の値が20未満で可聴域を下回っていても、常に信号は出ている状態。

#N canvas 0 0 450 300 12; #X obj 156 190 dac~; #X obj 157 80 osc~ 440; #X obj 157 138 *~; #X floatatom 249 80 5 0 0 0 - - -; #X connect 1 0 2 0; #X connect 2 0 0 0; #X connect 2 0 0 1; #X connect 3 0 2 1;


音量を操作するにはosc~の出力に*~をつなげて掛け算を行なう。
ナンバーボックスを操作することで音量を変えられるが、Shift+ドラッグで0.01刻みにする必要がある。
試しに1以上の値にするといきなり音が割れてしまう。
osc~の出力は-1〜+1の範囲。これはpdが正常に扱える音声信号の範囲に等しい。


さらにナンバーボックスをドラッグするたびに(よく聴くと)ブチブチとノイズが乗る。
これは数値などが音声信号よりも粗い時間間隔でやりとりされるためだろう。


なお、osc~の横に440とあるのは引数。引数で周波数の初期値を指定することもできる。
この場合は440Hzのオシレータとなる。

#N canvas 0 0 454 323 12; #X obj 177 165 dac~; #X obj 119 50 osc~ 440; #X obj 178 113 *~; #X floatatom 267 50 5 0 0 0 - - -; #X obj 267 -98 vsl 15 128 0 1 0 0 empty empty empty 0 -9 0 10 -262130 -1 -1 0 1; #X obj 196 50 lop~ 5; #X connect 1 0 2 0; #X connect 2 0 0 0; #X connect 2 0 0 1; #X connect 4 0 3 0; #X connect 4 0 5 0; #X connect 5 0 2 1;


改良したパッチ。スライダで音量を操作する。
スライダのプロパティで出力範囲を0〜1に変更(初期状態は0〜127)。
(オブジェクトのプロパティは右クリック>Properties)


また、操作時のノイズを防ぐため、スライダの値をローパスフィルタlop~に入力している。
カットオフ周波数5Hzという可聴域未満の信号しか通さない超ローパスフィルタだが、
断続的な信号を滑らかに補間することができる。

#N canvas 0 0 454 323 12; #X obj 167 218 dac~; #X obj 168 166 *~; #X obj 110 112 osc~ 440; #X obj 187 111 line~; #X msg 187 71 1 \, 0 1000; #X connect 1 0 0 0; #X connect 1 0 0 1; #X connect 2 0 1 0; #X connect 3 0 1 1; #X connect 4 0 3 0;


メッセージボックス「1, 0 1000」をクリックすると、ピアノのように減衰する音が鳴る。
line~を使って波形を作っている。メッセージは「1から始まり、1000ms(1秒)かけて0に至る」というような意味。
このように音量を制御する波形をエンベロープ(封筒)と呼ぶ。
エンベロープは音色の設計にとって重要である。

周波数を操作する

#N canvas 0 0 450 300 12; #X obj 189 245 dac~; #X obj 190 193 *~; #X obj 209 85 line~; #X obj 133 160 osc~; #X obj 133 124 *~ 440; #X msg 209 45 1 \, 0 1000; #X connect 1 0 0 0; #X connect 1 0 0 1; #X connect 2 0 1 1; #X connect 2 0 4 0; #X connect 3 0 1 0; #X connect 4 0 3 0; #X connect 5 0 2 0;


エンベロープを使って同時に周波数も制御した例。
1から0のエンベロープを440倍しているので、周波数は440Hzから0Hzへと変化する。

#N canvas 0 0 426 476 12; #X obj 175 399 dac~; #X obj 176 347 *~; #X obj 194 83 line~; #X obj 139 306 osc~; #X obj 138 205 *~; #X obj 139 168 *~; #X obj 140 132 *~; #X obj 138 272 +~ 50; #X obj 139 239 *~ 500; #X msg 194 43 1 \, 0 400; #X connect 1 0 0 0; #X connect 1 0 0 1; #X connect 2 0 1 1; #X connect 2 0 6 0; #X connect 2 0 6 1; #X connect 3 0 1 0; #X connect 4 0 8 0; #X connect 5 0 4 0; #X connect 5 0 4 1; #X connect 6 0 5 0; #X connect 6 0 5 1; #X connect 7 0 3 0; #X connect 8 0 7 0; #X connect 9 0 2 0;


エンベロープにいろいろな演算を行なうことで音色を設計している。
なお*~のふたつのインレットに同じ信号を入力しているのは2乗の意味になる。

#N canvas 0 0 450 300 12; #X obj 203 244 dac~; #X obj 204 192 *~; #X obj 223 74 line~; #X obj 35 154 osc~; #X msg 223 35 1 \, 0 400; #X obj 36 123 expr~ pow($v1 \, 8)*500+50; #X connect 1 0 0 0; #X connect 1 0 0 1; #X connect 2 0 1 1; #X connect 2 0 5 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 5 0 3 0;


しかし同様の演算であればexpr~を用いる方がすっきりする。
expr、expr~、fexpr~はそれぞれ数値、音声信号、サンプル毎の音声信号を演算し、数式で書くことが出来る。
詳しくはオブジェクトのヘルプ、またはhttp://crca.ucsd.edu/~syadegar/expr.html

#N canvas 0 0 448 466 12; #X obj 209 391 dac~; #X obj 210 339 *~; #X obj 228 104 line~; #X obj 75 290 osc~; #X msg 228 65 1 \, 0 400; #X obj 92 165 expr~ pow($v1 \, 8); #X obj 73 212 *~; #X obj 74 252 *~ 800; #X obj 74 119 osc~ 100; #X connect 1 0 0 0; #X connect 1 0 0 1; #X connect 2 0 5 0; #X connect 2 0 1 1; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 5 0 6 1; #X connect 6 0 7 0; #X connect 7 0 3 0; #X connect 8 0 6 0; 


osc~の出力を再びosc~に入れている。非常に簡単なFM(周波数変調)の例。
このように、波形に対して様々な演算を行なうことで、様々な音色を作ることができる。
File>Open>doc>3.audio.examplesに膨大な作例が存在する。
pdのドキュメントは非常に充実している。

#N canvas 0 0 448 466 12; #X obj 255 401 dac~; #X obj 256 349 *~; #X obj 274 114 line~; #X obj 119 300 osc~; #X msg 274 75 1 \, 0 400; #X obj 119 217 *~; #X floatatom 119 28 5 0 0 0 - - -; #X obj 119 131 osc~; #X obj 138 167 expr~ pow($v1 \, 8); #X obj 119 262 *~; #X obj 59 215 * 8; #X connect 1 0 0 0; #X connect 1 0 0 1; #X connect 2 0 1 1; #X connect 2 0 8 0; #X connect 3 0 1 0; #X connect 4 0 2 0; #X connect 5 0 9 0; #X connect 6 0 7 0; #X connect 6 0 4 0; #X connect 6 0 10 0; #X connect 7 0 5 0; #X connect 8 0 5 1; #X connect 9 0 3 0; #X connect 10 0 9 1;


ナンバーボックスを操作することで、同じ音色を様々な高さで鳴らす。
100以上の値でゆっくりドラッグしてみる。


(ここでナンバーからメッセージに線がつながっているが、変数がないメッセージへの入力は全てbangとして解釈される。bangについては後述)