音声信号の性質、振幅の操作

音を出す

pdで音を出すのは簡単だ。以下のパッチを開いてみる。

#N canvas 0 0 454 304 12; #X msg 44 85 \; pd dsp \$1; #X obj 44 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 218 85 osc~ 1000; #X obj 218 214 dac~; #X connect 1 0 0 0; #X connect 2 0 3 0; #X connect 2 0 3 1;

まずメッセージボックス「;pd dsp $1」がある。これはpdでの音出し(計算)の開始、停止を切り替える(
メッセージボックスの用法)。メッセージの上のトグルをクリックすることで早速音出しを始めるが、念のためにPCやスピーカーの音量を低めにしておいてから、音出しを始めること。

pdで音を出すには、「dac~」に音声信号を入力する。「dac~」はpdでの最終的な音の出口と思えばよい。「osc~」はコサイン波の音声信号を出力する。引数1000により、1000Hz(1kHz(キロヘルツ))のコサイン波を出力している。

ちなみにコサイン波とはこの世で最も単純な音のひとつである(既に詳しい人で、サイン波は知っているがコサイン波は初耳という人もいるかも知れないが、サイン波とコサイン波は聴覚上は全く同じものだ)。また1000Hzとは、放送局のテストトーンでも使われている音なので、同じ音を聴いたことがあるかも知れない。

音出しは成功したが、これだけでは何もしていないに等しい。当然ながらpdではもっと様々な音を作ることができる。そのために、様々なオブジェクトや部品を並べてパッチを作るのだが、200種以上もあるpdのオブジェクトのうち、直接に音を出し音源となるものは「osc~」「phasor~」「noise~」のみである。ではどうするかと言えば、これら音源の出力を、その他のオブジェクトで様々に加工することで、様々な音を作るのである。つまりこれから書くことは、様々な音の加工の方法である。

音量を変える

#N canvas 0 0 454 304 12; #X msg 44 85 \; pd dsp \$1; #X obj 44 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 312 89 osc~ 1000; #X obj 293 218 dac~; #X obj 292 160 *~; #X floatatom 292 38 5 0 0 0 - - -; #X obj 192 87 vsl 15 128 0 1 0 0 empty empty empty 0 -8 0 8 -262144 -1 -1 0 1; #X connect 1 0 0 0; #X connect 2 0 4 1; #X connect 4 0 3 0; #X connect 4 0 3 1; #X connect 5 0 4 0; #X connect 6 0 4 0;

音量を変えるにはオブジェクト「*~」を用いる。「*~」は音声信号を乗算(かけ算)するものだ。ところで別に「*」というオブジェクトもあるが、こちらは数値の乗算を行なうもので、「*~」とは異なる。pdでは音声信号を扱うオブジェクトの名前の末尾は、概ね「~」である。

まずナンバーボックスがある。これをドラッグすることで音量を上げ下げできるのだが、この場合はShift+ドラッグで、0.01単位で数値を変える必要がある。普通にドラッグにして、例えば数値を2にしたとすると、その段階で既に音が大き過ぎる。pd箱のpeak metersチェックボックスをチェックすると、現在pdが出している音量が見られるが、数値2の場合だと、clipと書いた部分が赤くなる。これはpd内部で音が大き過ぎることを意味している。

もう少しスマートな音量の制御方法も、色々考えられるのだが、ここでは簡単にスライダを用いている。このスライダはPropertiesで出力範囲を0~1に変えてある(デフォルトでは0~127)。ここで、数値1が最大音量だと考えることもできるが、要するに「osc~」の出力がデフォルトで最大音量であり、それを単に1倍していると考えるべきだろう。またスライダを上げきった場合、pd箱のOUTメータには100と表示される。これが100を超えるとclipが赤く点灯するわけだ。

ところでこのスライダの場合、「ツマミ」を半分の位置にしても、pd箱のOUTメータは94とかになっている。これは音声信号に対しての音量の感じ方が一直線ではなく、あるひとつのカーブであることを意味しているのだが、参考までに、これを直すためには、以下のような方法を用いる。

#N canvas 0 0 454 304 12; #X msg 44 85 \; pd dsp \$1; #X obj 44 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 312 90 osc~ 1000; #X obj 293 218 dac~; #X obj 292 160 *~; #X obj 200 90 dbtorms; #X floatatom 200 49 5 0 100 0 - - -; #X floatatom 200 134 5 0 0 0 - - -; #X connect 1 0 0 0; #X connect 2 0 4 1; #X connect 4 0 3 0; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 5 0 4 0; #X connect 6 0 5 0;

「dbtorms」はデシベル値をRMSレベルに変換するオブジェクトだが、さしあたってはこの意味がわからなくても問題はない(気になる人はHelpを)。0~100の数値(デシベル値)の直線を、RMSレベルという数値0~1の曲線に変換する、としておく。どんな値が出ているかは「dbtorms」の下のナンバーで見られる。また「dbtorms」の上のナンバーをドラッグすると、pd箱のOUTメータも同じ数値になることを確認する。

スライダを用いた場合、音量の変化に応じて若干のノイズが感じられる。これはスライダの出力する数値が完全に連続的ではないことにより、後述する「波形」の断裂が生じた結果である。いずれにせよ、デジタル処理において完全な連続などなく、全ては離散的なのだが、断裂を可能な限り小さくすることはできる。

