チュートリアル 6:
簡単な演算

演算の実行

チュートリアルを開いて下さい。

このチュートリアルでは、Maxオブジェクトで行なうことができる基本的な数値演算操作や、いくつかのオブジェクトを演算チェインとして接続する処理について説明します。また、複数のインレットを持つオブジェクトに共通した操作や、数値変換で生じるいくつかの問題点についても述べています。

加算や乗算などの一般的な演算操作は、入力されるデータに対してパッチで役に立つような範囲や形式に変換する操作を行なう上で重要です。加えて、整数と浮動小数点数の間の違いをうまく処理することは、MIDI、オーディオ、シリアル情報などの様々なデータ型を扱う場合には重大な問題です。

誰もが数学好き

06mSimpleMath.maxpat というチュートリアルファイルを見て下さい。上の行のパッチでは、Max で行なうことができる簡単な数値演算の様々な例を示しています。左端のパッチでは +(加算)オブジェクトを使って加算を行なっています。+ オブジェクトは、Maxにあるほとんどの数学オブジェクトと同様、2つのインレットを持っています。これはそれぞれオペランドになります。右インレットに入力された数値は格納され、左インレットに入力される数値に加算されます。右インレットに全く入力が行なわれていない場合、右オペランドにはオブジェクトのアーギュメントが設定されます。アーギュメントがない場合、右オペランドにはデフォルトの値 0 が設定されます。

2 という数値を持ったメッセージボックス(左側)をクリックすると、その結果(接続されたナンバーボックスに表示されます)はすでに述べたように 2 になります。右インレットではまだ数値を受け取っていないため、格納されているオペランドが 0 のままだからです。3 という数値を持ったメッセージボックスをクリックしても何も出力されません。しかし、数値 3 は新しい右オペランドとして格納されます。もう一度 2 をクリックすると、加算の結果 5 がナンバーボックスに表示されます。

次のパッチでは、+ オブジェクトのアーギュメントを使って右オペランドの初期値を設定しています。そのため、+ オブジェクトに(上のナンバーボックスを使って)数値を入力すると、右インレットに何も入力しなくても加算の結果を見ることができます。定数を使った数値演算を実行する必要がある多くの場合では、数値演算用にデフォルトのアーギュメントを使用することが一般的です。

次は -(減算)と *(乗算)オブジェクトです。これらは、それぞれ減算と加算を実行します。+ オブジェクトと同様、これらにはデフォルトのオペランド 0 が設定されています。そして、右インレットで格納する値を受信し、左インレットに入力された値によって結果が出力されます。除算(/)とモジュロ(%)演算も同様です、しかし1つだけ異なる点があります。厄介な「ゼロ除算」によるエラーを防ぐために、右オペランドのデフォルト値は 0 ではなく 1 に設定されています。

インレット、ホットとコールド

最初の演算オブジェクト群で見てきたように、オブジェクトにはメッセージを出力させるインレットと、単にオブジェクトに値を格納するだけのインレットがあります。実際には、どのインレットにメッセージを送信した場合でも、その値はオブジェクトに格納されます。違いは、左端のインレットに入力される値には、潜在的にbang メッセージの機能があるということです。これが、値の受信と格納が終わった後、強制的に演算オブジェクトに計算結果を出力させています。演算オブジェクトに bang オブジェクトを接続し、bang オブジェクトを使って明確に出力を強制することで、この動作を見ることができます。

2行目の最初のパッチはシンプルな加算パッチですが、左インレットに button が接続されています。+ オブジェクトに数値を送信すると、期待どおりの結果になります。右インレットに送られた数値は格納され、右オペランドとして使用されるのに対し、左インレットに送られた数値は左オペランドとして使用され、オブジェクトにその結果を出力させます。button をクリックしても、結果が出力されます。その時点でセットされているオペランドによって加算が実行され、その結果が出力されるのです。これは、右オペランドを変更し、左オペランドの再送信を行なわずに値を出力したい場合に役に立ちます。また、オブジェクトに対して「実行せよ」と命令するbang メッセージの機能が実行されている良い例であると言えます。

多くの場合、オブジェクトにメッセージを出力させる働きを持つインレットはホットインレットと呼ばれ、情報を格納するだけのインレットはコールドインレットと呼ばれます。コールドインレットに入力を行なう必要がある場合に、bang メッセージを(button あるいは trigger オブジェクトによって)左端のインレットに送って、出力を強制する方法はよく用いられます。

アーギュメントによる型変換

次の2つのパッチは、+ オブジェクトを使った同じ演算のように見えます。2つとも数値2.5(未日インレット)と12.75(左インレット)を加算しようとしています。この2つを試してみて下さい(最初に右のメッセージをクリックして、右オペランドをセットする必要があることを思い出して下さい)。

12.75 と 2.5 を加えた結果は 15.25 になるはずです。しかし、2つの + オブジェクトのうち、右側のものだけが正しい結果を示し、左側のものは14を出力します。これはなぜでしょうか?

