チュートリアル 22:
等式の設計

イントロダクション

このチュートリアルでは、等式の作成について学びます。これは、入力される値を使って、式を評価する数学的なステートメント(文)のことを指します。Max における等式のキーポイントとなるものは expr オブジェクトです。このオブジェクトは、豊富な数学関数と、複雑なステートメントを作成するための「あなた自身で書く」メカニズムを提供します。

ここまで、やや複雑な数学的プロセスを個別の演算オブジェクト(+、*、など)を使って処理してきました。しかし、多くの場合、多くのオブジェクトを1つの数式にまとめることができます。これにより、不必要なパッチの複雑さを取り除くことができます。この簡略化に使用されるツールが exprオブジェクトです。このオブジェクトは、複数の入力を受け取り、非常に複雑な結果をもたらすことができる数式を作るために、特別なシンタックス(構文)を用います。

描画パッチの概観

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

チュートリアルパッチを眺めて、ここで扱う処理がどのようなものかを見て下さい。このパッチは4つのロジックの部分とlcd オブジェクトに分かれています。それぞれの部分の間のコミュニケーションは、value オブジェクト、および send オブジェクトと receive オブジェクト組み合わせを使って行なわれています。パッチの左下にある metro を、toggle ボックスを使ってオンにして下さい。その後、スペースバーを押してパッチの上部のイベントをトリガして、パッチの動作を見て下さい。結果として表示されるものは、小さな落書きのような描画から、大型の抽象的な線と円による描画まで
様々に変化するでしょう。スペースバーを押すごとにlcd がクリアされ、新しく同じような描画の実行が開始されます。

パッチの上部にあるコメントボックスは、3行の等式を示しています。

x = sin(A * y) - z*cos(B * x);
y = z * sin(C * x) - cos(D * y);
z = E * sin(x);

これらの式は、3つの値(x、y、z)を計算するものです。この3つの値は、x、y、z、の1つ前の状態と、5つの定数(A、B、C、D、E)にシンプルな三角関数を適用することによって計算されています。これを lcd オブジェクト上にプロットすると(z の値は、円のサイズの変化として視覚化されています)、多種多様なパターンが生成されるようすを見ることができます。この式は、ストレンジアトラクタと呼ばれるものを生成します。これは、実際には、関数を繰り返し適用するもので、等式の1つ前の出力と5つの変数(係数といいます)を結びつけ、カオスとしての振る舞いを示す様々な図形を生成します。

パッチのそれぞれのセクションを調べてみましょう。左下のセクションは、明らかにこの描画を実行するキーポイントとなるものです。ここでは、metro にbang メッセージを生成させ、これをcompute と drawreceive というオブジェクトに送信しています。同時に、この bang メッセージをサブパッチにも送信して、描画色を徐々に変化させています(詳しくは後述します)。サブパッチが評価されると、パッチの compute セクション(パッチの中段)は bang を受信します。compute セクションでは、多くの value オブジェクトをトリガし、その出力を expr オブジェクトの中でコード化されている等式に送信します。これにより、次回の描画のために等式が更新されます。これらの等式は描画に用いる x、y、z の値を更新します。どのようにしてexpr オブジェクトが一瞬で計算を行なうのかを調べてみましょう。

draw という名前を付けられた send オブジェクトは、パッチの右上にある描画ルーチンに bang メッセージを送信します。これにより、新しく計算された x、y、z の値がトリガされ、scale オブジェクトによってスケールされます。この値は pack オブジェクトによってコマンドメッセージにまとめられ、send オブジェクトを介して lcd に接続された receive オブジェクトに送られます。これは lcd の入力を行なうショートカットのような働きを持っていて、先ほど生成された描画コマンドを実行させます。

最後に、パッチの左上のセクションはスペースバーが押された場合の動作をコントロールします。これは、Max でイベントが「右から左へ」実行される良い例です。key オブジェクトが 32を出力(これはスペースバーが押されたことを意味します)すると、button オブジェクトを使って bang メッセージが生成されます。これは、7つのアクションを右から左の順で次々と実行します。5つの 乱数(E から Aまで)が生成され、-4.0 から 4.0 の範囲にスケールされます。cleare メッセージが lcd オブジェクトに送信され、x、y、z という名前のそれぞれの value オブジェクトの中の値がリセットされます。実際には、スペースバーはこのパッチすべてに対する「リセット」キーの働きを持っていて、事実、このキーが押されるとパッチのすべての部分に対して影響を与えます。

数式の作成のための expr の使用

