チュートリアル 4:基礎
シグナルのルーティング

リモートシグナル接続:send~ receive~

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

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



Maxメッセージのための
sendreceive:シグナルのための send~ receive~

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

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

  1. sendreceive の名前は、sr に短縮することができます。send~、と receive~ の名前は短縮することができません。
  2. Maxメッセージは、send 以外にも、floatforwardgrabifint、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のサブオーディオ周波数(可聴域以下の周波数)で発生しているビート(うなり)として聞こえます。この周波数は「差音周波数」または「ビート(うなり)周波数」として知られています。

サンプルパッチが開かれたとき、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 メッセージの使用法を示すためにあります。これは、ネットワークでシグナルの流れを変えるもう一つの方法です。setreceive~オブジェクトの名前を変更することができ、それによって receive~ が異なる send~ オブジェクト(または複数のオブジェクト)から、その入力を得るようになります。



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

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

まとめ

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

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

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

参照

gate~ いくつかのアウトレットのうちの1つへシグナルを送信
receive~ パッチコードなしでシグナルを受信
send~ パッチコードなしでシグナルを送信
sig~ 数値による定数シグナルの生成