チュートリアル 12:
ウェイブシェイピング

ストアされたウェイブテーブルの使用

チュートリアル3では、cycle~ オブジェクトによって読み取られるウェイブテーブルとして、buffer~ にストアされた512のサンプルを使用しました。buffer~ オブジェクトの名前が cycle~ オブジェクトのアーギュメントとしてタイプされると、cycle~ は、デフォルトのコサイン波の代わりに、buffer~ から得られるサンプルをその波形として使用します。cycle~ の左インレットで受信した周波数値は、1秒につき何回その512のサンプルを読み通すかを決定し、その結果演奏する音の基本周波数を決定します。

思い出してもらえるように、このようなウェイブテーブルシンセシスの例が、このチュートリアルパッチの右下のコーナーに含まれています。


cycle~ オブジェクトは buffer~ にストアされた512のサンプルをくり返して読み通します

buffer~ オブジェクトをダブルクリックしてその内容を見て下さい。ファイル gtr512.aiff はレコーディングされたエレキギターの音の1サイクルを含んでいます。ezdac~ スピーカアイコンをクリックしてオーディオをオンにして下さい。toggleをクリックしてgate~ をオープンして下さい。これで、cycle~ のアウトプットが dac~ に届くようになります。toggle を再度クリックして gate~ を閉じて下さい。

このタイプのシンセシスでは cycle~ のためにどんな波形を使用しても構いません。しかし、音色は静的で、波形の変化がないためいくぶん生気のない感じです。このチュートリアルでは、ウェイブシェイピング(波形形成)と呼ばれる技術を使って、動的に変化する音色を得るための新しい方法を紹介します。

テーブル・ルックアップ:lookup~

ウェイブシェイピング・シンセシスでは、オーディオシグナル(最も一般的にはサイン波)は、シェイピング関数(一般に、変換関数(Transfer function)とも呼ばれます)を含むルックアップテーブルにアクセスするために使用されます。入力シグナルの各々のサンプルはテーブル(数値の配列)にストアされた値を探し出すためのインデックスとして用いられます。ルックアップテーブルは任意の順序で任意の値を含むので、リニアな値の領域(例えば、シグナルの -1 から1の範囲)を、ノンリニアな関数(ルックアップテーブルにストアされるものならが何でも)にマップするために役立ちます。Maxオブジェクト table はルックアップテーブルの一例です。入力(通常、0〜127)として受け取った数値は table にストアされた任意の値にアクセスするために用いられます。

MSPオブジェクト lookup~ では、ルックアップテーブルとしてbuffer~ でストアされたサンプルを使用することができ、1 から -1の範囲のシグナルによってアクセスできます。デフォルトで lookup~ buffer~ の最初の512のサンプルを使用しますが、アーギュメントによって、ルックアップテーブルとして使用するための buffer~ の内容の抜粋を指定することができます。512のサンプルが使われる場合は、-1から0までの入力値は最初の256サンプルにマップされ、0から1の入力値は次の256サンプルにマップされます。lookup~ は必要に応じて2つのストアされた値の補間を行います。


サイン波は buffer~ の抜粋を前へ、あるいは後ろへ読み通すために使用されます

ルックアップテーブルのインデックスとして用いられる入力シグナルには、サイン波が最も一般的に用いられます。(サイン波は、なめらかに前へ、あるいは後ろへテーブルを読むことができるので、これは合理的な選択です。)しかし、どんなオーディオシグナルでもlookup~ の入力として使用することができます。

ウェイブシェイピング・シンセシスについては、次のような点に注目することが重要です。入力信号の振幅を変更することによって、使用しているルックアップテーブルの量が変更されます。入力信号のレンジが -1から1まである場合、ルックアップテーブル全体が使用されます。しかし、もし入力信号のレンジが-0.33から0.33までだとすると、テーブルの中央の三分の一だけが使用されます。一般に、入力信号の振幅が増加するにつれて、出力信号の音色はより明るく(より高い周波数を含むように)なります。

また、入力シグナルの振幅は出力シグナルの振幅に直接影響を与えない、という点に注意することも重要です。出力シグナルの振幅は、ルックアップテーブルで示された値に完全に依存します。

ウェイブシェイピングによる音色の変化