#N canvas 0 0 469 475 12; #X msg 44 85 \; pd dsp \$1; #X obj 44 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #X obj 327 263 osc~ 1000; #X obj 310 413 dac~; #X obj 309 355 *~; #X obj 237 119 vsl 15 128 0 1 0 0 empty empty empty 0 -8 0 8 -262144 -1 -1 0 1; #X obj 237 263 lop~ 5; #X msg 96 181 1 1000; #X msg 159 181 0 1000; #X obj 159 263 line~; #X connect 1 0 0 0; #X connect 2 0 4 1; #X connect 4 0 3 0; #X connect 4 0 3 1; #X connect 5 0 6 0; #X connect 6 0 4 0; #X connect 7 0 9 0; #X connect 8 0 9 0; #X connect 9 0 4 0;

上の例では連続的に値を変化させる「line~」を用いている。「line~」へのメッセージ「1 1000」は「1000ms(1秒)かけて1まで」数値を移動させるという命令である。「0 1000」も同様である。メッセージのクリックにより、1秒間のフェードイン、フェードアウトを行う。フェードの時間が決まっている限り「line~」は有効である。

また、任意の音量操作を旨とするスライダの出力に対しては、ローパスフィルタ「lop~」を経由させている。ローパスフィルタとは、一般にカットオフ周波数以上の音域を減衰させ、低音域を強調するものだが、カットオフ周波数を極端に下げると(この例では5Hz)値の変化を滑らかにし、「角を取る」役にも立つという例である。

#N canvas 0 0 285 313 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 112 221 pd DAC; #X obj 112 75 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 1 0 0 0;

上はパッチウィンドウで音量操作を行なうための例である。まず垂直スライダの出力範囲をPropertiesで0~1に変更。次にサブパッチ「pd DAC」を開いて確認するが、垂直スライダからの「pd DAC」への入力は二系統に分かれる。一方は「> 0」により、スライダの値が0より大きい場合に1、スライダの値が0である場合に0を発し、その値を「;pd dsp $1」に入力することで、スライダの上げ下げにより自動的に音声計算の切り替えを行なう。スライダからの入力のもう一方は「lop~ 5」を経て、「inlet~」により「pd DAC」に入力された音声信号の音量操作を行なう。

音を見る

音量の制御について話を進めているが、「音をかけ算」と聞いて異様と思わなかっただろうか。だが実は、音声信号の中身も数値である、と知ればさほど異様とも思われない。

#N canvas 0 0 466 316 12; #X msg 44 85 \; pd dsp \$1; #X obj 44 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 1 1; #N canvas 0 0 450 300 graph2 0; #X array amp 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 197 43 graph; #X obj 44 236 tabwrite~ amp; #X obj 68 197 bng 15 250 50 0 empty empty write 0 -6 0 8 -262144 -1 -1; #X obj 44 156 osc~ 1000; #X msg 44 266 \; amp ylabel 105 -1 0 1; #X connect 1 0 0 0; #X connect 4 0 3 0; #X connect 4 0 6 0; #X connect 5 0 3 0;

上の例では「tabwrite~」を用いて音声信号をグラフ化する。引数ampによって、ampと名づけたArrayにグラフを描く指示をしている。writeと記したbangをクリックすると、それが合図となって描画を行なう。

何やら波線が描画されるが、これがいわゆる音の「波形」である。「osc~」を用いているため波形は三角関数のコサインのグラフそのものとなる。グラフの横軸は時間軸だが、縦軸の上限は1、中央は0、下限は-1であり、つまり何かが時間に従ってこのように増減しているという意味だが、この縦軸とは何か。

#N canvas 0 0 481 455 12; #X msg 44 85 \; pd dsp \$1; #X obj 44 43 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #N canvas 0 0 450 300 graph2 0; #X array amp 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 214 85 graph; #X obj 214 339 tabwrite~ amp; #X obj 214 265 bng 15 250 50 0 empty empty start 0 -6 0 8 -262144 -1 -1; #X obj 41 339 dac~; #X obj 69 299 *~; #X obj 46 145 vsl 15 128 0 1 0 0 empty empty empty 0 -8 0 8 -262144 -1 -1 0 1; #X obj 214 299 metro 1000; #X obj 89 246 osc~ 1000; #X connect 1 0 0 0; #X connect 4 0 8 0; #X connect 6 0 5 0; #X connect 6 0 5 1; #X connect 6 0 3 0; #X connect 7 0 6 0; #X connect 8 0 3 0; #X connect 9 0 6 1;

上の例では「metro」を用いて「tabwrite~」に送るbangを自動化した。startと記したbangを叩くと、引数1000により1000ms(ミリ秒)すなわち1秒間隔でbangを送出し始める。

スライダを動かして音量を変えると、波形グラフの縦幅が変わる。ということは、これは音量のグラフと言えそうだが、概ね間違いではないにせよ、決定的に異なる一点がある。つまり、グラフで見るような波状の音量変化は聴こえていない。

実はこのグラフは1000Hzのコサイン波を、非常に短い時間で視覚化している。Hz(ヘルツ)とは周波数の単位だが、1000Hzと言えば、このような波の一周期が、一秒間に1000回起こることを意味する。つまり1000Hzの波の一周期は千分の一秒である。このように高速な変化を、波の形として聴覚することは当然ながら不可能であって、我々は周波数を、音の高さとして聴覚する。

