チュートリアル4

基礎:シグナルのルーティング

リモートシグナルコネクション:send‾とreceive‾

MSPオブジェクトを接続するパッチコードは、標準パッチコードと異なった外見をしていますが、実際、違う働きをしています。これらは、シグナルネットワークでの計算の順序を記述します。接続されたオブジェクトは、サウンドの次の部分のための、サンプル全体のブロックの計算に利用されます。

Maxオブジェクトはオブジェクトsendとreceive(そしてvalueとpvのような類似したいくつかのオブジェクト)によって、パッチコードなしで離れたまま通信することができます。MSPシグナルもまたsendとreceiveで離れたまま通信することができますが、receiveから出ているパッチコードにはシグナルネットワークを表す黄−黒のストライプがありません。(なぜなら、receiveオブジェクトは前もって受信するメッセージの種類を知らないからです。)離れたままのシグナル通信のために、2つのMSPオブジェクトが特に存在します。:send‾とreceive‾です。

Maxメッセージのためのsendとreceive; シグナルのためのsend‾とreceice‾

2つのオブジェクトsend‾、receive‾は、send、receiveと全く同じような働きを持ちますが、MSPオブジェクトのためだけに使われます。Maxはsend‾及びreceive‾に標準パッチコードを接続するのを妨げませんが、シグナルだけがsend‾から対応するreceive‾に流れることができます。MSPオブジェクトsend‾、receive‾は、シグナル以外のどんなMaxメッセージも通しません。

Maxオブジェクトsend、receiveとMSPオブジェクトsend‾、receive‾の間には他にもいくつかの重要な違いがあります。

1. sendとreceiveの名前は、sとrに短縮することができます。;send‾、とreceive‾の名前は、短縮することができません。

2. Maxメッセージは、send意外にも、他のいくつかのオブジェクト(例えばfloat、forward、grab、if、int、message)からreceiveオブジェクトへ送ることができます。;receive‾は、同じ名前を共有するsend‾オブジェクトからだけ、シグナルを受け取ることができます。

3. receiveにタイプされた引数がない場合、receiveは名前をセットまたは変更するsetメッセージを受信するためのインレットを持ちます。;receive‾も同じ目的でインレットを持ちますが、それにもかかわらずタイプされた引数を持つことを要求されます。

4. setメッセージでreceive‾オブジェクトの名前を変更することは、対象のオーディオシグナルを動的に変更するために有効な方法です。しかしreceiveの名前を変更した場合、オーディオを一度オフにして再びオンにするまで対象のオーディオシグナルは変更されません。

これらの各々の使用法についての例はチュートリアルパッチで見ることができます。

シグナルのルート指定:gate‾

MSPオブジェクトgate‾は、Maxオブジェクトgateと非常によく似た働きをします。gateが、メッセージにいくつかの行き先のうちの1つを指示したり、メッセージの流れを完全に閉じるために使われるように、gate‾はシグナルに異なる場所を指示したり、残りのシグナルネットワークから遮断したりします。

実例パッチでは、gate‾オブジェクトは、umenuオブジェクトから受信した値によって、シグナルのルートを、「左のオーディオ出力」「右のオーディオ出力」「左右両方の出力」「どこにも送らない」に指定するために利用されます。

gate‾は選択された場所にシグナルを送ります

オーディオが鳴っている間にgate‾に選択されるアウトレットを変更するには注意が必要です。それは、シグナルを1つのアウトレットから別のアウトレットに急に変更するため、クリックノイズを引き起こす可能性があるからです。これを避けるためには、一般にgate‾のアウトレットの変更が、オーディオシグナルの値が0である時、またはオーディオがオフである時に行われるようにパッチを設計しなければなりません。(チュートリアルパッチではこのような予防措置はとられていません。)

波の干渉

