周波数の操作
音の高さを変える
#N canvas 0 0 474 324 12; #X obj 114 169 osc~; #X floatatom 114 131 5 0 0 1 Hz - -; #X obj 113 261 tabwrite~ osc; #X obj 137 231 metro 1000; #X obj 137 204 loadbang; #N canvas 0 0 450 300 graph2 0; #X array osc 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 230 15 graph; #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 27 261 pd DAC; #X obj 27 115 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 2 0; #X connect 0 0 6 2; #X connect 0 0 6 1; #X connect 1 0 0 0; #X connect 3 0 2 0; #X connect 4 0 3 0; #X connect 7 0 6 0;
「osc~」や「phasor~」で音の高さを変えるには右入力に周波数を入力する。上の例では「osc~」の上、Hzとしたナンバーを動かす。周波数の増加に応じて、グラフ表示される波形に変化が起こる。波線の数が増えていくように見えるが、これはある時間あたりの波の周期が増えていることを意味する。
Hz(ヘルツ)とは一秒あたりの周期の数(周波数)を表す単位であり、例えば1000Hzなら一秒間に波が千回生じることを意味する。聴覚にとって、このように高い値の周波数は回数ではなく、音の高さとして感覚される。従って周波数を音の高さの単位と言う事も出来る。人間が聴覚可能な周波数は、概ね20~20000Hzと言われ、これを可聴域と呼ぶ。
ところで波については、単位時間あたりの周波数ではなく、周期の間隔を波の長さとして示す単位、波長も存在する。例えば光学においては波長表記が一般的であるが、波長も周波数も、波について同じようなことを表していると言える。周波数の増加は波長の減少に等しい。
音階を作る
ところで音楽において、2倍の周波数はオクターブ(八度)と呼ばれる。つまり「ドレミファソラシド」のふたつの「ド」は周波数で2倍の関係である。例えば国際標準ピッチのA音(ラ)は440Hzだが、55Hz、110Hz、220Hz、880Hz、1760Hz、3520Hzも同様にA音である。既知の音階の多くは、このオクターブを枠として作られている。 オクターブを12分割したものが半音階である。ピアノなどの鍵盤は、この半音階がそのまま並んだものと言える。ギターのフレットでも、半音階を視覚的に把握することが出来るが、そこに見られるような、ひとつのややこしい問題がある。オクターブとは2倍の周波数だったが、単にこれを12等分しても、音程としては不等分である。フレットが全体的に、徐々に間隔を狭めていることから見ても、単に12等分でないのはわかる。 オクターブが2倍、ということから理解されるように、音程の感覚とは加算的ではなく、乗算的である。要するに半音程とは、12回乗算すると2になる数、2の12乗根でなければならない。このややこしい計算を、pdでは「mtof」により簡略化している。#N canvas 0 0 466 316 12; #N canvas 0 0 458 308 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 62 inlet; #X obj 175 126 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 23 262 pd DAC; #X obj 23 116 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 194 205 osc~; #X floatatom 194 163 0 0 0 0 Hz - -; #X obj 194 123 mtof; #X floatatom 194 81 5 0 0 0 - - -; #X connect 1 0 0 0; #X connect 2 0 0 2; #X connect 2 0 0 1; #X connect 3 0 2 0; #X connect 4 0 3 0; #X connect 5 0 4 0;
「mtof」に入力される数値はMIDIノートナンバーと同様、半音程を1とした半音階の数値表現である。ピアノで言う「中央のC音」が60、440HzのA音は69である。MIDIノートナンバーとの相違は、0~127に値を限らないことである。
ところで「mtof」によって出力される数値はいわゆる平均律の音程である。平均律は2の12乗根という無理数によって計算するため、厳密には残らず不協和音程である。一方、3/2のような有理数を音程比とする音律は純正律である。純正律は非常に良く協和するとされる一方で、例えば各調ごとに音階を用意すると、膨大な数の周波数が出てくるため転調が困難、などという欠点がある。本文で音律の問題を仔細に検討することはせず、他の機会に譲るが、pdにおいて、四則演算オブジェクトなどを用いて、様々な音律を検討することは可能と思われる。
#N canvas 0 0 466 316 12; #N canvas 0 0 458 308 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 62 inlet; #X obj 175 126 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 23 262 pd DAC; #X obj 23 116 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 292 203 osc~; #X floatatom 292 175 0 0 0 0 Hz - -; #X obj 292 147 mtof; #X msg 146 35 0; #X msg 186 35 2; #X msg 226 35 4; #X msg 267 35 7; #X msg 309 35 9; #X obj 292 119 + 60; #X floatatom 319 93 5 0 0 2 transpose - -; #X connect 1 0 0 0; #X connect 2 0 0 2; #X connect 2 0 0 1; #X connect 3 0 2 0; #X connect 4 0 3 0; #X connect 5 0 10 0; #X connect 6 0 10 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 10 0; #X connect 10 0 4 0; #X connect 11 0 10 1;
「mtof」を用いて、音階を扱いやすくした例が上である。メッセージ「0」「2」「4」「7」「9」を鍵盤のように並べているが、これは民謡調の五音音階(ペンタトニック)のひとつである。メッセージのクリックで、簡単な演奏が可能である。transposeとしたナンバーにより、いわゆる移調が可能だが、要するに元の音階構造0,2,4,7,9に何を加算するかということである。
当然他にも様々な音階が考えられるが、これも本文での話題に値しない。ただひとつ余談だが、12音平均律とオクターブに基づき、半音の連続を含まず、最も音数の多い音階は全部で七種である。そのほとんどは良く知られた音階である。その他の半音の連続を含まない音階(全部で1499種である)は、全てこの七音階の移調、旋法、省略により得られるが、逐次計算で求めたため証明する手立てを私は知らない(証明できた方は教えて欲しい)。以下にその音程構造を示す。数は半音数による間隔=音程である。
キーボードで演奏する
#N canvas 0 0 478 328 12; #N canvas 0 0 458 308 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 126 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 23 262 pd DAC; #X obj 23 116 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 202 162 osc~; #X floatatom 202 136 0 0 0 0 Hz - -; #X obj 202 110 mtof; #X obj 202 33 keyup; #X floatatom 202 87 5 0 0 0 - - -; #X obj 99 33 notein; #X connect 1 0 0 0; #X connect 2 0 0 2; #X connect 2 0 0 1; #X connect 3 0 2 0; #X connect 4 0 3 0; #X connect 5 0 6 0; #X connect 6 0 4 0; #X connect 7 0 6 0;
pdにおけるキーボードでの演奏はふたつ考えられる。MIDI入力が使える状態にあれば「notein」などのMIDI関連オブジェクトを用いて、通常の音階演奏ができる。もうひとつは、ほとんど冗談なのだが「keyup」を用いてPCのキーボードで音階演奏できる。「keyup」はPCの文字コード(OS依存)を出力するので、キーボード上の音階の並びは当然MIDIキーボードのようには定かではない。しかしこの場合は「mtof」による音階演奏だが、その他の制御に「keyup」などのオブジェクトを用いて、生演奏に役立てることは考えられる。Shiftキーの使用、つまり「大文字」と「小文字」で音域が変わることを確認する。
ポルタメント、ビブラート
#N canvas 0 0 487 498 12; #N canvas 0 0 458 308 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 126 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 71 399 pd DAC; #X obj 71 253 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 174 349 osc~; #X obj 175 42 keyup; #X floatatom 175 73 5 0 0 0 - - -; #X obj 175 277 mtof~; #X obj 348 179 nbx 5 14 -1e+037 1e+037 0 0 empty empty vib.depth 0 -6 0 10 -262144 -1 -1 0 256; #X obj 281 73 nbx 5 14 -1e+037 1e+037 0 0 empty empty port. 0 -6 0 10 -262144 -1 -1 0 256; #X obj 253 174 osc~; #X obj 254 211 *~; #X obj 348 137 nbx 5 14 -1e+037 1e+037 0 0 empty empty vib.speed 0 -6 0 10 -262144 -1 -1 0 256; #X obj 175 248 +~; #X obj 175 106 lop~ 20; #X connect 1 0 0 0; #X connect 2 0 0 2; #X connect 2 0 0 1; #X connect 3 0 4 0; #X connect 4 0 12 0; #X connect 5 0 2 0; #X connect 6 0 9 1; #X connect 7 0 12 1; #X connect 8 0 9 0; #X connect 9 0 11 1; #X connect 10 0 8 0; #X connect 11 0 5 0; #X connect 12 0 11 0;
上の例では「keyup」と「mtof」での音階演奏を行う。まずこの例では「keyup」から出力した文字コード=ノートナンバーを「lop~」に入力している。元来、低音域通過フィルタの「lop~」だが、急激な値の変化を滑らかにする性質がある。こうして滑らかな音高の変化(ポルタメント)が可能になる。port.としたナンバーは「lop~」のカットオフ周波数を変えるものだが、数値の減少に応じてポルタメントに要する時間長くなることを確認する。例えば0.1の場合は非常に長いポルタメントとなる。
次に「osc~」と「*~」が、「+~」によりノートナンバーに加算されているが、ここでvib.speedを5、vid.depthを0.5にしてみる。これにより、-0.5~0.5の間で波打つ値の変化が5Hzの速度で生じ、ノートナンバーに揺れが与えられる。この揺れがビブラートである。ポルタメントやビブラートは元々アコースティック楽器における技術ないし現象だが、その模倣によって「osc~」などの電子音の単調さを回避することができる。これら三数値の様々な組み合わせを試してみる。
周波数変調
ここでvib.speedを100、vib.depthを12としてみる。2オクターブに及ぶビブラートが毎秒100回かけられるわけだが、この場合は既にビブラートとしてではなく、音色の変化として聴くことになる。これは周波数変調(Frequency Modulation, FM)と呼ばれる音色合成法の一例である。#N canvas 0 0 416 465 12; #N canvas 0 0 458 308 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 126 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 23 262 pd DAC; #X obj 23 116 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 112 62 osc~; #X obj 112 111 *~; #X obj 112 160 +~; #X obj 111 209 osc~; #X obj 166 34 nbx 5 14 -1e+037 1e+037 0 0 empty empty vib.speed 0 -6 0 10 -262144 -1 -1 0 256; #X obj 166 86 nbx 5 14 -1e+037 1e+037 0 0 empty empty vib.depth 0 -6 0 10 -262144 -1 -1 0 256; #X obj 166 135 nbx 5 14 -1e+037 1e+037 0 0 empty empty center 0 -6 0 10 -262144 -1 -1 0 256; #N canvas 0 0 474 324 graph1 0; #X array spec 256 float 0; #X obj 173 112 inlet~; #X obj 173 144 rfft~; #X obj 172 180 *~; #X obj 208 180 *~; #X obj 173 215 sqrt~; #X obj 172 254 tabwrite~ spec; #X obj 71 144 loadbang; #X obj 171 65 block~ 2048 1 1; #X obj 71 180 metro 500; #X connect 1 0 2 0; #X connect 2 0 3 0; #X connect 2 0 3 1; #X connect 2 1 4 0; #X connect 2 1 4 1; #X connect 3 0 5 0; #X connect 4 0 5 0; #X connect 5 0 6 0; #X connect 7 0 9 0; #X connect 9 0 6 0; #X coords 0 1024 255 0 200 140 1; #X restore 162 262 graph; #X connect 1 0 0 0; #X connect 2 0 3 0; #X connect 3 0 4 0; #X connect 4 0 5 0; #X connect 5 0 0 2; #X connect 5 0 0 1; #X connect 5 0 9 0; #X connect 6 0 2 0; #X connect 7 0 3 1; #X connect 8 0 4 1;
上の例はFMについて単純化したパッチである。centerとしたナンバー(+~)が基本となる「osc~」の周波数を決定し、vib.depthはビブラートの幅(*~)、vib.speedはビブラートの速度(osc~)である。
まずcenterを1000、vib.speedを100とする。この状態ではビブラートはかかっていないのでグラフ「spec」には一本のピークのみ表示されている。1000Hzのコサイン波である。次にvib.depthを徐々に増加させていくと、音色の変化を確認する。グラフ「spec」に多数のピークが表示されているが、これは各々異なる周波数の音(部分音)が多数鳴っていることを示している。ひとつの音色と思われているものは、実は多数の音の集まりである。
centerを1000、vib.speedを500、vib.depthを任意とする。vib.depthは音色の明るさに関わるが、グラフ「spec」により、いわゆる音色の明るさが、高音域に生じるピークであることを確認する。centerとvib.speedは、結局二個の「osc~」の周波数を決定していることになるが、ふたつの周波数の比は2:1、つまりオクターブである。このように、FMに用いるふたつの周波数の比を単純な整数比にすると、音高感の明確な音色となる。グラフ「spec」には複数のピークが、等間隔に並んでいることを確認する。
FMによって生じる周波数は、RMと似ているが、ふたつの周波数の和と差に加え、ビブラート周波数の整数倍周波数と、もう一方の周波数との、和と差の周波数が生じる。結果として単純な周波数比によるFMはオクターブを多く含むことになり、音高感が明確となる。周波数比が変わると音色も変わるため、旋律音としてFMを用いる場合にはふたつの周波数を同時に制御する必要がある。
#N canvas 0 0 611 581 12; #N canvas 0 0 458 308 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 126 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 46 451 pd DAC; #X obj 46 305 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 5300 1; #X obj 110 316 osc~; #X obj 196 53 nbx 5 14 -1e+037 1e+037 0 0 empty empty vib.speed 0 -6 0 10 -262144 -1 -1 400 256; #X obj 195 188 nbx 5 14 -1e+037 1e+037 0 0 empty empty vib.depth 0 -6 0 10 -262144 -1 -1 8000 256; #X obj 195 238 nbx 5 14 -1e+037 1e+037 0 0 empty empty center 0 -6 0 10 -262144 -1 -1 500 256; #N canvas 0 0 450 300 graph5 0; #X array env 11 float 1; #A 0 1.1 0.9 0.8 0.6 0.5 0.4 0.3 0.2 0.1 -0.1 -0.2; #X coords 0 1 10 0 200 70 1; #X restore 318 113 graph; #X obj 348 249 tabosc4~ env; #X floatatom 348 213 5 0 0 1 Hz - -; #X msg 423 53 \; env const 1; #X obj 348 282 max~ 0; #X obj 348 315 s~ ev; #X obj 109 385 *~; #X obj 142 351 r~ ev; #X obj 111 213 *~ 8000; #X obj 111 266 +~ 500; #X obj 112 85 osc~ 400; #X obj 112 159 *~; #X obj 146 128 r~ ev; #X connect 1 0 0 0; #X connect 2 0 12 0; #X connect 3 0 16 0; #X connect 4 0 14 1; #X connect 5 0 15 1; #X connect 7 0 10 0; #X connect 8 0 7 0; #X connect 10 0 11 0; #X connect 12 0 0 2; #X connect 12 0 0 1; #X connect 13 0 12 1; #X connect 14 0 15 0; #X connect 15 0 2 0; #X connect 16 0 17 0; #X connect 17 0 14 0; #X connect 18 0 17 1;
上はエンベロープを用いたFMの例である。これは簡単な打楽器音の模倣と言える。二個の「osc~」に同じエンベロープを適用しているが、重要なのはビブラート側のエンベロープ適用による音色変化である。ビブラートの振幅の大小は、部分音の音量の大小に換言される。各ナンバーやグラフの操作で音色の変化を確認する。
これまで検討してきたのは二個の「osc~」を用いる単純FMと呼ばれる方法だが、さらに多くの「osc~」を用いて、FM音によってさらにビブラートを行う、ビブラートの加算、分岐など、様々な変種が考えられる。また音声信号のフィードバックを用いたFMも考えられる。
#N canvas 0 0 332 377 12; #N canvas 0 0 458 308 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 126 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 27 310 pd DAC; #X obj 27 164 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 142 222 osc~; #X obj 216 68 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 256; #X obj 217 137 nbx 5 14 -1e+037 1e+037 0 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 256; #X obj 141 285 s~ FB; #X obj 142 32 r~ FB; #X obj 143 98 *~ 1820; #X obj 143 162 +~ 2770; #X connect 1 0 0 0; #X connect 2 0 0 2; #X connect 2 0 0 1; #X connect 2 0 5 0; #X connect 3 0 7 1; #X connect 4 0 8 1; #X connect 6 0 7 0; #X connect 7 0 8 0; #X connect 8 0 2 0;
上は一個の「osc~」のみ用いたフィードバックFMの例である。フィードバックとはある処理結果の出力を、処理過程の先頭や途中に戻して再度入力することを意味する。この例では自身の出力によって「osc~」がビブラートを受けている。あえて異常な結果を示すために初期値を設定しているが、この場合はもはや音色の生成というよりは、不規則なリズムの発生を認める。
全く不確定性を含まない式においても、係数の設定とフィードバックにより、結果が予測不可能となるものが存在することは、数学においても確認されている(1976年に発見された「ロジスティック関数」は有名なカオス式だが、x'=ax(1-x)という非常に単純なものである。x'は次の計算でxに代入される。ここでaを0~4の任意の数値とする時、x'の値はaにより、静止、周期性、部分的ないし全面的カオスなどの様々な挙動を示す)。
音域の音量を調整する(フィルタ)
フィルタを用いて、ある音域(周波数帯域)の音量を上げたり下げたりして、音色や音質を変えることができる。#N canvas 0 0 628 600 12; #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 72 534 pd DAC; #X obj 72 388 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 223 386 *~; #X obj 314 386 *~; #X obj 404 390 *~; #X obj 166 359 == 0; #X obj 242 359 == 1; #X obj 333 359 == 2; #X obj 423 359 == 3; #X obj 69 224 vradio 20 1 0 5 empty empty empty 0 -6 0 8 -262144 -1 -1 4; #X obj 489 486 +~; #X obj 222 202 lop~; #X obj 313 202 hip~; #X obj 404 202 bp~; #X obj 488 202 vcf~; #X obj 139 95 noise~; #X floatatom 413 95 5 0 0 1 Hz - -; #X floatatom 515 95 5 0 0 2 Q - -; #X obj 489 390 *~; #X obj 508 359 == 4; #X obj 416 55 hsl 128 15 0 10000 0 0 empty empty freq -4 -8 0 10 -262144 -1 -1 0 1; #X obj 139 386 *~ 1; #X connect 1 0 0 0; #X connect 2 0 10 0; #X connect 3 0 10 0; #X connect 4 0 10 0; #X connect 5 0 21 1; #X connect 6 0 2 1; #X connect 7 0 3 1; #X connect 8 0 4 1; #X connect 9 0 5 0; #X connect 9 0 6 0; #X connect 9 0 7 0; #X connect 9 0 8 0; #X connect 9 0 19 0; #X connect 10 0 0 2; #X connect 10 0 0 1; #X connect 11 0 2 0; #X connect 12 0 3 0; #X connect 13 0 4 0; #X connect 14 0 18 0; #X connect 15 0 11 0; #X connect 15 0 12 0; #X connect 15 0 13 0; #X connect 15 0 14 0; #X connect 15 0 21 0; #X connect 16 0 11 1; #X connect 16 0 12 1; #X connect 16 0 13 1; #X connect 16 0 14 1; #X connect 17 0 14 2; #X connect 17 0 13 2; #X connect 18 0 10 0; #X connect 19 0 18 1; #X connect 20 0 16 0; #X connect 21 0 10 0;
上の例では、pdにおける第三の音源「noise~」を用いている。その出力は「白色雑音」と呼ばれる、全ての周波数を含むノイズである(ところで「白色」とは光学的比喩である)。従ってフィルタの効果を検証するには丁度良い。
左端のラジオボタンにより音声出力を切り替える。端から順に、フィルタなし、ローパス(低域通過)フィルタ「lop~」、ハイパス(高域通過)フィルタ「hip~」、バンドパス(帯域通過)フィルタ「bp~」、電圧制御フィルタ「vcf~」である(「電圧制御」とはその模倣の意味だろう)。
まずfreqとしたスライダを操作しつつ「lop~」「hip~」による音色の変化を確認する。このふたつのフィルタの場合、スライダはカットオフ周波数である。カットオフ周波数とは音量が下がり始める境界の周波数(厳密には-3dB点)である。ある音域の音量を下げるという意味を聴覚で確認する。ちなみに「lop~」は前述の通り、極端に低いカットオフ周波数によって値の変化を緩やかにする効用があるが、これは極低音の波形が緩やかであるということから理解する。
次に「bp~」「vcf~」による音色の変化を確認する。ここで、スライダは中心周波数であり、この周波数を中心とした帯域の音量を上げる。帯域の幅はQと呼ばれる数値で指定する。極端にQ値を増加させると、ノイズは、明確に音の高さを感じられる音に変わる。「vcf~」のみ中心周波数を音声信号で制御できる。
#N canvas 0 0 1015 691 12; #X obj 115 135 lop~; #X obj 206 135 hip~; #X obj 297 135 bp~; #X obj 390 135 vcf~; #X obj 70 37 osc~; #X obj 70 -20 line; #X obj 29 168 line; #X obj 29 -139 bng 24 250 50 0 empty empty draw 0 -6 0 8 -262144 -1 -1; #X obj 115 316 tabwrite lop; #X obj 115 286 dbtopow; #X obj 206 256 dbtopow; #X obj 297 316 dbtopow; #X obj 390 286 dbtopow; #X obj 206 286 tabwrite hip; #X obj 297 346 tabwrite bp; #X obj 390 316 tabwrite vcf; #N canvas 0 0 450 300 graph3 0; #X array lop 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 527 -76 graph; #N canvas 0 0 450 300 graph3 0; #X array hip 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 778 -76 graph; #N canvas 0 0 450 300 graph3 0; #X array bp 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 527 89 graph; #N canvas 0 0 450 300 graph3 0; #X array vcf 100 float 0; #X coords 0 1 99 0 200 140 1; #X restore 778 89 graph; #X msg 29 -92 0 \, 100 3000; #X obj 115 165 env~; #X obj 206 165 env~; #X obj 297 165 env~; #X obj 390 165 env~; #X msg 70 -59 0 \, 22050 3000; #X obj 306 -134 nbx 5 14 -1e+037 1e+037 0 0 empty empty Hz 50 -12 2 16 -262144 -1 -1 511 256; #X obj 417 -134 nbx 5 14 -1e+037 1e+037 0 0 empty empty Q 50 -12 2 16 -262144 -1 -1 0 256; #X obj 897 286 loadbang; #X msg 897 317 \; pd dsp 1; #X connect 0 0 21 0; #X connect 1 0 22 0; #X connect 2 0 23 0; #X connect 3 0 24 0; #X connect 4 0 0 0; #X connect 4 0 1 0; #X connect 4 0 2 0; #X connect 4 0 3 0; #X connect 5 0 4 0; #X connect 6 0 8 1; #X connect 6 0 13 1; #X connect 6 0 14 1; #X connect 6 0 15 1; #X connect 7 0 25 0; #X connect 7 0 20 0; #X connect 9 0 8 0; #X connect 10 0 13 0; #X connect 11 0 14 0; #X connect 12 0 15 0; #X connect 20 0 6 0; #X connect 21 0 9 0; #X connect 22 0 10 0; #X connect 23 0 11 0; #X connect 24 0 12 0; #X connect 25 0 5 0; #X connect 26 0 2 1; #X connect 26 0 1 1; #X connect 26 0 0 1; #X connect 26 0 3 1; #X connect 27 0 3 2; #X connect 27 0 2 2; #X connect 28 0 29 0;
次に前述四種のフィルタの周波数特性を視覚的に検証する。HzとQとしたナンバーを適宜設定し、drawとしたbangを叩くとグラフに表示されるのが、各フィルタの、音域ごとの音量(周波数特性)である。グラフの横軸は0~22050Hzである。
pdでの音作りにおいて、即効性を持つフィルタはこれら四種であり、これらで足りるとも言えるが、既知のフィルタにはこの他にも、バンドストップ(帯域除去)、ロー/ハイシェルビング(音量の下げ量を指定可能)、コム(櫛形)、オールパス(全域通過)などがある。
例えばオーディオ機器などに存在するグラフィックイコライザは、複数のバンドパスとバンドストップを各音域に並べたものである。pdにおいて、グラフィックイコライザのようにより積極的な周波数領域への介入を行うには、FFTなど別の戦略を要するが、FFTについては後述する。