音が空気の振動であるという話は聞いたことがあるだろう。正しくは空気に限らず、水や金属の中にも音波は伝わるが、つまり音波とはこれら音波を伝える物質(媒質)の、密度の変化と言える。だから波形グラフと言っても、このような波線(横波)が空気中をのたくっている、という意味ではない。縦波である媒質の密度変化(疎密波)を、横波に描き直したものである。波形グラフの上限は1、中央は0、下限は-1と前述したが、その意味とは、1が最も媒質が詰まった状態、0が平常状態、-1が最も延ばされた状態、という感じだろう。

しかしさらに追い詰めると、音声信号の波形グラフとは、当然ながら媒質の振動を拾ったものではない。媒質を振動させる装置、すなわちスピーカーやヘッドホンの膜(コーン)を動かす電磁石などへの制御信号である。1で膜を押し出し、-1で膜を引っ込める、など。従って、可聴域の下限(約20Hzとされる)を下回る音声信号や、1のままで全く動かない音声信号など、信号は出ているにも関わらず全く聴こえない波形も(後者は波形とも言えないが)存在する。

このような波形で注意すべきなのは、全く聴こえないと言って音量を上げたりすると、波形が変形したり、過負荷で装置類を壊す可能性があるということだ。制作の最中に、何かの原因で可聴域外の音が混ざっていると、思ったほど音量が上げられないということがある。そのような不要な帯域はフィルタなどで削る判断を下すのもひとつである。

以上により、音声信号の波形グラフとは「媒質を振動させる装置への制御信号」である。従ってグラフの縦軸は音量ではなく、単に波の「振れ幅」という意味で、振幅と呼ばれる。

音を重ねる

#N canvas 0 0 350 419 12; #X obj 70 41 osc~ 400; #X obj 148 41 osc~ 500; #X obj 224 41 osc~ 600; #X obj 147 109 /~ 3; #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 104 325 pd DAC; #X obj 104 179 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 3 0; #X connect 1 0 3 0; #X connect 2 0 3 0; #X connect 3 0 4 2; #X connect 3 0 4 1; #X connect 5 0 4 0;

音を重ねるには、上の例のように、同じ入力に複数の出力を結線してよいし「+~」を用いてもよい。結果は同じと思われる。音を重ねることは、波形の加算(足し算)に相当する。これは加算合成と呼ばれる音色合成法の非常に単純な例だが、三個の「osc~」を直接「dac~」に結線すると音量が大き過ぎるため「/~」を用いて音声信号を3で割っている。結果は「osc~」一個分の出力と全く同じである(スライダを最大にしてOUTメータを見る)。

負の音量

#N canvas 0 0 719 456 12; #X msg 34 75 \; pd dsp \$1; #X obj 34 33 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #N canvas 0 0 450 300 graph2 0; #X array amp+ 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 204 75 graph; #X obj 245 253 bng 15 250 50 0 empty empty start 0 -6 0 8 -262144 -1 -1; #X obj 245 287 metro 1000; #N canvas 0 0 450 300 graph2 0; #X array amp- 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 462 75 graph; #X obj 245 368 tabwrite~ amp+; #X obj 497 368 tabwrite~ amp-; #X obj 496 330 *~ -1; #X obj 496 287 phasor~ 1000; #X msg 23 307 \; amp+ ylabel 105 -1 0 1; #X msg 23 352 \; amp- ylabel 105 -1 0 1; #X connect 1 0 0 0; #X connect 3 0 4 0; #X connect 3 0 10 0; #X connect 3 0 11 0; #X connect 4 0 6 0; #X connect 4 0 7 0; #X connect 8 0 7 0; #X connect 9 0 8 0; #X connect 9 0 6 0;

マイナスの音量と聞くと、異様に思われるかも知れないが、マイナスの音量は現実に存在する。音量をマイナスにすると何が起こるかを示したのが上の例である。ここでは視覚的に容易に理解されるために「phasor~」を用いている。

まず「amp+」としたグラフを見る。「phasor~」は、0から1に至るノコギリ波(鋸歯状波)という直線的な波形を出す。このように正数のみだったり負数のみだったりする波形を単極波と呼ぶ。ちなみに「osc~」のように-1から1に至る波形は双極波と呼ぶ。

「amp-」としたグラフは、-1を乗算した「phasor~」の出力を示す。つまりマイナスの音量では、波形の振幅が単に反転する。この二つの波形を足し合わせると、当然ながら振幅は相殺されて0となる、つまり無音となる。しかしステレオ音声において、片方の出力をもう片方の反転波形にすると単に無音とはならず、代わりに音に面白い立体感が生じる。いわゆる「逆相」と呼ばれる効果である。

波形のずれ

#N canvas 0 0 700 566 12; #N canvas 0 0 450 300 graph2 0; #X array osc1 100 float 0; #X array osc2 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 452 20 graph; #X obj 21 107 osc~ 1000; #X obj 22 276 tabwrite~ osc1; #X obj 300 107 osc~ 1000; #X obj 300 276 tabwrite~ osc2; #N canvas 0 0 450 300 graph2 0; #X array osc1+2 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 452 311 graph; #X obj 154 146 +~; #X obj 153 276 tabwrite~ osc1+2; #X msg 88 78 0; #X obj 189 30 nbx 5 8 -1 1 0 0 empty empty empty 0 -6 2 24 -262144 -1 -1 -1 256; #X obj 121 431 /~ 2; #X obj 331 219 metro 1000; #X text 292 25 <- phase; #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 23 485 pd DAC; #X obj 23 339 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 331 190 loadbang; #X connect 1 0 2 0; #X connect 1 0 6 0; #X connect 3 0 4 0; #X connect 3 0 6 1; #X connect 6 0 7 0; #X connect 6 0 10 0; #X connect 8 0 1 1; #X connect 9 0 3 1; #X connect 9 0 8 0; #X connect 10 0 13 2; #X connect 10 0 13 1; #X connect 11 0 4 0; #X connect 11 0 7 0; #X connect 11 0 2 0; #X connect 14 0 13 0; #X connect 15 0 11 0;