チュートリアル・パッチのウェイブシェイピングの部分は、パッチャーウィンドウの左下になります。これは、上に示した例とほとんど同じ種類のものです。

ルックアップテーブルはbuffer~ の中の512のサンプルを含んでいて、cycle~ オブジェクトからのサイン波によって読み通されます。


ルックアップテーブルはウェイブシェイピングに利用されます

パッチャーウィンドウの上側の部分は、コサイン波の振幅を変える3つの異なった方法を含んでいますが、これは音色の変更をもたらします。

・オーディオがまだオンのままならば、ポップアップumenuから "Set range by hand" を選んで下さい。これは selector~ の最初のシグナルインレットをオープンするため、"By hand"と記されたナンバーボックスをドラッグして cycle~ の振幅を変えることができます。ナンバーボックスの値を変更して、違った音色を聞いてみて下さい。


入力シグナルの振幅をセットして、出力シグナルの音色を変えます

音が持続している間の音色変化を作り出すために、コントロール関数のエンベロープを用いて、時間の経過の中で自動的に cycle~ の振幅を変えることができます。

・“Control range by envelope”をumenu から選んで下さい。"Duration"と表示されたナンバーボックスに値(例えば、1000ミリ秒)を入力して音の持続期間をセットし、buttonをクリックして音を演奏して下さい。いろいろな持続とエンベロープを実験してみて下さい。

他のシグナルを使って、入力波形をの振幅をモデュレートすることも可能です。非常に遅いモデュレート周波数(例えば0.1Hz)は、徐々に音色を変化させます。より速いサブオーディオ(可聴閾未満)モデュレート周波数(例えば8Hz)は、ある種ユニークな「音色のトレモロ」を作るでしょう。オーディオ領域(可聴域)で入力波をモデュレートすると、和と差の周波数(チュートリアルで9を見たように)を作り出しますが、これはモジュレーションレートによって、様々な方法で干渉を生じるかも知れません。

・"Modulate range by wave"をumenu から選んで下さい。モジュレーションレート(Modulation rate)を0.1Hzにセットし、モジュレーションデプス(Modulation depth)を0.9にセットして下さい。



入力波形の振幅の非常にゆっくりしたモジュレーションは、音色を徐々に変化させます

cycle~ の振幅が0.45を掛けられ、0.5オフセットされていることに注意して下さい。このため、レンジは0.05から0.95になっています。(もし振幅が完全に0になってしまうと、0でモジュレーションすることになり、音はストップしてしまいます。)"Modulation depth"と表示されたナンバーボックスは0から1まで動きますが、実際にはcycle~ を0.05から0.95の範囲にスケーリングします。

デプスとモジュレーションレートに他の値を設定して、実験してみて下さい。

音楽を目的としたインストゥルメントを設計している場合には、音色を変えるためにこれらの3つの方法のいくつかを結合して使用しても構いません。また、出力されるサウンドの振幅をスケーリングするために、ほとんど独立した振幅エンベロープを持つことも可能です。(lookup~ から出ているシグナルの振幅は、読み通されているサンプル値に依存し、入力されるシグナルの振幅は直接影響を与えないということを思い出して下さい。)

まとめ

ウェイブシェイピング(波形形成)は、新しい音色を作るためのノンリニア(非直線的)なシグナルの「ねじれ」です。オリジナルのシグナルのサンプル値はルックアップテーブルのアドレス指定を行うために使用され、ルックアップテーブルの対応した値が出力されます。lookup~ オブジェクトは、こういったルックアップテーブルとしてbuffer~のサンプルを扱い、そのサンプルのアドレス指定を行うために1 から -1までの入力レンジを使用します。サイン波は、一般的に波形形成シンセシスのための入力シグナルとして使用されます。入力シグナルの振幅は、ルックアップテーブルの範囲をどれだけ多く使うかを決定します。入力シグナルの振幅が増加するにつれて、テーブルのより多くの範囲が使用され、その結果として、一般により多くの周波数が出力にもたらされます。従って、ウェイブシェイプによるシグナルの音色は、入力シグナルの振幅をコントロール関数やモデュレートシグナルを使用して連続的に変えることによって、動的に変化させることができます。

参照

buffer~ オーディオサンプルのストア
cycle~ テーブルルックアップ・オシレータ
lookup~ ルックアップテーブル伝達関数