小嶋秀樹 | 研究室
日本語 | English
Pd から音を出す

このページでは Pd を使った音処理(音声信号処理)の基礎を解説していきます.オリジナルな音(楽器音・効果音など)をデザインしたり,音楽を制作・演奏するために,Pd はとても便利なツールとなります.

【音を出す準備】

まず,Pd (Pd-extended) から音が正しく出ることを確認しましょう.Media メニューから Test Audio and MIDI を選択してください.(参考図) 下のようなウィンドウ(Mac OS X の場合)が開くはずです.

まず,このウィンドウ(じつは Pd パッチ)の左上側にある TEST TONES から,左側の選択ボタン(これは [vradio] というオブジェクトです)を 60 あるいは80 [db] にセットします.PC のスピーカから音(正弦波)が聞こえましたか? PC の音量を調整してみてください.

音が聞こえたら,数値ボックス pitch を操作(マウスでドラッグ)して,音の高さを変えてみてください.ガザつきなく,きれいな音が出ているようなら,音を出すだめの準備は完了です.

【音が出ない!】

まれに Pd から音が出ない,あるいは音質が悪い場合があるようです.まずは PC 側の設定を確認しましょう.PC の音量調節ボタンがついている場合は,それを操作してみてください.あるいはタスクバーなどに音量調節アイコンがあれば,それを操作してみてください.まだ音が出ないようなら,Windows であれば,コントロールパネルから「サウンドとオーディオデバイス」を開き,ミュートが解除されていること,音量のスライダが正しく設定されていることを確認してください.Linux の場合は,たとえば System > Preferences > Sound を選び,Mac OS X では システム環境設定 > サウンド を開き,同じような設定を確認してください.

もし PC にサウンドカードが複数ある場合,実際にスピーカやヘッドフォン端子につながっているものを適切に選ぶ必要があります.Windows 版・Linux 版の Pd であれば,Media メニューから Audio settings... を選択してください.Mac OS X 版の Pd であれば,Pd-extended メニューから Preferences > Audio Settings... と進んでください.下のようなウィンドウ(Windows 版の場合)が現われます.

図:pd-audiosettings

この例で "Parallels Sound Card" とあるのが PC のサウンドカードの名前です.この部分をクリックすると選択リストが表示されます.この中から適切なサウンドカードを選択し,"Apply" を押します.TEST TONES は聞こえましたか? きれいな音が出るようになったら "Save all settings",そして "OK" を押して,音を出すだめの準備は完了です.

状況が改善されない場合は,Pd 側のドライバ設定を変えてみましょう.Media メニューから "ASIO (via portaudio)" などを選んでみてください.TEST TONES は聞こえましたか? まだ聞こえない場合は,上記の Audio settings... を再び調整してみてください.

音がまだ出ない場合は,他にも利用できるドライバがリストされていれば,それを順番に試してみてください.それでも音が出ない場合は,PC・Pd に詳しい人(教員など)に相談してください.

【音質が良くない!】

音は出るけど音質が良くない(ガサつく)場合は,まずバッファのサイズを増やしてみます.Pd 側の Audio settings... を開きます.このウィンドウの右上側に "delay (msec):" と書かれた数値入力窓があります.おそらく 100 程度の値が入っているはずです.これを,たとえば 150 に増やして "Apply" を押します.音質は改善されましたか? 300 まで増やせますが,それだけ音出力に遅れ (delay) が生じます.

図:pd-audiosettings

これでも音質が良くならない場合は,"input device 1" のチェックをはずして "Apply" を押してください.マイク入力などを使えなくなりますが,出力側の音質が改善することがあります.さらに最後の手段として,サンプリングレートを低く抑えることも考えられます."sample rate:" と書かれた入力窓に 44100(Hz)が入っていると思います.これを半分の 22050 に変えて,"Apply" を押してみてください. (これはやや強引な解決法です.ガザつきが消えても,扱える音域が狭くなってしまいます.また,このチュートリアルの一部は 44100Hz のサンプリングレートを想定したものになっています.)

音質は改善されましたか? これだけ試しても音質が良くならない場合は,万策尽きた感じですが,Pd に詳しい人(教員など)に相談してください.

音の高さ

ここから Pd での「音づくり」を実践していきます.このページで例題として扱うパッチは pack2.zip にまとめてあります.適当な場所に展開して,動かしてみてください.

まずは音の Hello world として,正弦波(サイン波)を出すパッチを作ってみましょう.オブジェクト名に "~" が付いていることに注意してください.一番下にある複雑なオブジェクトは,Put メニューから Object を選び(または Ctrl+1 を押し),配置したボックスの中で output~ と打ち込むことで生成できます.

図:pd-osc1.pd