上の例では、二つの「osc~ 1000」があるが、phaseと書いたナンバーのShift+クリックにより、二つの波形にずれが生じる。このずれを位相差と言う。単一の波形ではどのような位相だろうと、聴覚上変わりはないが(例えばサイン波は位相のずれたコサイン波である)複数の波形の位相差は重大な変化を及ぼす。前述の通り、ある波形の反転(逆相)波形を加算すると、振幅は相殺されて無音となる。このパッチでは、phaseを0.5または-0.5にすることで確認できる。

#N canvas 0 0 704 570 12; #N canvas 0 0 450 300 graph2 0; #X array osc1 100 float 0; #X array osc2 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 452 20 graph; #X obj 22 276 tabwrite~ osc1; #X obj 300 276 tabwrite~ osc2; #N canvas 0 0 450 300 graph2 0; #X array osc1+2 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 452 311 graph; #X obj 154 146 +~; #X obj 153 276 tabwrite~ osc1+2; #X obj 121 431 /~ 2; #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 23 485 pd DAC; #X obj 23 339 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 331 190 loadbang; #X obj 301 66 + 1000; #X obj 22 95 osc~ 1000; #X obj 301 95 osc~ 1004; #X obj 301 24 nbx 5 8 -1e+037 1e+037 0 0 empty empty empty 0 -6 2 24 -262144 -1 -1 0 256; #X obj 331 219 metro 950; #X connect 4 0 5 0; #X connect 4 0 6 0; #X connect 6 0 7 2; #X connect 6 0 7 1; #X connect 8 0 7 0; #X connect 9 0 14 0; #X connect 10 0 12 0; #X connect 11 0 4 0; #X connect 11 0 1 0; #X connect 12 0 4 1; #X connect 12 0 2 0; #X connect 13 0 10 0; #X connect 14 0 2 0; #X connect 14 0 5 0; #X connect 14 0 1 0;

上の例では「osc~ 1000」「osc~ 1004」により、若干周波数の異なるコサイン波を重ねている。二つの波形の周期のずれにより位相効果が生じる。その結果は緩やかな音量の増減(トレモロ)である。一方の周波数の変化により、トレモロの速度が変わることを確認する。後述するが、この他にも位相効果を積極的に用いた音色変化の技法が存在する。また逆相など、位相効果による音量の減衰や消失は、ミキシングの現場での、トラブルの原因としても知られている。

波形を描く

#N canvas 0 0 594 388 12; #N canvas 0 0 454 304 graph2 0; #X array in 100 float 0; #X coords 0 1 99 -1 200 140 1; #X restore 48 20 graph; #X floatatom 176 199 5 0 0 2 freq - -; #N canvas 0 0 450 300 graph2 0; #X array out 1000 float 0; #X coords 0 1 999 -1 200 140 1; #X restore 304 20 graph; #X obj 176 289 tabread~ in; #X obj 308 341 tabwrite~ out; #X obj 176 258 *~ 100; #X obj 176 227 phasor~ 100; #X obj 308 302 metro 500; #X msg 422 192 \; in const 0; #X text 422 172 reset; #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 133 342 pd DAC; #X obj 133 196 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X obj 308 268 loadbang; #X connect 1 0 6 0; #X connect 3 0 4 0; #X connect 3 0 10 2; #X connect 3 0 10 1; #X connect 5 0 3 0; #X connect 6 0 5 0; #X connect 7 0 4 0; #X connect 11 0 10 0; #X connect 12 0 7 0;

直接波形を操作してみることで、波形の性質を感覚的に知ることが出来る。トグルをクリックし、「in」と書いたグラフを描き変える。グラフの線をマウスで適当にドラッグするのである。グラフを描き変えることで音量や音色の変化が起こる。結果は「out」と書いたグラフに見ることが出来る。「freq」と書いたナンバーで音の高さを変えられる。波形と音色の関係はどのような感じだろうか。

例えば波形に目立つ山をひとつだけ作り、その高さを変えてみる。あるいは半円や対角線、たくさんのぎざぎざを描く。また極端に「freq」の値を下げた場合は、何かのリズムに聴こえないだろうか。ところで我々は、既に「音つくり」の段階に入っている。手描き波形は「音つくり」の最も原始的な方法のひとつだろう。

このパッチでは、値の入力によってグラフの読み出しを行う「tabread~」に対して「phasor~」を用いている。グラフのサイズが100であるので(Propertiesで確認できる)「phasor~」の出力に100を乗算することで、0から100に至る値の連続を作っている。

音を区切る

これまで見たように、pdでは「osc~」「phasor~」といった音源オブジェクトは基本的に鳴りっぱなしである。つまり「ひとつの音」であったが、これを分割して「いくつかの音」として聴かせるにはやはり音量の制御を行う。