異なった周波数の2つのサイン波を一緒に足しあわせると、2つの波の間に「干渉」が起るということは、物理学上での基本的な事柄です。それらは異なった周波数を持つので、お互いの位相は常に同じではありません。そのため、ある所ではちょうど位相がそろって正の方向に加算されますが、他の所では、ある程度お互いを打ち消し合うように負の方向に加算されます。2つの波は、周波数の差に等しい割合でだけ、厳密に互いに同じ位相になります。たとえば、1000Hzと1002Hzのサイン波では、1秒間に2回同じ位相になります。このとき、これらの周波数は十分に近いので、2つの別々の音としては聞こえません。そのかわり、それらの足しあわされる所と打ち消しあう所のくり返しのパターンは、2Hzのサブオーディオ周波数(可聴域以下の周波数)で発生しているビート(うなり)として聞こえます。この周波数は「差音周波数」または「ビート(うなり)周波数」として知られています。(面白いことに、私達の耳には、この2つの音は2Hzのサブオーディオ・ビート周波数と1001Hzのオーディオ周波数をもつ単音として聞こえます。)

実例パッチがオープンされるとき、loadbangオブジェクトはcycle‾オブジェクトに周波数の初期値(1000Hzと1002Hz)を送るので、これらの2つの音が2Hzのビート(うなり)周波数を引き起こすことが予想されます。これはまた、gate‾オブジェクトにも(途中、umenuを経由して)初期値を送り、1つの音は左のアウトプットへ、もう1つの音は右のアウトプットへ出力するよう指示します。

2つの波は2Hzのレートで干渉を起こします

* ezdac‾をクリックして、オーディオをオンにして下さい。そして、”Volume”と書かれたusliderを利用してちょうど良いレベルになるように、音の大きさを調節して下さい。ビート(うなり)が正確に1秒につき2回発生する点に注意しましょう。オシレータBの周波数を1000に近い色々な値に変更してみて、その結果を注意深く観察して下さい。差音周波数がオーディオレート(およそ20-30Hzの範囲)に近づくと、もはや個々のビートを識別することができなくなり、その結果は、音色の変化として現れてきます。差をもっと増やしてみて下さい。そうすると、はっきりと2つの周波数が聞こえるようになります。

哲学的な接点:2つの正弦波の音が加算されるとき、それらの干渉パターンが周波数の差に等しいレートで繰り返されることは、数学的、経験的に示されています。これは、「なぜ、我々がビート(うなり)を聞くのか?」についての理由を明瞭に説明しています。(振幅は、周波数の差の割合で明白に変化しています。)しかし、ヘッドホンでこのパッチを聞く場合ー2つの音には数学上(電気的にまたは空気中で)干渉をおこす機会がありえないのにーそれでもなお、ビート(うなり)が聞こえます!この現象は(バイノーラル・ビートとして知られていますが)、神経系で発生している「干渉」によって引き起こされるのです。このような干渉は、空気中での音波の干渉とは非常に異なる身体的性質のものですが、私たちはそれを同じように体験します。この実験は、私たちの聴覚のシステムが、「聞いている世界を能動的に形づくる」ことを証明しています。

振幅と相対振幅

「Volume」と書かれたusliderは、0から100までの101の値の範囲を持っていますが、これは、単に100で割ることで0から1の範囲のfloat(浮動小数点数)に容易に変換されます。( '/' オブジェクトに書き込まれた引数の小数点は、確実にfloatの除算がおこなわれるためのものです。)

ボリュームフェーダは、usliderのアウトプットのintを0. 〜 1. のfloatに変換することで作られています

*‾オブジェクトは、指定された振幅値を使って、オーディオ・シグナルがezdac‾へ行く前にスケール(係数を掛ける)します。もし、両方のオシレータがezdac‾の同じインレットに送り出されると、それらを合わせた振幅は2になってしまうでしょう。そこで、増幅のための係数を0.5以下に保つことが賢明です。この理由から、振幅値は(ユーザーは、0 〜1の間と思いますが)、実際には「* 0.5」オブジェクトによって0 〜 0.5の間に保たれます。