実行モードに入り,[output~] の volume を中ぐらいにセットします.まだ音は出ていません.右側の dsp がオン(×)に,また Pd ウィンドウ右上側の compute audio がオンになっているのを確認してください.それでは,このパッチの上側にある [440[[880[ を押してみてください.澄んだ音が聞こえるはずです.

【周波数とノート番号】

上のパッチで,[osc~] に与えた 440880 という数値は,言うまでもなく周波数のことです.1秒あたりの振動数を意味します.440Hz はピアノ鍵盤なら中央付近のラ,その2倍の 880Hz は1オクターブ上のラになります.[osc~] は入力された周波数の「音」(正弦波)を出力します.その下の [hip~ 5] は(後述する)安全装置であり,「音」は素通りしていくと考えてください.最後の [output~] は「音」の出口(スピーカなど)です.二股に分けているのは,左右のチャンネルから同じ音を出力するためです.丸ボタンでミュートさせたり音量を戻したりできます.いろいろな周波数を入力して,音を聞き比べてみてください.ヘッドフォンならば 30〜15000Hz 程度の音を出せるはずです.

この周波数はそのままでは扱いづらいのですが,音階から導出することができます.つぎのパッチで,[60[, [62[ などのメッセージボックスを押してみてください.また,数値ボックスをマウスで上下にドラッグしてみてください.

[mtof] は MIDI ノート番号(鍵盤の番号)を与えると,その音階に対応する周波数 f を出力します.60 番が 中央のド (C4, 261.626Hz) で,1増える(減る)ごとに半音づつ上がり(下がり)ます.60 に 12 を足した 72 番は,1オクターブ上のド (C5) となり,周波数は2倍の 523.251Hz となります.ちなみに 440Hz は 69 番 (A4) です.

[hip~ 5] は 5Hz をカットオフ周波数とするハイパスフィルタ (high pass filter) です.耳に聞こえる「音」はそのまま素通りしますが,DC 成分(直流オフセットあるいは極端に周波数の低い成分)は通れません.スピーカやヘッドフォンに直流電圧が長時間加わるとボイスコイルが発熱してしまうので,このようなフィルタを入れることで保護しているのです.

ここで,「Pure Data 入門」の冒頭でお見せしたパッチを,もう一度見てみましょう.

[random 12]bang を受け取るたびに,0〜11 までの整数(内部的には float 型)をランダムに出力します.つぎの [+ 60] によって,60〜71 の乱数に変換されます.[mtof] は,この乱数をノート番号として受け取り,周波数に変換して [osc~] に送り出しています.右側にも同じような回路があり,1オクターブ上のランダム音楽をつくりだしています.

せっかくなので,ひとつ前のパッチ piano1.pd を改造して,ランダム音楽を奏でるようにしましょう.C, D, E, G, A の5音音階(ペンタトニックスケール)をランダムに鳴らすようにします.

いかがですか? 安物のゲーム機の音みたいですが,音楽らしく聞こえるようになったと思います.C, E, F, G, B に切り替えると沖縄風になります.オマケで piano3.pd ならガムラン風でしょうか.

【音の接続線】

いままでのパッチをよく見てみると,数値や bang といったメッセージが流れる制御接続線は細く,それに比べて「音」が流れる音声接続線 (audio connection) はやや太めになっているのがわかります.メッセージは1発ごとに(メッセージボックスや [metro] から)送られますが,音声接続線には(Pd ウィンドウの compute audio がオンである限り)常に「音」が流れ続けています.その正体は,数値の系列によって表現された波形データです.

上のパッチ random-music.pd では,左右の回路でつくられた2系統の「音」が,[output~] の左チャネルと右チャネルにそれぞれ入り,左右のスピーカから出力されます.ためしに,ランダム音楽を出しながら編集モードに入り,[output~] への接続の一方を削除したり,片方の [hip~] から [output~] の2入力に枝分かれさせてみてください.

音声接続線は,[osc~] のようなオブジェクト(名前に "~" が付くもの)の黒塗りの入力端子に接続することができますが,白抜きの入力端子(メッセージ専用)に接続することはできません.一方,多くの場合,数値メッセージを黒塗りの入力端子に入れることが可能で,その数値を一定出力する DC 波形,あるいは数値メッセージが入力されるごとに値を変えるステップ波形とみなすことができます.

音の大きさ
【音と数値の演算】

音の高さと同じように大きさも自由に変えることができます.下のパッチで,[0.8[ などを押してみてください.音量が変わるのがわかります.

図:volume1.pd

音量を変えているのが [*~] という演算オブジェクトです.数値のみを扱う [*] と異なり,波形データについて演算することができます.上のパッチの場合,[osc~ 440] から送られてくる 440Hz の正弦波に,定数 0, 0.1, 0.2, 0.4, 0.8 のいずれかを掛けることで,その振幅(波の高さが変化する幅)を 0, 0.1, 0.2, 0.4, 0.8 倍に変えています.振幅が小さくなるほど,聞こえる音は小さくなります.

このパッチを少し改造してみましょう.数値を入れたメッセージボックスの代りに,Put メニューから Hslider を選んで配置します.この [hslider] はツマミをスライドさせるたびに数値を出力します.(数値を入力して表示装置として使うことも可能です.) デフォルトでは 0〜127 が数値の変化範囲となりますが,右クリックで Properties を選び(参考図),output-range を left: 0, right: 1 と設定することで,0〜1 を変化範囲とすることができます.([hslider] のほかに [vslider] あるいは [knob] を使ってもよいでしょう.)

図:volume2.pd
【音と音の重ね合わせ】

音と数値の演算ができるなら,音と音との演算も考えられます.たとえば,つぎのパッチは,3つの正弦波(ド・ミ・ソ)を重ね合わせるものです.3つの [hslider] の変化範囲は 0〜1 です.波形データの加算を行なう [+~] は,左右の入力端子ともに「音」が入力されています.

このパッチを正しく理解するには,音声接続線(パッチ上の太線)を流れる「音」の正体を捉えることが必要です.音声接続線には,「音」の波形を 1 ⁄ 44100 秒ごとにサンプリング(sampling;標本化)した数値が流れています.[osc~] などの「音」を発生させるオブジェクトは,−1〜1 の範囲で周期的([noise~] の場合は非周期的)に変化する数値の流れを出力します.0 が流れ続けているならば「無音」の状態です.

3つの正弦波を足し合わせると −3〜3 の範囲で振幅する波形データが得られます.一方,波形データを物理的な音に変換する [output~] は,およそ −1〜1 を標準的な振幅の大きさとしています.そこで [/~ 3] によって振幅を 1 ⁄ 3 に圧縮し,[output~] に入力するようにしています.

実際に音声接続線を流れているデータは,float型のデータを 64 個並べたものです.サンプリングレートが 44100Hz の場合,音の波形(空気の圧力変化)は,1 ⁄ 44100 秒ごとに数値(Pd では float 型データ)としてサンプリングされます.これをバラバラに接続線に流すと効率がよくないので,Pd では 64 サンプル(つまり長さ 64 ⁄ 44100 秒=約 1.45ms の断片)ごとにまとめて波形データを流すようになっています.

もうひとつオマケです.つぎのパッチは日本語の母音(あいうえお)のような音を2つの正弦波を重ね合わせてつくりだすものです.この2つの音成分は,周波数の低い方を第1フォルマント,高い方を第2フォルマントとよび,より高次のフォルマントも存在します.詳しい説明は省きますが,音声の知覚には興味深い現象がたくさんあります.

【音で音を変化させる】

音と音の演算ができることは,音を使って音を変換できることを意味します.たとえば,つぎの2つのパッチを見てください.

図:modamp.pd 図:modfreq.pd

左側のパッチからは,440Hz の正弦波が 1 秒周期で強弱を繰り返しています.[osc~ 1] から出力される 1 秒周期の正弦波(−1〜1)は,その振幅を 0〜1 に変換されています.この周波数では耳に聞こえませんが,Pd の内部では「音」に違いありません.これが,440Hz の正弦波と掛け合わされると,1 秒周期で振幅 ±0 から ±1 まで変化するようになります.(ここでは [osc~ 1] の振幅を 0〜1 に変換してから [osc~ 440] の出力を掛け合わせています.仮に,[osc~ 1] の出力を [osc~ 440] の出力と直接掛け合わせると,振幅の変化は 0.5 秒周期となります.なぜそうなるか考えてみてください.)

右側のパッチからも面白い音が出てきます.下側にある [osc~] は,発生させる正弦波の周波数を,入力される「音」よって連続的に変化させています.上側にある [osc~ 1] の出力 (±1) は,まず 10 倍され (±10),440 が加算され (430〜450),下側の [osc~] に入力されます.聞こえる音の大きさ(振幅)は一定ですが,周波数が 1 秒周期で ±10Hz 上下するわけです.

音の高さと大きさを同時に変化させると,正弦波だけでも面白い音がつくれます.下のパッチ ufo-passing.pd を試してみてください.

たとえば上のパッチの [osc~ 0.2] は,別の音に加える変化の量を時間変化させるための波形を発生させています.このような目的をもった(低い周波数の)波形発生オブジェクトを LFO (low frequency oscillator) とよびます.音の高さや大きさだけでなく,後述する音色を時間変化させるためにも使われます.LFO はシンセサイザの重要な構成要素です.

音のカタチを見る・つくる

これまで,[osc~] が出力する正弦波の周波数と振幅の大きさをコントロールすることで,いろいろな音をつくってきました.ここでは正弦波を含めたいくつかの音の波形(カタチ)を見てみましょう.

【オシロスコープで見る正弦波】

オシロスコープ (oscilloscope) は信号の波形を見るための計測器です.時間を横軸にとり,その瞬間瞬間の信号の値を縦軸にプロットします.下のパッチは,Pd でつくったオシロスコープ(らしきもの)で,正弦波の波形を見ることができます.手で打ち込む場合は,右下側にある [table $0-scope 441] を最初に配置してください.また [hslider] は 0〜1 を変化範囲としてください.

実行モードで [output~] の音量を中位にセットしたら,周波数(たとえば 500Hz)を入力し,スライダ(振幅の大きさ)を上げて,澄んだ正弦波が聞こえることを確かめてください.波形を見るには,[toggle] をオン(×)にして,右下側にある [table] をクリックします.すると下のような別ウィンドウが開き,波形を見ることができるはずです.周波数や振幅の大きさ変えて,波形がどのように変化するのかを観察してください.

このパッチにある [table] は,441 個の数値からなる配列で,$0-scope という名前をつけてあります.[tabwrite~]bang を受け取ると,音声接続線に流れる波形データ(1 秒あたり 44100 個の数値の列)をこの配列 scope1 の先頭から順次格納していきます.したがって,この配列には 10ms ぶん(500Hz であれば 5 周期)の波形データが格納されるわけです.配列内の波形データは [metro] から送られる bang によって 1 秒ごとに更新されています.

【ノコギリ波・三角波・矩形波・ノイズ】

Pd には,[osc~] のほかに,[phasor~], [noise~], [pink~] という波形生成オブジェクトがあります.これらを使って,いくつかの代表的な波形である「ノコギリ波」「三角波」「矩形波」「ノイズ」のカタチを見ていきましょう.

ノコギリ波を発生させるのが [phasor~] です.先ほどのオシロスコープのパッチ scope1.pd で,[osc~][phasor~] に変えてみてください.つぎのような波形が見えるはずです.ノコギリ波は 0〜1 の間で値が変化しています.聞こえる音は,やや濁りや尖りが感じられるでしょう.

三角波と矩形波は,Pd では直接発生できないので,ノコギリ波からつくります.三角波をつくりだすのが下のパッチ scope2.pd です.ノコギリ波とそれを反転させたものを [clip~] で値の範囲を制限してから加算することで,目的とする三角波をつくりだしています.波形のカタチから想像できるように,聞こえる音は正弦波に似ていますが,わずかに濁った(こもった)感じに聞こえるでしょう.

矩形波(くけいは)は,方形波ともよばれ,2値(たとえば 0 と 1)の間を瞬時に遷移する波形です.下のパッチ scope3.pd では,0 の時間と 1 の時間が等しい(デューティー比 50%)の矩形波を,2つのノコギリ波(ただし位相が半周期ずれたもの)を足し合わせることで合成しています.[phasor~] の右側の入力端子に数値(0〜1)を入力することで,波形出力開始時の位相をその周期だけずらすことができます.出力される波形はディジタルっぽいカタチですが,聞こえる音は,ノコギリ波ほどの尖りは感じられないと思います.三角波とノコギリ波の中間のような感じでしょうか.

最後にノイズを取り上げます.Pd には [noise~] というホワイトノイズを発生させるオブジェクトがあります.ノイズには周期性がないので,周波数を指定することはできません.下のパッチ scope4.pd から出力される波形はランダムに上下していて,耳には「シャー」という(空気や水が流れるような)音に聞こえるはずです.理想的なホワイトノイズは,耳には聞こえないほど高い(そして低い)音までを均等な強さで含んでいます.

ホワイトノイズのほかに,ピンクノイズを発生させる [pink~] もあります.波形を見ただけではホワイトノイズとの区別はつきにくいのですが,上のパッチで [noise~][pink~] に入れ替えてみると,耳には「ザー」のような音に聞こえるでしょう.ピンクノイズもすべての周波数の音を含んでいますが,周波数に反比例した強さをもちます.

このページでは [osc~] が「正弦波 (sine wave)」を出力すると言ってきましたが,実のところは「余弦波 (cosine wave)」を出力しています.位相 0 のとき,正弦波の値は 0 ですが,余弦波では 1 となります.下のパッチにあるように [osc~] は,[phasor~][cos~] をつなげたものと等価になります.本物の正弦波は [cos~][sin~] に交換することで発生できます.

図:osc2.pd

なお [cos~] や [sin~] は,入力波形の各データに 2π を掛けたもの [rad] について cos と sin をそれぞれ適用した波形となります.つまり1周期を1回転とした「回転数」が入力となります.一方,数値データに対する [cos] や [sin] はラジアンを単位とする角度を入力としてとります.両者の違いに注意してください.

【音のカタチをつくる】

Pd の波形生成オブジェクトとして [osc~], [phasor~], [noise~], [pink~] を紹介しましたが,じつはもうひとつ [tabosc4~] というものがあります.この [tabosc4~] は,あらかじめ配列([table])に入れておいた数値の列(波形の断片)から,それを1周期とする波形データを発生させます.

配列 sketch に1周期ぶんの波形データに格納します.[table sketch 515] をクリックして別ウィンドウを開き,マウスを使って波形を描画してみてください.たとえば左下のような波形です.これを再生するには,左上側にある数値ボックスに周波数(たとえば 220Hz)を入力して,[output~] の音量を上げます.出力されている波形を見るには,[toggle] をオン(×)にし,[table scope 411] をクリックすると,右下のようにオシロスコープが開きます.音を出しながら,波形を見ながら,配列 sketch を編集したり,周波数を変えたりできますので,いろいろ試してみてください.

[tabosc4~] に与える配列は,その大きさが 2n+3 でなければなりません.たとえば 259, 515, 1027 などです.なお,パッチを保存しても,配列の内容は保存されません.ファイルへの書き出し・ファイルからの読み込み(後述します)が必要となります.

音のカタチを周波数領域で見る
【スペクトラムアナライザで見る正弦波】

周波数や振幅の大きさを同じにしても,正弦波・ノコギリ波・三角波・矩形波などは,異なる質(音色)に聞こえます.この違いを見るための計測器がスペクトラムアナライザ (spectrum analyzer) です.下のパッチは,Pd でつくったスペクトラムアナライザ(らしきもの)です.周波数を横軸にとり,その周波数の音(成分)がどれだけの強さで入力波形に含まれているのかをプロットします.結果を見るには [table] をクリックして別ウィンドウにグラフを開いてください.(このパッチではスピーカから音を出すことはできません.)

このパッチ(スペクトラムアナライザ)の詳しい説明は,やや高度な数学が必要になるので割愛します.興味のあるひとは「フーリエ変換」あるいは「高速フーリエ変換 (FFT: fast Fourier transfer)」でサーチしてみてください.パッチの中では [rfft~] が高速フーリエ変換を実行しています.

このスペクトラムアナライザで,1000Hz および 2000Hz の正弦波を計測すると,つぎのようなグラフ(横軸目盛は 1kHz ごと)が得られます.正弦波ではピークは1つ(主成分のみ)です.理想的には1本の針になるべきですが,測定上の限界(有限幅の時間窓を使うこと)により,ピークの裾がやや広がり気味になっています.

スペクトラムアナライザは波形に含まれる周波数成分を見分けることができます.たとえば,2000Hz, 4000Hz, 6000Hz の正弦波を足し合わせた場合(参考パッチ spect3.pd),下図のように3つの成分を見分けることができます.

【倍音をもつノコギリ波・三角波・矩形波】

ここからは音を聞きながら作業をしたいので,スペクトラムアナライザやオシロスコープをサブパッチにします.下図(上段)のようにメインパッチ spect.pd をすっきりさせ,スペクトラムアナライザの機能をサブパッチ speana に,オシロスコープの機能をサブパッチ oscillo にまとめました.グラフを見るには,それぞれのサブパッチの中で [table] をクリックしてください.

ノコギリ波のカタチを周波数領域で見てみましょう.spect1.pd の[osc~][phasor~] に置き換えます.グラフを見ると,たくさんのピークが出ているのがわかります.1000Hz(1kHz)のノコギリ波では,最も強い成分は 1kHz ですが,2kHz, 3kHz, 4kHz, ... と整数倍の周波数にもピークが立っています.2000Hz(2KHz)のノコギリ波でも,2kHz の主成分に続いて 4kHz, 6kHz, 8kHz, ... と整数倍の成分が続きます.このあたりが音の尖りや濁りと関係するのでしょう.

スペクトラムアナライザで見た三角波(左下)と矩形波(右下)は互いによく似た特徴をもちます.どちらのグラフも音源は 1000Hz(1kHz)です.主成分の 1kHz が最も強く,それに続いて 3kHz, 5kHz, 7kHz, ...(つまり奇数倍)の成分をもちます.これらの成分は,三角波では高次になるとすぐに弱まりますが,矩形波では比較的高次まで続いています.耳で聞いた印象と関係ありそうです.

【周波数領域にみる音の色】

スペクトラムアナライザは,プリズムのように音を「分光」し,その「色相」ごとの強さを表示することで,音のもつ「色彩」を私たちに見せてくれます.この「色彩」は,音のもつ知覚上の印象(濁り・尖り・丸みなど)を説明するための重要な手がかりとなります.また,この「色彩」を操作することで,音のもつ印象を変えることもできます.ぜひ,時間領域(横軸を時間として波形を見ること)だけでなく,周波数領域でも音をイメージできるようになってください.

下のグラフ(上段2つ)は,1000Hz, 2000Hz, 3000Hz の正弦波を,2つの異なる位相関係で重ね合わせた波形です(参考パッチ phase.pd).見た目にはかなり異なっていますが,耳で聞いてみると,実のところ(音量を含めて)区別がつきません.これらの波形をスペクトラムアナライザにかけたグラフ(下段2つ)を見ると,どちらの波形も同じ周波数成分をもっていることがわかります.

時間領域における分析と周波数領域における分析を合わせ,横軸に時間,縦軸に周波数,奥行方向に強さ(実際には色などで表現)をプロットして音を可視化したものが「スペクトログラム」として知られています.

参考までに,ノイズを周波数領域で見るとどうなるでしょうか.下図(左)はホワイトノイズ [noise~] の出力をスペクトラムアナライザで見たものです.ノイズには周期性がないため目立ったピークはありません.細かな山谷がありますが,これはある時点でのスナップショットであるためです.下図(右)のように,時間平均をとるとグラフは平らになります.すべての周波数の音を(統計的に)均一に含んでいるわけで,色彩的には白(灰色)にあたると言えます.これがホワイトノイズとよばれる理由です.(参考パッチ spect2.pd

同様にピンクノイズについても見てみましょう.下図(左)は [pink~] の出力をスペクトラムアナライザで見たときのスナップショット,下図(右)はその時間平均をとったものです.ピンクノイズは周波数に反比例した強さをもつため,色彩的には赤みを帯びた白(すなわちピンク)となります.

音に色をつける

音の質(音色)の少なくとも一部分は,その周波数スペクトル(周波数ごとの強さの分布)によって捉えられることがわかりました.ここでは,音の周波数スペクトルを変化させることで,音の「色彩」を望むものに近づけていく方法を考えます.

まず代表的な3種類のフィルタ(ある周波数成分あるいは周波数帯域のみを透過させるオブジェクト)について,ホワイトノイズに対する応答をみていきます.左下のグラフがホワイトノイズの波形,右下のグラフがその周波数スペクトルを時間平均したもの(横軸目盛は 1kHz ごと;縦軸の表示範囲は 0〜0.2)です.ホワイトノイズはフラットな周波数スペクトルをもちます.

【ローパスフィルタ・ハイパスフィルタ】

ある周波数よりも低い帯域の音のみを通過させるフィルタをローパスフィルタ (low-pass filter) といい,Pd では [lop~] というオブジェクトになります.一方,高い帯域の音のみを通過させるものをハイパスフィルタ (high-pass filter) といい,Pd では [hip~] となります.引数あるいは右側の入力端子に,通過・不通過の境界を決める遮断周波数 (cut-off frequency) を与えます.

つぎの2つのパッチ(filter-lop.pd, filter-hip.pd)で,異なる遮断周波数を与えて,ホワイトノイズがどのような音に変化するのかを確かめてください.(なお,[output~] のすぐ上にある [hip~ 5] は PC 保護のためのフィルタで,知覚にはほとんど影響を与えません.)

図:filter-lop.pd 図:filter-hip.pd

ローパスフィルタに低い遮断周波数を与えると,遠くで川が流れているような,こもった音になります.高い遮断周波数を与えると,目の前に川があるような,より鮮明な音になります.一方,ハイパスフィルタに低い遮断周波数を与えると,大きな穴から空気が漏れているような音になり,高い遮断周波数を与えると,小さな穴から空気が漏れているように聞こえます.

このような印象の差は,やはり周波数領域で見てみると理解しやすいです.下の図は,遮断周波数 2000Hz のローパスフィルタ(左)と遮断周波数 4000Hz のハイパスフィルタ(右)にホワイトノイズを通したとき,得られた波形の周波数スペクトルを時間平均したものです.,このグラフは,フィルタの特性(どの周波数をどれだけ通過させるのか)を表わしています.

このグラフからわかるように,通過・不通過の境界は明瞭なものではありません.(遮断周波数は,通過率がその最大値の約 70% になる周波数と定義されます.) しかし,これらフィルタによって,低い音を取り出す(つまり高い音を取り除く),あるいは高い音を取り出す(つまり低い音を取り除く)ことで,音のもつ印象を大きく変えることができそうです.

【バンドパスフィルタ】

ある周波数帯域の音のみを通過させるフィルタをバンドパス (band-pass filter) といい,Pd では [bp~] というオブジェクトになります.引数あるいは右側2つの入力端子に,それぞれ中心周波数 (center frequency)Q値 (quality factor) を与えます.中心周波数 fC は,フィルタを通過できる周波数帯域の中心にある周波数,Q値 Q は,通過できる周波数帯域の狭さ(鋭敏さ)を決めるものと考えてください.まずは下のパッチで,いくつかの中心周波数とQ値を選び,聞こえるノイズがどのように変わるのかを試してみてください.

小さな Q ではフィルタをかけない場合とあまり違いはありませんが,Q を大きくしていくと鋭く金属的な音になっていき,笛のように共鳴している感じが出てきます.Q は,通過率が最大値の約 70% となる上下の遮断周波数を fH, fL とするとき,Q = fC ⁄ (fHfL) となる無次元数です.fC = 3000Hz で,Q = 10 であれば,帯域幅は 300Hz となります.帯域幅が狭くなるほど,共鳴しているように聞こえます.

下の図は,Q = 3(左)および Q = 30(右)のバンドパスフィルタ(ともに fC = 3000Hz)にホワイトノイズを通したとき,得られた波形の周波数スペクトルを時間平均したものです.この特性グラフから,バンドパスフィルタがある特定の周波数帯域の音のみを通過させることがわかります.

【音でコントロールするフィルタ】

音で音の高さや大きさをコントロールできるように,音でフィルタの特性をコントロールすることも可能です.そのためのフィルタが [vcf~] で,その名前はアナログシンセサイザの構成要素である VCF (voltage controlled filter) に由来します.フィルタとしての機能はバンドパスフィルタ [bp~] と同じですが,中心周波数を音(波形)で与えることができます.(Q値は数値メッセージあるいは引数で与えます.)

上のパッチは,5Hz の正弦波によってバンドパスフィルタの中心周波数を 250〜850Hz のあいだで振っています.通過する周波数帯域を広め(Q = 5)にすると,まるで蒸気機関車の音のように聞こえ,狭め(Q = 30)にすると,なんとなく UFO の音のように聞こえます.

ホワイトノイズ以外にフィルタを適用することも,もちろん可能です.たとえばノコギリ波であれば,たくさんの倍音成分をもっているので,たとえばバンドパスフィルタを適用することで音色を変えることができます.下のパッチは,[phasor~] から出力されるノコギリ波に [vcf~] を適用した例です.1秒ごとに変化する音色を確認してください.

さらに音源(上の例では [phasor~] からのノコギリ波)の周波数を変化させることで,より複雑な音色をつくることもできます.音による音の操作を積み重ねることがで,いろいろな音をつくってみてください.

音のエンベロープ

たとえばピアノの鍵盤を叩くと,対応する音が鳴りはじめ,鍵盤を押し下げている間はゆっくりと減衰し,鍵盤を解放すると音は消えていきます.船の汽笛ならば,鳴りはじめもゆっくりと変化していくでしょう.このような時間軸上に展開された音量変化(曲線)をエンベロープ (envelop;包絡線)といいます.エンベロープの形状によって,音のもつ印象も変わっていきます.

【フェードイン・フェードアウト】

つぎのパッチでは,[vline~] というオブジェクトによって,エンベロープを生成し,正弦波の振幅をコントロールしています.0, 1 などの数値メッセージを送ると,[vline~] はただちにその値を保持する直流波形(水平線)を出力します.目標値と時間(ms)をリストにして送ると,[vline~] は現在値から目標値まで与えられた時間をかけて線形に変化させるエンベロープを出力します.たとえば,[1 1000[ を押せば1秒かけてフェードイン (fade-in) し,[0 1000[ を押せば1秒かけてフェードアウト (fade-out) するわけです.

上のパッチで,[vline~]1, 0 などの数値を与えて音をオン・オフさせると,「プツッ」という切れ目らしきものが聞こえます.一方,[1 5[, [0 5[ を押して(変化時間を加えたリストを入力して)オン・オフさせた場合,このような現象はみられません.

左上のグラフは,1 を与えてオンにしたときの波形です.オンにした瞬間,グラフに不連続な部分がみられます.このスパイク状の部分が「プツッ」という音として知覚されます.一方,右上のグラフは [1 5[ を押してオンにしたときの波形です.スムーズに変化しているのがわかります.

音をオン・オフするとき,あるいは音から別の音へと切り替えるとき,切れ目・つなぎ目を丁寧に扱って,質のよい作品をつくってください.

フェードインとフェードアウトをつなげることで,たとえばオルガンの鍵盤を押したときのようなエンベロープをつくることができます.左下のパッチでは,PC キーボードの任意のキーを押し下げたときフェードインが開始され,キーを離すとフェードアウトが開始されます.サブパッチ [pd key2] は,キーが押されたとき,そのキー番号(ASCII コード)を左側の出力端子から出力し,キーが放されたとき,そのキー番号を右側の出力端子から出力します.([pd key2] の詳しい説明は割愛しますが,キーの自動リピートをキャンセルする機能を持っています.)

右上のパッチでは,少し複雑なメッセージを [vline~] に与えています.最初に出力されるのは 1  200 と同じですが,その直後に出力されるのは 0  1000  500 という3つの数値からなるリストです.これは「このメッセージを受け取った 500ms 後から,1000ms の時間をかけて,出力値を 0 まで下げろ」という意味になります.スペースキーを押すと,(0ms, 0) − (200ms, 1) − (500ms, 1) − (1500ms, 0) を結んだ台形型のエンベロープをもつ音が得られます.カンマで区切った3つ組(目標値  変化時間  遅延時間はいくつでも連ねることができ,複雑なエンベロープをつくることができます.遅延時間とはメッセージを受け取ってから出力値の変化を始めるまでの時間間隔のことです.(なお [vline~] は,入力メッセージ 1  2001  200  0 の省略形,11  0  0 の省略形とみなします.)

【ADSR】

一般的な楽器で1つの音を演奏したときの音のエンベロープは,A, D, S, R という4つのパラメタで決まる直線図形によって近似できます.それぞれのパラメタの意味はつぎのとおりです.

これを図示すると,下のようになります.左は音量変化としてのエンベロープ,右は波形を包絡するエンベロープで,どちらも本質的には同じものです.

図:adsr1.png 図:adsr2.png

ADSR パラメタ(A, D, S, R)から [vline~] メッセージへの変換も簡単にできます.鍵盤が押されたら 1  A  0S  D  A を送り,鍵盤が放されたら 0  R を送るようにすればよいでしょう.つぎのパッチは,スライダ [vslider] でこれらパラメタを設定できるようにしたものです.ADSR の各パラメタを変えて,音のエンベロープと印象の関係を確かめてください.

レベル 0.9 と 0.8 の音量差と,レベル 0.2 と 0.1 の音量差は,どちらも数値上は 0.1 の差ですが,後者のほうが大きな差に聞こえます.人間の感覚は対数的な感度特性をもっているようです.たとえば ADSR の R で指定される減衰部分では,線形(直線的)に音量を減少させていますが,やや急に音が消えてしまうように聞こえます.

これを緩和させるには,たとえば [vline~] の出力を [*~] で二乗にしてから,音源との乗算を行なうとよいでしょう.前出の vline3.pd と,それを改造した下のパッチとの間で,音が減衰していく様子を聞き比べてみてください.

図:vline3rev.pd
音を遅らせる(エコー)

硬い壁で仕切られた部屋では,声や物音が反響します.これは音が壁に反射して,わずかに遅れて戻ってくるためです.部屋が大きくなれば,この遅延時間は長くなります.また壁の材質や形状によって,戻ってくる音の大きさも変わります.ここでは,このような残響(エコー)のつくりかたを説明します.

【ディレイライン】

マイクで拾った音に一定時間の遅延を与えてヘッドフォンに出力してみます.スピーカに出力すると,その音がマイクに戻って,いわゆるハウリング状態に陥ることがありますので,ヘッドフォンを使うようにしてください.[adc~] はマイクで捉えた音を波形データ(左右2系統)として出力するオブジェクトです.

マイクで捉えた音は,モノラル化されたのち,[delwrite~] に入力されます.[delwrite~] は,名前(ここでは buffer)と時間 TD(ここでは 2000ms)を与えることで,TD (ms) ぶんの音を格納するディレイライン(delay line;遅延線)がつくられます.[delwrite~] に入力された音は,常に最新の TD (ms) ぶんがディレイライン上に保持されます.音が伝わるのに時間がかかる長い管のイメージです.

一方,パッチの右側にあるのは,ディレイラインから音を読み出す回路です.[delread~] は,引数または入力端子に与えられた時間 (ms) ぶんだけ遅延した音を,ディレイラインから読み出します.ディレイラインの入口から,この時間分だけ奥に進んだところに聴診器を当てているイメージです.もちろん,ディレイラインの全長 TD を超える遅延時間の指定はできません.

なお,[delread~] に与えた遅延時間(たとえば 50ms)と,ヘッドフォンやスピーカから出力される音の遅延時間には差があります.これは OS やサウンドカードによるものです.Pd の Audio Settings... を開くと,入出力バッファのサイズ(delay (msec) の項目)を確認できます.この値が 100ms のとき,[delread~] に 50ms の遅延時間を設定したならば,トータルな遅延時間は 150ms 程度になるでしょう.

上のパッチ delay.pd で 50ms 前後の遅延時間を入力し,大きめの音量(もちろんヘッドフォン使用)を設定して,言葉(名前・住所・早口言葉など)を喋ってみてください.舌がもつれたようになり,うまく喋ることができなくなると思います.これは,私たちが言葉を喋るとき,自分の声を耳で聞きながら,口・舌・喉などの筋肉を調節しているためです.トータルな遅延時間が 100〜200ms 程度のとき,このような現象が顕著にみられるようです.とても興味深い現象です.

【エコー(反響)】

わずかに遅延した音を元の音に重ねることで,カラオケなどでお馴染みのエコーをかけることができます.下のパッチは,与えられた時間 (delay time) だけ遅延した音を,与えられた強さ (echo level) で元の音に戻して(加えて)います.こうすることで,多重化されたエコーが実現できます.遅延時間と強さを調節して,たとえば「お風呂」「大ホール」「やまびこ」などのエコーをつくりだしてみてください.(なお,遅延した音を元に戻す強さ (echo level) を強くしすぎると,出力が入力に増幅されながら回りだす,いわゆるハウリング状態に陥ることがありますので,注意してください.)

これに若干の改造をしたものが下のパッチです.[send~] は波形データを同じ名前をもった [receive~] に無線伝送します.メッセージの無線伝送に使う [send], [receive] の波形データ版にあたります.パッチの内部での無線伝送だけでなく,このようにパッチ間の無線伝送も可能です.(ただし名前の重複には注意してください.Pd における名前はグローバルなスコープにあります.)

録音・再生とファイル操作

音のもつさまざまな特性を操作し,オリジナルな音をつくりだせるようになったと思います.ここでは,自分で作成した音を使って楽譜を演奏する方法や,作成した音やマイクからの音を記録・再生する方法,また記録した音をファイルに書き出したり,ファイルから読み込んだりする方法について解説します.

【シーケンサ】

シーケンサ (sequencer) は自動演奏(音源のコントロール)のための装置で,あらかじめ与えられた楽譜(時系列状の操作データ)もとづいて,音の操作を順次実行していきます.もっともシンプルなシーケンサは,音符(ノート番号)の並びを順次読み込みながら音に変換していくものでしょう.これは配列 (array) を使って,つぎのように実現することができます.

パッチ中央にある四角い領域が配列です.Put メニューから Array を選び,名前 myScore,サイズ 16,描画スタイル points を指定して生成します.

パッチ左上側にある [loadbang] は,このパッチを開いたときに1度だけ bang を出すオブジェクトで,初期化処理を起動するために使います.接続先の2つのメッセージボックスをクリックすることでも,同じ初期化処理を行なえます.ここでは,16個のノート番号を同じ要素数の配列 myScore に格納します.[count 16]bang を受け取るたび 0, 1, ..., 15, 0, 1, ... と数値を出力します.[tabwrite] は,これをインデクスとしてノート番号を配列に格納します.右下側にあるのが再生回路です.[tabread] にインデクスを与えて対応する数値を出力させ.これをノート番号として正弦波を発生させています.(便宜上,ノート番号 55 を休符として扱っています.) もちろんメトロノームのテンポを変えることも可能です.

もう少し機能の高いシーケンサとして [qlist] というオブジェクトがあります.[qlist] は,その内部に楽譜(時系列状の操作データ)を保持し,それを再生(あるいは編集)すること,またファイルに書き出したり,ファイルから読み込んだりすることができます.楽譜ファイルは「遅延時間  送信先  データ」という行を時間順に並べたテキストファイルで,たとえば次のようになります.(なお,遅延時間 の単位はミリ秒 (ms) で,データ は数値でもシンボルでもそれらの並びでも構いません.楽譜ファイルはそれを扱うパッチと同じフォルダに入れておくとよいでしょう.)

whistle.txt
   0 vol  0.0;
1000 freq 440;
   0 vol  0.8 2;
 100 vol  0.0 2;
 900 freq 440;
   0 vol  0.8 2;
 100 vol  0.0 2;
 900 freq 440;
   0 vol  0.8 2;
 100 vol  0.0 2;
 900 freq 880;
   0 vol  0.8 2;
1000 vol  0.0 2000;

この楽譜を再生するには,たとえば下のようなパッチを用意します.[qlist] に楽譜ファイルを読み込ませるには,[read whistle.txt[ を押します.[bng] を押せば演奏開始です.[qlist] は,楽譜の1行ごとに,遅延時間を入れてから送信先(vol など)にデータを送信します.このデータは,パッチの右側にある [receive vol], [receive freq] によって受信され,音を操作する回路へと流れていきます.[sig~] は数値データを波形データ(直流・ステップ波形)に変換するオブジェクトです.コンソールに受信データが表示されますので,それを確認しながら「時報音」を聞いてみてください.

[qlist] は楽譜ファイルを普通に再生するだけでなく,スピードを変えること(tempo 1.5 などを送る)や,演奏データを記録(ファイル保存)することなど,いろいろな機能をもっています.詳しくは [qlist] のヘルプを参照してください.

【波形データの録音と再生】

楽譜のような記号化されたデータではなく,音(波形データ)そのものを録音し,後で再生することも必要になるでしょう.波形データを格納のするのは,やはり配列です.Put メニューから Array を選んで生成します.このとき,記録したい音の長さ(秒数)にサンプリングレート(デフォルトでは 44100Hz)を掛けた数を配列のサイズとします.たとえば,2 秒間の波形データを格納する配列のサイズは 88200 となります.描画スタイルは polygon でよいでしょう.

下のパッチは,880Hz の正弦波に 2 秒間で変化するエンベロープを与え,それを配列 sound2sec に書き込んでいます.[bng] を押すと,エンベロープの適用が始まると同時に,[tabwrite~]bang が入力されることで sound2rec への書き込みも開始され,書き込みが終了するとその内容がグラフ表示されます.エンベロープの形状に黒く塗りつぶされていますが,実際には上下に振動する正弦波が描かれています.パッチの右側は,sound2rec の内容を再生するための回路です.[tabplay~] は,bang が入力されると,配列の内容を読み出し,波形データとして再生します.1回分の再生が終了すると右側の出力端子から bang が出力されます.

このパッチを改造して,マイクで捉えた音を録音・再生できるようにしましょう.下のパッチでは,左右の音を足し合わせたモノラル音声を配列に書き込むようにしています.録音タイミングを与える bang に 500ms の遅延を加えているのは,マウスクリックの音が混ざらないようにするためです.また,録音時は [output~] をミュートさせておくとよいでしょう.自分の声(2 秒間)を録音・再生してみてください.

さらに再生回路を改造してみます.[tabplay~] の代りに [tabread4~] を使います.これも配列の内容を波形データとして出力するオブジェクトですが,入力として再生ヘッドの位置(配列のインデクス)を表わす波形データを与えることで,再生位置や速度を自在のコントロールすることができます.下のパッチでは,[vline~] によって直線的に増加するランプ状波形を生成し,それを [tabread4~] に入力しています.2000ms で配列の終わりまでインデクスを変化させれば通常の再生,1500ms であれば早回し,3000ms であれば遅回しで再生されます.

つづいて下のパッチでは,[phasor~] で発生させたノコギリ波(周波数 0.5Hz = 周期 2 秒, 振幅 0〜1)を振幅 0〜88199 に変換し,それを [tabread4~] に与えることで,配列 sound2sec の全内容を再生することを繰り返しています.[phasor~] の周波数を 1Hz にすれば,2倍速での再生となります.

最後にもうひとひねり.[phasor~] は 0 から 1 まで連続的に増加するノコギリ波を発生させます.これに −1 を掛け,さらに 1 を加えることで,1 から 0 まで連続的に減少する逆ノコギリ波をつくることができます.この逆ノコギリ波を使って再生ヘッドを動かすとどうなるでしょう.試してみてください.

【ファイルへ書き出し・ファイルから読み込み】

ファイルと配列のやりとりは [soundfiler] によって簡単に行なえます.write  -wave  sample.wav  sound2sec のように,ファイル形式とファイル名,そして配列名を明示したメッセージを [soundfiler] に与えれば,配列 sound2sec の内容が WAV フォーマットのファイル sample.wav として書き出されます.また,read  sample.wav  sound2sec というメッセージを送れば,ファイル sample.wav の内容が配列 sound2sec に読み出されます.音の長さがわからない場合は [read -resize lengthy.wav sound2sec[ のように -resize オプションを与えると,読み出されたデータの数に合わせて配列のサイズが自動変更されます.[soundfiler] は書き込んだ・読み出した要素数を出力します.(なお,波形データのフォーマットとしては,Windows でよく使われる WAV,Mac でよく使われる AIFF などが選べます.)

音楽ファイル(WAV フォーマットなど)などを読み込むときは,サンプリングレートが 44100Hz,ビット数 16,チャネル数 2 とする必要があります.Windows では音楽ファイルを右クリックして「プロパティ」でこれら設定値を調べることができます.フォーマットを変換するには,たとえば iTunes などが使えます.iTunes の「環境設定」から「インポート設定」を開き,カスタム設定(参考図)としてこれら数値を入力してください.

ファイルから波形データをいちど配列に吸い上げるのでなく,ファイルから直接出力(いわばストリーム再生)することも可能です.ストリーム再生は [readsf~] が, またストリーム録音は [writesf~] が担当します.引数としてチャンネル数(通常はステレオなので 2)を与えます.どちらも,まず最初に,メッセージ open  ファイル名 によってファイル名を設定し,あとは録音あるいは再生を start, stop で開始・停止させます.音ファイルを再生するだけ,または録音するだけであれば,手軽に使えて便利です.

ファイルを扱うオブジェクト([qlist], [soundfiler], [readsf~], [writesf~] など)は,基本的にファイルがパッチと同じフォルダにあることを想定しています.相対パスを指定することも可能で,たとえば [open sounds/sample1.wav[ のように指定します.もちろん絶対パスも指定できますが,あまりおすすめしません.(まだ保存していない新規パッチでは,OS によって音ファイルの保存先が異なるようです.パッチを一度保存してから,ファイル操作をするようにしてください.)