#N canvas 0 0 501 372 12; #X obj 157 52 osc~ 1000; #X msg 283 105 1; #X obj 337 36 bng 36 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 337 122 delay 100; #X floatatom 404 94 5 0 0 0 - - -; #X msg 284 175 0; #X obj 157 251 *~; #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 113 304 pd DAC; #X obj 113 158 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 6 0; #X connect 1 0 6 1; #X connect 2 0 1 0; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 3 1; #X connect 5 0 6 1; #X connect 6 0 7 2; #X connect 6 0 7 1; #X connect 8 0 7 0;

この例では、bang(Propertiesで大きくしてある)をクリックする。bangの出力は二方向に分かれるが、ひとつはメッセージ「1」に至り、即座に「*~」に数値1を送る、つまり音量を1にする。もうひとつのbangは、入力されたbangを遅らせれて出力する「delay」に至るが、引数100により100msの遅延時間となり、従って数値0は数値1に遅れること0.1秒後に「*~」に送られる。こうしてbangする度に「長さ0.1秒の音」が生じる。「delay」の引数を操作することで「音の長さ」が変わる。

#N canvas 0 0 505 376 12; #X obj 157 52 osc~ 1000; #X obj 157 251 *~; #X obj 321 156 line~; #X msg 321 122 1 \, 0 1000; #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 115 313 pd DAC; #X obj 115 167 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 1 0; #X connect 1 0 4 2; #X connect 1 0 4 1; #X connect 2 0 1 1; #X connect 3 0 2 0; #X connect 5 0 4 0;

上の例では連続的に値を変化させる「line~」を用いている。メッセージ「1, 0 1000」により、メッセージがクリックされた直後に数値1を出力、以後1000msかけて数値を0まで徐々に減少させる。これによってピアノのような「減衰する音」という印象を作ることができる。

#N canvas 0 0 505 376 12; #X obj 157 52 osc~ 1000; #X obj 157 251 *~; #X obj 281 186 line~; #X msg 281 92 0 \, 1 1000; #X obj 397 25 bng 36 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 397 92 delay 1000; #X msg 397 132 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 113 319 pd DAC; #X obj 113 173 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 1 0; #X connect 1 0 7 2; #X connect 1 0 7 1; #X connect 2 0 1 1; #X connect 3 0 2 0; #X connect 4 0 5 0; #X connect 4 0 3 0; #X connect 5 0 6 0; #X connect 6 0 2 0; #X connect 8 0 7 0;

先の減衰音の時間的逆行を作るには、音量0から1へ連続的に増加し、最後に再度音量0になる仕組みを作らねばならない。従って上の例のようにひと手間増えることになる。「line~」と「delay」の組み合わせである。

#N canvas 0 0 508 419 12; #X obj 157 52 osc~ 1000; #X msg 278 97 1; #X obj 332 28 bng 36 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 332 114 delay 100; #X floatatom 399 86 5 0 0 0 - - -; #X msg 279 167 0; #X obj 158 328 *~; #X obj 177 293 lop~ 10; #X floatatom 228 265 5 0 0 2 cutoff - -; #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 115 366 pd DAC; #X obj 115 220 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 6 0; #X connect 1 0 7 0; #X connect 2 0 1 0; #X connect 2 0 3 0; #X connect 3 0 5 0; #X connect 4 0 3 1; #X connect 5 0 7 0; #X connect 6 0 9 2; #X connect 6 0 9 1; #X connect 7 0 6 1; #X connect 8 0 7 1; #X connect 10 0 9 0;

上はローパスフィルタ「lop~」の使用により、急激な値の変化を滑らかにする方法を示している。例えばcutoffと付したナンバーにより、カットオフ周波数を0.2Hzなどにするとどうなるか。

このような音量の操作によって「音の形」という印象が生じることは確かである。その形をさらに複雑なものにすることもできる。

#N canvas 0 0 484 461 12; #N canvas 0 0 458 308 graph2 0; #X array env 200 float 0; #X coords 0 1 199 0 200 140 1; #X restore 60 16 graph; #X obj 184 345 *~; #X obj 183 214 osc~ 1000; #X obj 292 307 clip~ 0 1; #X text 288 9 reset; #X msg 288 31 \; env const 0.1; #X obj 292 276 tabread4~ env; #X obj 292 245 line~; #X text 290 195 start; #X msg 292 214 0 \, 200 2000; #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 141 394 pd DAC; #X obj 141 248 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 1 0 10 2; #X connect 1 0 10 1; #X connect 2 0 1 0; #X connect 3 0 1 1; #X connect 6 0 3 0; #X connect 7 0 6 0; #X connect 9 0 7 0; #X connect 11 0 10 0;

上の例では、グラフ「env」の描き変えにより、より複雑な音量の操作を行う。描き変えたグラフは、startと付したメッセージのクリックによって読み出される。メッセージのうち、0から200というのはグラフのサイズのことであり、2000msでグラフの端から端に至るという意味である。

ところで、値に下限と上限を設ける「clip~」により、グラフ枠を飛び出した線は0や1として処理される。従って一部の音量を0にするには、線を枠の下に飛び出させるとよい。やや扱いにくいpdのグラフに対する策である。また四点多項式補間を行いながらグラフを読み出す「tabread4~」の使用により、グラフの読み出しが多少滑らかにされていることに注意。

このグラフのような音量の操作をエンベロープ(増幅波形。envelope=包み紙)と呼ぶ。音量の操作ではあるが「音色」の感覚に対するエンベロープの影響は大きい(一般に音色とは、周波数成分の組み合わせと変化を意味する)。

トレモロ、リング変調