それでは、expr オブジェクト自身の内容を見てみましょう。これは複雑に見えますが、それぞれの expr オブジェクトのアーギュメントは比較的簡単な等式になっています。これを理解するための重要な点は、$ が単に入力されるメッセージを参照しているもので、メッセージ型とインレットナンバーが $ と共に指定されるということです。そのため、例えば参照名 $f1 を使った場合、等式は入力されるデータ($)を使用する必要があり、そのデータは浮動小数点数で(f)、ナンバー1(1)のインレットで受信したものでなければならないということを意味します。この等式の「複雑さ」が、単に入力されるメッセージへの参照であるということをを理解してしまうと、expr の持つ式のフォーマットは多少わかりやすくなるでしょう。

訳注:この場合、インレットナンバーが 0 からではなく、1からスタートする点に注意して下さい。左端のインレットナンバーは 1 になります。

この expr ステートメントで使われている算法は、sin(サイン関数)、cos(コサイン関数)、そして * (乗算)という関数だけです。しかし、expr では何十もの算法を利用することができます。通常の数学演算子(+、-、*、/)、論理演算子(&&、||)、ビット演算子(&、|)、その他にも、abs、sin、cos、pow などのようなC言語の数学関数を使うことができます。ドキュメントでは、利用できる関数を網羅したリストを提供しています。

このチュートリアルパッチの場合、3つの expr オブジェクトは、8個のそれぞれ異なった変数を用い、3つのターゲットの値を作ります。ここでは、興味深いフィードバックが行なわれています。ターゲットの値は描画ルーチンで用いられるだけではなく、「次の回の描画」の計算にも用いられます。A から E までの5つの変数は、スペースバーが押された場合にだけ変更されます。そのため、これらの値は、描画ルーチンの「アンカー」(定数)としての機能を持ち、毎回変化する x、y、z という変数によって個々の直線と円の描画が決定されます。これは、1回の計算ごとに行なわれます。

独自の等式の追加

この描画をもう少し面白くするために、いくつかクリエイティブな等式を作成し、これを使って徐々に変化する描画色を作ってみましょう。ここでは、metro からの bang ごとに更新される x、y、z というvalue オブジェクトを利用します。

パッチの下部にある changecolor と書かれた patcher オブジェクトをダブルクリックして下さい。lcd の描画色が3つの drunk オブジェクトによって帰られているようすを見ることができます。3つの drunk オブジェクトからの値は frgb メッセージとしてまとめられ、lcd に送信されています。ここでは、expr オブジェクトを使って exp 数学関数(e の x乗)を計算しましょう。e (ネイピア数)の性質を熟知していなくても大丈夫です。e が自然対数で、入力値が増加するとこの値が急速に増加することがわかっていれば十分です。

drunk オブジェクト自身を削除するか、drunk オブジェクトへの inlet からの接続と pack オブジェクトへの接続を削除して drunk オブジェクトを邪魔にならない所へ移動させて下さい。新しい3つの value オブジェクトを作り、それぞれのアーギュメントを x、y、z にして、インレットに inlet オブジェクトを接続して下さい。

ここで、新しいオブジェクトを作り、次のように入力して下さい。
expr int(exp($f1)*5.)
アーギュメントになっている等式を、よく調べてみると、入力される浮動小数点数($f1)に対し、exp 関数を使って新しい値を作り(exp($f1))、その値に 5.0 を掛け(*5.)、その後これを整数に変換(int)していることがわかります。この結果は、ほぼ色を表す値(0 - 255)の範囲に収まる数値になりますが、主としてこの範囲の中の低い値になります。この expr オブジェクトを2回コピーして、3つの value オブジェクト(x、y、z)の出力をそれぞれの expr オブジェクトに接続して下さい。expr オブジェクトの出力を pack オブジェクトに接続し、どのような変化が起きるかを見て下さい。

metro をスタートさせ、lcd をクリアすると、カラーでの描画が行なわれますが、全体としてより暗い色になる傾向があることがわかるでしょう。色は計算された x、y、z 座標の影響を受けるため、描画ウィンドウの端に行くほど、より色が明るくなる傾向があります。これは、従来からの、オブジェクトを組み合わせたプログラミング手法を使って行なうことが難しく、expr を使うと非常に簡単に行なうことができる描画コマンドの計算の例です。

結び

expr オブジェクトを使うと、大きなオブジェクトプログラミング領域を使用せずに、複雑な数式や論理式を作ることができるようになります。複数の入力を定義し、その入力を使って膨大な数の演算を実行することにより、それなしには実現が難しいような面白い結果を導くことができます。

参照

expr C言語スタイルの数式の評価