両方のオシレータが同じアウトプットチャンネルに入力される場合、振幅は半分にされます

聞き取りが可能な振幅の範囲は広いので、絶対的な振幅値としてではなく、対数スケールによるデシベル(dB)をボリュームの数値(値)としてを示すことのほうがより意味がある場合があります。デシベルという単位は、相対的な振幅(ある基準の振幅と比較したシグナルの振幅)を表しています。デシベルで振幅を計算する公式は以下の通りです。

dB=20(log10(A/Aref))

Aは計測された振幅で、Arefは固定された基準振幅です。

サブパッチAtodBは、上に示される式の基準振幅を1として、振幅をデシベルに変換します。

サブパッチAtodBの内容

usliderから受け取られる振幅は常に1以下なので、AtodBの出力は常に0dB以下になります。各々の振幅を半分にすることは、およそ6dBの減少と同じになります。

AtodBは基準振幅1に対する相対的な値として、振幅をdB(デシベル)で知らせます

* usliderのポジションを変えて、線形の振幅表示と対数関数的なデシベル単位の表示を比較して下さい。

定数シグナル値:sig‾

大部分のシグナルネットワークは、いくつかの変化している値(例えば時間上で振幅を変化させる振幅エンベロープ)といくつかの定数値(例えばオシレータを安定したピッチに保つ周波数値)を必要とします。一般に、定数値はfloatメッセージの形でMSPオブジェクトに提供されます。これは、すでに実例でcycle‾オブジェクトの左インレットに周波数値を送るときに行なったのと同様です。

しかし、いくつかのケースでは、変化する値と定数をMSPオブジェクトの同じインレットで結び付けたい場合があります。ほとんどのインレットは、(cycle‾の左のインレットのように)floatかシグナルのどちらかを受取り、うまく2つを結合することができません。例えば、cycle‾は左のインレットでシグナルを受け取っている間、同じインレットに入ってくるfloatを無視します。

cycle‾は、左のインレットにシグナルが繋がれている時、その引数やfloatの入力を無視します

数値によるMaxメッセージ(intまたはfloat)をシグナルと組み合わせる1つの方法は、sig‾オブジェクトによって数値を定常シグナルに変換することです。sig‾の出力は、インレットで受信した値によって決められる定数値のシグナルになります。

sig‾はfloatをシグナルに変換するので、他のシグナルと結び付けることができます

実例パッチで、Oscillator Bは、定数の周波数(sig‾にfloatとして与えられる)を変化している周波数のオフセット(付加的な信号値)と組み合わせます。この2つのシグナルの合計は、どの瞬間においても、オシレータの周波数となります。

波形の位相(フェイズ)の変更

ほとんどの場合、単独のオーディオ波の位相(フェイズ)のオフセットは、知覚に実質的な効果を及ぼしません。例えば、サイン波とコサイン波は、理論的には1/4サイクルの位相差があるにも関わらず、可聴域で全く同じように聞こえます。そのため、これまでcycle‾の右端の位相インレットには関心を持ちませんでした。

サイン波の位相を1/4サイクル移動したものは、コサイン波になります

しかし、波の位相(フェイズ)オフセットをコントロールすることには、非常に有用ないくつかの理由があります。例えば、cycle‾の周波数は0のままで、連続してその位相オフセットを増やすことによって、その瞬間の値を(まるでそれが正の周波数を持つように)変更することができます。サイン波の位相オフセットは、たいてい「度」(360度で1サイクル)またはラジアン(2πラジアンで1サイクル)で表されます。cycle‾オブジェクトはサイクルの値で位相を表します;πラジアンのオフセットは1/2サイクル、または0.5になります。言い換えると、位相が0から2πまで変化する時、波形のサイクルは0から1まで変化します。この位相の表し方は、共通のシグナル範囲として、0から1を使えるので扱いやすい方法です。これらのことから、静止した(0Hz)cycle‾の位相オフセットを1秒間で0から1まで連続して変化させると、1Hzのコサイン波が出力されることになります。