#N canvas 0 0 414 452 12; #X obj 102 69 osc~ 1000; #X floatatom 209 40 5 0 0 1 Hz - -; #X floatatom 102 40 5 0 0 1 Hz - -; #X obj 101 204 *~; #X obj 209 69 osc~ 2; #N canvas 0 0 454 304 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 171 65 block~ 2048 1 1; #X obj 71 180 metro 1000; #X obj 71 144 loadbang; #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 8 0 6 0; #X connect 9 0 8 0; #X coords 0 512 255 0 200 140 1; #X restore 174 263 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 46 309 pd DAC; #X obj 46 163 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 3 0; #X connect 1 0 4 0; #X connect 2 0 0 0; #X connect 3 0 5 0; #X connect 3 0 6 2; #X connect 3 0 6 1; #X connect 4 0 3 1; #X connect 7 0 6 0;

上の例では二個の「osc~」の出力をかけ合わせている。つまり音どうしで乗算を行なっている。ここでは「osc~ 2」が2Hzのコサイン波の音声信号を送っている。2Hzという音波は当然、それ自体では聴く事はできない低周波だが、乗算に用いることで、例えばこのように音量の増減の効果(トレモロ)を生む。「osc~ 2」の上のナンバーを操作することで、トレモロ速度の変化が確認できるだろう。シンセサイザーで言われるLFO(Low Freqency Oscillator=低周波発振器)とは、このように音波を、聴くものではなく制御するものとして扱うこと一般を意味すると思う。

次にナンバーの操作で「osc~ 2」の周波数を上げていく。ある時点からトレモロ効果は聴き取れなくなり、かわりに幻聴のように別の音が聴こえて来る。よく聴くと周波数の増加に応じて、何故か下降する音が聴こえる。 グラフ「spec」は横軸を周波数、縦軸を音量とする、簡易なスペクトルアナライザだが(グラフをOpenすることでこの仕組みを見られるが、詳細については割愛する)、ある程度周波数を上げるとグラフに二本の山が見える。二個の「osc~」から二音が生じたことは不思議ではないかもしれないが、一方の周波数の変化により、聴こえる二音とも周波数が変化する。

これはリング変調(Ring Modulation, RM)と呼ばれる、非常に古典的な音色合成法である。二音の乗算という簡単なものだが、音源となる二音の周波数の和と差の周波数が生じることが知られている。

#N canvas 0 0 535 476 12; #X floatatom 173 133 5 0 0 1 Hz - -; #X obj 153 209 *~; #X obj 293 336 openpanel; #X obj 293 390 soundfiler; #X msg 293 363 read -resize \$1 sampl; #N canvas 0 0 450 300 graph2 0; #X array sampl 62079 float 0; #X coords 0 1 62078 -1 200 140 1; #X restore 290 133 graph; #X obj 154 74 tabplay~ sampl; #X obj 154 42 bng 15 250 50 0 empty empty start 0 -6 0 8 -262144 -1 -1; #X obj 293 314 bng 15 250 50 0 empty empty open 0 -6 0 8 -262144 -1 -1; #X obj 173 157 osc~ 1000; #X obj 103 74 adc~; #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 67 349 pd DAC; #X obj 67 203 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 9 0; #X connect 1 0 11 2; #X connect 1 0 11 1; #X connect 2 0 4 0; #X connect 4 0 3 0; #X connect 6 0 1 0; #X connect 7 0 6 0; #X connect 8 0 2 0; #X connect 9 0 1 1; #X connect 10 0 1 0; #X connect 10 1 1 0; #X connect 12 0 11 0;

二個の「osc~」を音源としたRMはさほど面白いものではないが、一般的なRMは、楽器音、声、物音などの「現実音」と、コサイン波などの電子音とを音源とするものである。上の例では「tabplay~」を用いたサンプル再生(パッチウィンドウの右下、openと付したbangによって任意の音声ファイルを読み込める)と、外部入力音声を出力する「adc~」を用いてRMを検証できる(PCのライン入力などにCDやラジオを接続して試してみる)。「osc~」の周波数により、どのような音色変化が生じるだろうか。特にピアノ音を入力した場合、和と差の周波数が生じることで音律と音色の変化が生じ、プリペアドピアノかガムランかというような音が生じる。

音を移動する

左右に二個のスピーカーを持つステレオオーディオでは、右のスピーカーの音量が大きければ音は右寄りに聴こえるし、左のスピーカーの音量が大きければ音は左寄りに聴こえる。これを音の定位と呼ぶ。左のスピーカーの音量を連続的に減少させ、右のスピーカーの音量を連続的に増加させれば(クロスフェード)、音は左から右へ移動しているように聴こえる。パニング(panning)と呼ばれるこの効果は、当然ながらヘッドホンで聴くとわかりやすい。

#N canvas 0 0 394 379 12; #X obj 200 65 hsl 128 15 0 1 0 0 empty empty panpot -2 -8 0 8 -262144 -1 -1 0 1; #X floatatom 292 201 5 0 0 0 - - -; #X floatatom 197 201 5 0 0 0 - - -; #X obj 197 143 * -1; #X obj 197 172 + 1; #X obj 292 227 lop~ 5; #X obj 197 227 lop~ 5; #X obj 142 271 *~; #X obj 176 271 *~; #X obj 143 19 phasor~ 5; #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 63 323 pd DAC; #X obj 63 177 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 1 0; #X connect 0 0 3 0; #X connect 1 0 5 0; #X connect 2 0 6 0; #X connect 3 0 4 0; #X connect 4 0 2 0; #X connect 5 0 8 1; #X connect 6 0 7 1; #X connect 7 0 10 1; #X connect 8 0 10 2; #X connect 9 0 7 0; #X connect 9 0 8 0; #X connect 11 0 10 0;

