チュートリアル 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 以外にも、floatforwardgrabifintmessage などのオブジェクトから 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つの波は異なった周波数を持つため、お互いの位相は常に同じではありません。そのため、ある所ではちょうど位相がそろって正の方向に加算されますが、他の所では、ある程度お互いを打ち消し合うように負の方向に加算されます。2つの波は、周波数の差に等しい割合で、厳密に互いに同じ位相になります。たとえば、1000Hzと1002Hzのサイン波では、1秒間に2回同じ位相になります。この場合、2つの波の周波数は十分に近いため、2つの別々の音としては聞こえません。その代わり、2つの波が足しあわされる所と打ち消しあう所のくり返しのパターンは、2Hzのサブオーディオ周波数(可聴域以下の周波数)で発生しているうなり(ビート)として聞こえます。この周波数は「差音周波数」または「ビート周波数」と呼ばれています。

サンプルパッチが開かれたとき、loadbang オブジェクトは cycle~ オブジェクトに周波数の初期値(1000Hzと1002Hz)を送ります。そのため、これらの2つの音を同時に鳴らすと 2Hzのビート周波数が生じることが予想されます。loadbang オブジェクトは、gate~ オブジェクトにも(途中、umenuを経由して)初期値を送り、1つの音は左オーディオ出力へ、もう1つの音は右オーディオ出力へ送るように設定しています。


2つの波は2Hzの速さで干渉を起こします

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

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

振幅と相対振幅

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


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

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


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

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

dB = 20(log10(A/Aref))

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

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


サブパッチAtodBの内容

sliderから受信する振幅の値は常に1以下であるため、AtodBの出力は常に0dB以下になります。振幅を半分にすると、およそ6dBの減少します。


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

sliderのつまみの位置を変更して、線形に表された振幅の表示と対数関数的に表されたデシベル単位の表示を比較してみて下さい。

定数シグナル値:sig~

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

しかし、変化する値と定数をMSPオブジェクトの同じインレットで組み合わせて使用したい場合もあります。ほとんどのインレットは、(cycle~ の左のインレットのように)float かシグナルのどちらか一方を受け取り、2つを同時に使用することはできません。例えば、cycle~ は左のインレットでシグナルを受け取っている間、同じインレットに入力される float を無視します。


cycle~は、左のインレットにシグナルが接続されているとき、そのアーギュメントやfloatの入力を無視します

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


sig~はfloatをシグナルに変換するため、他のシグナルと組み合わせて使用することができます

サンプルパッチで、Oscillator Bは、定数の周波数(sig~ にfloatとして与えられます)を変化している周波数のオフセット(もう1つのシグナルの値)と加算しています。この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の範囲にある任意の値によって自由にスキャンすることができます)。チュートリアルパッチでは、cycle~ の位相を 10秒間で 0.75から1.75まで変化させるために line~ が使われています。

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

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

様々なシグナルの受信

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



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

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

まとめ

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

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

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

参照

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