出力結果は1Hzのコサイン波になります

なお、このことはphasor‾オブジェクトの名前の由来を教えてくれます。それは、phasor‾が0から1までの進行をくり返すので、cycle‾オブジェクトの位相を連続的に変更するのに理想的な適合性を持っているということです。もし、phasor‾が0Hzのcycle‾のインレットに接続されると、phasor‾の周波数はcycle‾の波形が動く速度を決め、cycle‾の事実上の振動数を決定することになります。

0Hzのcycle‾の事実上の周波数はphasor‾の値と等しくなります

しかし、チュートリアルパッチによって示される重要な点は、位相インレットを利用すると、好きな速さでcycle‾の波形の512のサンプルを読み通すことができるということです。(事実、cycle‾の内容は、0と1の範囲にあるどんな値ででも自由にスキャンすることができます。)この場合、line‾は10秒の間に.75から1.75までcycle‾の位相を変更するために利用されています。

結果は、サイン波の1サイクルになります。サイン波は、振幅を8倍にするために”depth”を係数としてスケールされます。このサブオーディオ正弦波(ゆっくり0から8まで増加し-8まで減少して0に戻る)は、オシレータBの周波数に加算されます。それによってオシレータBの周波数は非常にゆっくり1008Hzと992Hzの間を揺れ動きます。

*ウィンドウの左下にあるメッセージボックスをクリックして下さい。そして10秒間にわたってビート周波数が、0Hzから8Hzヘ(オシレータBが1008Hzに近づく)、0Hzに戻る、また8Hzヘ(オシレータBが992Hzに近付く)、そして0Hzに戻る、というふうにサイン波状に変化することに注意して下さい。

異なるシグナルの受信

チュートリアルパッチの残りの部分は、単にreceive‾オブジェクトへのsetメッセージの使用を示すためにあります。これは、ネットワークでシグナルの流れを変えるもう一つの方法です。setでreceive‾オブジェクトの名前を変更することができ、それによってreceive‾が異なるsend‾オブジェクト(または複数のオブジェクト)から、その入力を得るようになります。

receive‾に新しい名前を与えると、入力元が変わります

* set sawtoothと書かれているメッセージボックスをクリックして下さい。接続された両方のreceive‾オブジェクトは、ウィンドウの右下隅のphasor‾からシグナルを得ます。もう一度サイン波の音を受信するために、set outLそして、set outRと書かれているメッセージボックスをクリックして下さい。ezdac‾をクリックしてオーディオをオフにして下さい。

まとめ

MSPオブジェクトsend‾、receive‾を利用して、パッチコードなしでシグナルの接続をすることができます。これは、Maxオブジェクトsend、receiveと類似しています。setメッセージはreceive‾オブジェクトの名前を変更するために利用でき、これによって異なるsend‾オブジェクト(または複数のオブジェクト)から入力を受け取るようにスイッチできます。MSPオブジェクトgate‾を利用して、シグナルの流れを違う行き先に送ったり、完全に閉じることができます。これは、Maxオブジェクトgateと同じ働きをします。

cycle‾オブジェクトは、周期的なオーディオ波のためだけでなく、サブオーディオの制御関数として利用することもできます:cycle‾オブジェクトの周波数を0Hzに保って、0から1まで連続してその位相を変更することで、好きな速さでcycle‾の波形を読み通すことができます。line‾オブジェクトは、この方法でcycle‾波形の位相を変更するのに適しています。phasor‾もまた、0から1までの値を繰り返して出力するので、使用するのに適しています。

sig‾オブジェクトは、数値を定数シグナルに変換します。;sig‾はインレットで数値を受信し、その値のシグナルを出力します。これは、変化しているシグナルに定数を加算するのに役立ちます。わずかに異なる周波数をもつ音をミックスすると、波の間で干渉を引き起こし、それによって、ビート(うなり)、及び、他の音色的の効果を作ることができます。

<-前の章 次の章->

目次へ