pdでパニングを行なうには、単に左右の音量が逆に増減するようにして、乗算を行なえばよい。この例では水平スライダを用いてパンポットのようにしている。

余談だが、上の例ではほとんど聴き取れず、問題はないかもしれないが、この単純な線形クロスフェードでは、定位が中央に近づくにつれ、音量が減少することが知られている。パニングにおける音量は「二個のスピーカーの各音量の二乗の和の平方根」で与えられるという。以下のパッチはこれを検証するものである。panpotとしたスライダを動かしつつ、一番下のナンバーを見る。

#N canvas 0 0 598 524 12; #X obj 57 61 hsl 128 15 0 1 0 0 empty empty panpot -2 -8 0 8 -262144 -1 -1 5600 1; #X floatatom 149 312 5 0 0 0 - - -; #X floatatom 54 312 5 0 0 0 - - -; #X obj 54 123 * -1; #X obj 54 153 + 1; #X obj 54 347 pow 2; #X obj 149 347 pow 2; #X obj 54 384 +; #X obj 54 420 sqrt; #X floatatom 54 457 5 0 0 0 - - -; #X obj 296 61 hsl 128 15 0 0.25 0 0 empty empty panpot -2 -8 0 8 -262144 -1 -1 6500 1; #X floatatom 293 86 5 0 0 0 - - -; #X obj 293 160 cos~; #X obj 292 256 snapshot~; #X obj 387 159 cos~; #X obj 386 256 snapshot~; #X floatatom 292 312 5 0 0 0 - - -; #X floatatom 386 312 5 0 0 0 - - -; #X obj 387 129 + 0.75; #X obj 292 347 pow 2; #X obj 386 347 pow 2; #X obj 292 384 +; #X obj 292 420 sqrt; #X floatatom 292 457 5 0 0 0 - - -; #X obj 487 189 metro 100; #X obj 487 159 loadbang; #X text 74 13 << Linear >>; #X text 315 13 << Exponential >>; #X text 205 311 <- Amp ->; #X msg 487 219 \; pd dsp 1; #X connect 0 0 1 0; #X connect 0 0 3 0; #X connect 1 0 6 0; #X connect 2 0 5 0; #X connect 3 0 4 0; #X connect 4 0 2 0; #X connect 5 0 7 0; #X connect 6 0 7 1; #X connect 7 0 8 0; #X connect 8 0 9 0; #X connect 10 0 11 0; #X connect 11 0 12 0; #X connect 11 0 18 0; #X connect 12 0 13 0; #X connect 13 0 16 0; #X connect 14 0 15 0; #X connect 15 0 17 0; #X connect 16 0 19 0; #X connect 17 0 20 0; #X connect 18 0 14 0; #X connect 19 0 21 0; #X connect 20 0 21 1; #X connect 21 0 22 0; #X connect 22 0 23 0; #X connect 24 0 15 0; #X connect 24 0 13 0; #X connect 25 0 24 0; #X connect 25 0 29 0;

左は線形クロスフェードだが、中央の定位、すなわち各チャネルの音量が0.5の場合、結果は0.707(-3dB)となる。dB(デジベル)値について、簡単には、3dBごとに二倍の出力を意味すると覚えればよい。従ってこの場合は、実は音量が半減している。一方、右の「cos~」(音声信号でのコサイン出力。「cos~」への「phasor~」の入力は「osc~」に等しい )を用いたクロスフェードでは、音量は一定である(0.999は誤差である。表計算ソフトなどで検証すると常に1となる)。

ところで「snapshot~」はbangを受けて音声信号を数値に変換するものである。また「pow」は数値の累乗、「sqrt」は数値の平方根を出力する。

「cos~」を用いたパニングについて考えるとすると概ね次のようになる。音量を距離として考える。一定音量を発する音源があるとして、それが遠くにあれば音は小さく、近くにあれば音は大きく聴こえる。この音源が移動し、かつ一定音量として聴こえるならば、移動の軌跡は円になる。余弦・正弦曲線を用いるのはこのためである。

先程使用の「cos~」クロスフェードをそのままペーストして、以下のようなパニングの例を作ることができる。

#N canvas 0 0 389 392 12; #X obj 288 235 lop~ 5; #X obj 193 235 lop~ 5; #X obj 138 279 *~; #X obj 172 279 *~; #X obj 139 27 phasor~ 5; #X obj 197 97 hsl 128 15 0 0.25 0 0 empty empty panpot -2 -8 0 8 -262144 -1 -1 0 1; #X floatatom 194 122 5 0 0 0 - - -; #X obj 194 196 cos~; #X obj 288 195 cos~; #X obj 288 165 + 0.75; #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 58 334 pd DAC; #X obj 58 188 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 3 1; #X connect 1 0 2 1; #X connect 2 0 10 1; #X connect 3 0 10 2; #X connect 4 0 2 0; #X connect 4 0 3 0; #X connect 5 0 6 0; #X connect 6 0 7 0; #X connect 6 0 9 0; #X connect 7 0 1 0; #X connect 8 0 0 0; #X connect 9 0 8 0; #X connect 11 0 10 0;