多くのプログラミング言語と同様に、Max には異なった数値データ型があり、データの演算は整数演算、または浮動小数点演算によって行なわれます。Maxの場合、数値演算を行なうすべてのオブジェクトは、デフォルトでは整数による演算を行ないます。「整数モード」の演算オブジェクトで浮動小数点数を受信した場合、その値は使用前に整数に丸められます。そのため、12.75は 12 に、そして 2.5 は2 に変化され、これが加算されて 14 になってしまったわけです。数値演算オブジェクトが浮動小数点演算を使用するように設定するには、浮動小数点でアーギュメントを与えておく必要があります。右側のパッチではこれを行なっています。浮動小数点演算を行なって欲しいことを + オブジェクトに伝えるために、+ オブジェクトに 0. というアーギュメントを与えています。そのため、加算の結果は、期待した通りの15.25 という値になっています。

演算の強制

2行目の最後の2つのパッチは、+ オブジェクトからの出力を、どちらのインレットでメッセージを受信したかに関わらずトリガするための簡単なメカニズムを示すものです。左インレットには直接ナンバーボックスから値が送られます。左インレットはもともとホットであるため、それ以上の注意を払う必要はありません。しかし、右インレットへの入力でも値を出力するためには、右インレットが入力を受信した後で左インレットに bang を送信しなければなりません。これは trigger オブジェクトの応用として申し分のないものです。trigger オブジェクトはこのような機能を管理するために使われます。2つの場合とも、trigger(t という省略形が用いられています)オブジェクトは2つのアウトレット(アーギュメントによって定義されています)を持っています。右アウトレットは型指定(整数は i 、浮動小数点数は f)され、左アウトレット(b)は bang を送信します。数値がオブジェクトに入力されると、trigger はアーギュメントを右から左の順で処理するため、最初に + オブジェクトの右インレットに数値(整数、または浮動小数点数)を送信します。その後 + の左インレットに bang が送信され、強制的に演算が行なわれて、その結果の値が下のナンバーボックスに送信されます。このように、+ オブジェクトの両方のインレットが「ホット」であるかのような動作を行なわせ、どちらのインレットにメッセージが送られたかに関わらず出力を得ることができます。

コールドインレットを使った再帰処理

チュートリアルファイルの下の部分には、+ オブジェクトの結果を自分自身にフィードバックしている小さい奇妙なパッチがあります。最も上にあるナンバーボックスをクリックし、数値を入力し,その後さらに数値を入力して、どのようなことが起きるかを見て下さい(ナンバーボックスをドラッグして値をスクロールさせることもできます)。数値を入力するにしたがって、その結果が累積されていきます。このケースでは、+ のコールド(右)インレットを利用して、一つ前の演算の出力によって右オペランドを変化させています。結果は出力の累積計算になります。これは、入力された値の累計を計算し続ける便利な方法です。このような再帰計算はカウンタ、平滑化アルゴリズム、あるいはシステムの動作がその前のシステムの出力に依存するような処理を作る場合に便利です。

演算オブジェクトの連鎖

ここまで見てきたような例は非常にシンプルなもので、シンプルな結果をもたらすシンプル数値演算でした。しかし、より複雑な方程式を作るために、これらの演算をいくつか繋げて使用することができます。例えば、温度の変換を行う Max パッチ、具体的には華氏を摂氏に変換するパッチを作りたかったとしましょう。この変換の式は次のようになります。

C = (F - 32) * (5 / 9)

オブジェクトの立場から見れば、次のような形の方がより簡単かもしれません。

C = (((F - 32) * 5) / 9)

この出力は - 、* 、/ という3つのオブジェクトを繋げたものを使用することによって計算できます。パッチをアンロックし、ナンバーボックスを使って華氏の値の入力部分を作って下さい。これに、デフォルトの右オペランドの値32 をアーギュメントに持つ - オブジェクトを接続して下さい。- オブジェクトの出力にアーギュメント 5 を持つ * オブジェクトを接続し、これをアーギュメント 9 の / オブジェクトに接続して下さい。最後に / オブジェクトの出力を他のナンバーボックスに接続して、華氏から摂氏に変換した結果を見ることができるようにして下さい。

結び

数値演算オブジェクトは、単独で、あるいは連続させて使用することによって、数値による入力を様々な方法で操作するために必要なツールを提供します。演算オブジェクトにはホットインレットとコールドインレットがありますが、簡単なパッチ操作を行なうことによって、コールドインレットへの入力で値の出力を強制することも可能です。演算オブジェクトは、デフォルトでは、整数演算によって処理を実行します。浮動小数点数をアーギュメントとして与え、オブジェクトに対して実数による演算を行なうよう命じることができます。

参照

+ 演算子(加算)
- 演算子(減算)
* 演算子(乗算)
/ 演算子(除算)
trigger 入力された値を多くの場所へ、右から左の順序で送信します。