音を歪ませる

#N canvas 0 0 356 455 12; #X obj 95 29 osc~ 400; #X obj 176 29 adc~; #X obj 204 79 *~; #X obj 223 56 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 96 79 *~; #X obj 115 56 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 203 254 *~; #X floatatom 222 222 5 0 0 2 amp - -; #X obj 203 285 clip~ -1 1; #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 96 399 pd DAC; #X obj 96 253 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 0 0 4 0; #X connect 1 0 2 0; #X connect 1 1 2 0; #X connect 2 0 6 0; #X connect 3 0 2 1; #X connect 4 0 6 0; #X connect 5 0 4 1; #X connect 6 0 8 0; #X connect 7 0 6 1; #X connect 8 0 9 2; #X connect 8 0 9 1; #X connect 10 0 9 0;

音を歪(ひず)ませることは非常に簡単であり、上の例のように、音量を何倍にもした上で、「clip~」によって波形を断ち切ってしまえば良い。しかしギターアンプのような音色を得るには相当の研究を要すると思われる。ところでこの例では「osc~」「adc~」の近くのトグルで音声の切り替えを行なう。

#N canvas 0 0 667 534 12; #N canvas 0 0 450 300 graph5 0; #X array in 100 float 0; #X coords 0 1 99 -1 100 100 1; #X restore 513 56 graph; #N canvas 0 0 450 300 graph5 0; #X array mod 100 float 0; #X coords 0 1 99 -1 100 100 1; #X restore 513 176 graph; #N canvas 0 0 450 300 graph5 0; #X array out 100 float 0; #X coords 0 1 99 -1 100 100 1; #X restore 514 301 graph; #N canvas 312 191 486 336 mod 0; #X obj 148 38 loadbang; #X obj 148 276 tabwrite mod; #X obj 148 131 f; #X obj 186 131 + 1; #X floatatom 148 170 5 0 0 0 - - -; #X msg 101 98 0; #X obj 148 238 - 1; #X obj 101 11 inlet; #X msg 271 131 stop; #X obj 148 98 metro 10; #X obj 229 164 sel 100; #X obj 148 205 / 50; #X connect 0 0 5 0; #X connect 0 0 9 0; #X connect 2 0 3 0; #X connect 2 0 4 0; #X connect 3 0 2 1; #X connect 4 0 1 1; #X connect 4 0 10 0; #X connect 4 0 11 0; #X connect 5 0 2 0; #X connect 6 0 1 0; #X connect 7 0 5 0; #X connect 7 0 9 0; #X connect 8 0 9 0; #X connect 9 0 2 0; #X connect 10 0 8 0; #X connect 11 0 6 0; #X restore 428 207 pd mod; #X obj 20 50 osc~ 400; #X obj 194 306 tabread4~ mod; #X obj 19 450 tabwrite~ in; #X obj 270 367 loadbang; #X obj 270 395 metro 1000; #X obj 270 450 tabwrite~ out; #X obj 194 188 /~ 2; #X obj 194 216 +~ 0.5; #X obj 428 184 bng 15 250 50 0 empty empty reset 0 -6 0 8 -262144 -1 -1; #X obj 20 147 +~; #X obj 122 50 adc~; #X obj 194 244 *~ 100; #X obj 150 100 *~; #X obj 169 77 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #X obj 21 100 *~; #X obj 40 77 tgl 15 0 empty empty empty 0 -6 0 8 -262144 -1 -1 0 1; #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 151 450 pd DAC; #X obj 151 288 vsl 15 128 0 1 0 0 empty empty vol 0 -8 0 8 -262144 -1 -1 0 1; #X connect 4 0 18 0; #X connect 5 0 9 0; #X connect 5 0 20 2; #X connect 5 0 20 1; #X connect 7 0 8 0; #X connect 8 0 6 0; #X connect 8 0 9 0; #X connect 10 0 11 0; #X connect 11 0 15 0; #X connect 12 0 3 0; #X connect 13 0 10 0; #X connect 13 0 6 0; #X connect 14 0 16 0; #X connect 14 1 16 0; #X connect 15 0 5 0; #X connect 16 0 13 0; #X connect 17 0 16 1; #X connect 18 0 13 0; #X connect 19 0 18 1; #X connect 21 0 20 0;

上はウェーブシェーピングと呼ばれる技法の非常に単純な例だが、概ね手描き波形と似たようなものである。まず「osc~ 400」の近くのトグルを入れると、グラフ「in」「out」によく似た波形が表示されるが、「out」に表示されているのはグラフ「mod」によって変形を受けた波形である。仕組みとしては、元となる波形の振幅(縦軸)をグラフ「mod」の横軸として読み出している。グラフ「mod」は対角直線であるため、原理的には入力と出力は全く同じである。

ここで「mod」に少し傷を付けてみる。すると出力音と「out」の波形に変化が及ぶ。「out」において「mod」の相似形が生じることを確認する。resetとしたbangを叩くと「mod」に元の対角直線が戻る。

外部音声入力が使える場合、「adc~」の近くのトグルを入れて、入力音声を変調してみる。「mod」の描き方によっては、興味深い歪みが生じる。また「mod」の中央辺りに横線を描くと、あるレベル以下の振幅が断ち切られることになる。振幅レベルに応じた変調も可能と思われる。

無論、作図による波形変調の要領が理解できれば、手描きの作図ではなく何らかの数式(ウェーブシェーピング関数)を用いることも考えられる。