チュートリアル 9:
マウスによる描画

イントロダクション

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

これまでのチュートリアルでは、Max でパッチを作るときにいつも使用するようなオブジェクト群について見てきました。このチュートリアルではこれらのオブジェクト(および、いくつかの他のオブジェクト)を使って、実際に何か(この例では描画処理を取り上げます)をコントロールしてみましょう。ここでは、ルーティング(メッセージの行き先のコントロール)によってメッセージを操作する方法(gate オブジェクトを使います)や、リストの操作(pack オブジェクトと unpack オブジェクトを使います)について見ていきます。また、マウスのステート(状態)の問い合わせを行ない、それによってパッチの動作を変更することや、個別のオブジェクトに関する情報を取得し、オブジェクトやパッチコードのアピアランスを変更する方法についてより詳しく学びます。このような新しいオブジェクトやテクニックを用いて lcd オブジェクトをコントロールします。lcd オブジェクトは、Max の中でシンプルな 2D グラフィックスの描画を可能にするオブジェクトです。

Max の最もパワフルな特徴の1つは、特定の機能を持った小さい部分的なプログラムを作ることができ、メッセージを大きなパッチの中の適切な部分に送ることができる能力を持っているということです。パッチ内のルーティングはこの能力のキーポイントになるもので、gate オブジェクトは非常に柔軟な方法でこの機能を提供します。このオブジェクトはまた、パッチの実行中に複雑なメッセージを構築する場合にも役立ちます。このため、複雑なパッチの処理を比較的容易にコントロールすることができます。

pack および unpack オブジェクトはリストメッセージを作成する場合や、リストメッセージを別々の要素に分解する場合に使用します。リストは、より複雑なメッセージを必要とするオブジェクトを使用する場合に重要なものです。そして、多くの場合、小さな要素(例えば、整数、浮動小数点数など)からリストを構成したり、リストを小さな要素に分解したりすることが必要になります。

最後に、オブジェクトメッセージからより多くの情報を得ることについて深く掘り下げます。同時に、パッチコードの色分けや、操作の方法について学びます。パッチを共有する場合、他人のパッチの機能を理解したり、パッチをより見やすいものにしたりするために、視覚的な手がかりが役に立ちます。

より多くの情報の取得

チュートリアルパッチがどのような処理を行なうのかを見る前に、少し視点を変えて、パッチの中のオブジェクトに関する情報を取得する方法のいくつかをみておきましょう。パッチをアンロックして、パッチの中のオブジェクトのまわりにマウスを移動させて下さい。マウスをオブジェクトのインレットやアウトレットの上に置いたときに、そのインレットやアウトレットの使い方に関する情報が書かれた小さなボックスが表示されることに気がついたと思います。このアシスタンステキストは、プログラマに対し、そのインレットやアウトレットがオブジェクトでどのような働きをするかということを思い出させるために提供されます。また、インレットやアウトレットを囲むように小さい円が表示されることにも気がついたでしょう。

この円が表示されているときにインレットをクリックすると、コンテキストメニューが表示されます。このコンテキストメニューには、サポートする入力メッセージがすべて示され、同時に、オブジェクトのヘルプファイルやリファレンスページを見るためのショートカットや、ファイルブラウザを使って合致する関連事項をシステム内で検索するためのショートカットも表示されます。これは、オブジェクトの正確な使用法について詳しく知る必要がある場合に、非常に深いレベルで詳細な内容を提供するものです。

もう1つ、作業をしながら情報を得る方法があります。それはクルー(clue)ウィンドウです。Max の Window メニューから Clue Window を選んで下さい。小さなウィンドウが表示されます。こうすると、マウスをオブジェクトの上に置いたときに、そのオブジェクトの機能についての簡単な説明が表示されるようになります。さらに、コンテキストメニューが表示されている場合、マウスをコンテキストメニューの項目の上に置くと、そのメッセージがオブジェクトにどのような影響をもたらすかについての手がかりが簡潔に表示されます。より複雑なパッチの中で使用するオブジェクトを判断する場合に、クルーウィンドウを使ってオブジェクトの使い方を見る方法は非常に便利です。

さらにオブジェクトとパッチコードについて

チュートリアルパッチのオブジェクトを見ると、パッチコードが今まで見てきたものと少し違うことに気がつきます。まず第1に、多くのパッチコードが直角に曲がったセグメント(線分)でできています。加えて、異なった色で表示されているものがいくつかあります。パッチコードそれ自身を操作する方法のいくつかを見てみましょう。Max の Options メニューで Segmented Patch Cords をチェックして下さい。これにより、直角に曲がったパッチコードを作ることができます。パッチコードを選択して [Delete] キーを押すと、パッチコードを削除することができます。パッチの左上で メッセージボックスとgate オブジェクトを接続しているパッチコードの1つを削除して下さい。

メッセージボックスを、もう一度 gate に接続してください。ただし、2つのオブジェクトを直接接続するのではなく、セグメント化されたパッチコードによって接続します。メッセージボックスのアウトレットをクリックし、マウスボタンを放して下さい。パッチコードを描画する際にパッチ内の任意の場所でクリックすると、セグメントを追加することができます。接続先のオブジェクト(gate オブジェクト)のインレットをクリックすると接続が完了します。直線のパッチコードとセグメント化されたパッチコードのどちらを使用するかは、個人的なプログラミングスタイルの問題である場合が多いのですが、セグメント化されたパッチコードを使用することで、パッチを見やすくすることができる場合もあります。

Max はまた、パッチコードの整理を助ける機能も持っています。パッチコードをクリックして、Mac では [Command] + Y、PC では [Control] + Y を押してください(あるいは、Max のArrange メニューから Align を選ぶ方法もあります)。Max はパッチコードがオブジェクトに重ならないように、セグメント化して繋ぎ変えを行ないます。[Shift] キーを押しながらパッチコードをクリックして、複数のパッチコードを選択し、[Command] + Y をおして選択したパッチコードをすべて繋ぎかえることも可能です。通常のパッチコードでも、セグメント化されたパッチコードでも、メッセージがオブジェクト間でやり取りされる方法に全く違いはありません。

最後に、Max が持っている、オブジェクトとパッチコードの色を変更する能力について見てみましょう。オブジェクトやパッチコードを(クリックして)選択し、Object メニューから Color を選ぶと、カラーピッカーダイアログが表示されます。これを使ってオブジェクトやパッチコードの色を選ぶことができます。色を選んでパッチエディタに戻ると、オブジェクトやパッチコードは新しく選ばれた色になっています。チュートリアルでは、この機能を紹介するためにオブジェクトをグリーンにしてあります。チュートリアルでわかるように、この機能はパッチの中の重要な部分に注意を促すために非常に役立ちます。

gate オブジェクトの使用

それでは、このパッチがどのような動作をするのかを見てみましょう。このチュートリアルパッチには2つの小さなパッチ(左側)と、1つの非常に大きなパッチがあることがわかります。左上のパッチから始めましょう。

このパッチは gate オブジェクトの動作を示すものです。gate オブジェクトは、Max で動的にメッセージのルーティングを行なう際に使用される、最も重要なオブジェクトの1つです。まず、1 と書かれたメッセージボックス(中央のメッセージボックス)をクリックし、その後、gate の右インレットに接続されているナンバーボックスの値を変更して下さい。このとき、ナンバーボックスの値がgate の左アウトレット(アウトレット 1)から送信されるのがわかります。2 と書かれたメッセージボックスをクリックしてから、再びナンバーボックスを変更すると、変更された値が gate の右アウトレット(アウトレット 2 )から出力されるのがわかります。

このように、左インレットに送信された数値によって、右インレットで受信したメッセージのルートが決定されます。つまり、左インレットがどのアウトレットを開くかを決定しています。それでは、0 と書かれたメッセージボックスをクリックして、右側のナンバーボックスの値を変更して下さい。gate からメッセージは出力されません。0 メッセージはすべてのアウトレットを閉じる働きを持っています。これは、パッチの中でメッセージが送信されないようにしたい場合、例えばパッチのある部分から他の部分への数値の流れを選択的に有効にしたり、無効にしたりする必要がある場合に役に立ちます。

練習のために、gate オブジェクトのアーギュメントを 4 にしてみて下さい(この時点では 2 というアーギュメントを持っています)。すると、オブジェクトが変化することがわかります(アウトレットを4つ持つようになります)。gate のアーギュメントはオブジェクトが持つアウトレットの数を決定します。左インレットにいくつかメッセージを追加し(gate の新しいアウトレットをサポートするためには、3 や 4 というメッセージを追加します)、新しいアウトレットにナンバーボックスを接続すると、gate オブジェクトがサポートするルートの選択肢を容易に拡張できることがわかります。

pack、unpack、prepend

パッチの次の部分は gate のすぐ下にあります。このパッチでは unpack および pack オブジェクトを使って、数値のリストを分解し、再構成しています。さらに、prepend オブジェクトを使って、リストの先頭にメッセージセレクタ(シンボル)を追加しています。2つのメッセージボックスはそれぞれ2つの数値のリストを持っています。このメッセージボックスをクリックすると、unpack オブジェクトに接続された2つのナンバーボックスには、リストの数値が個々に表示されます。unpack オブジェクトは、入力されたリストを個々の数値メッセージに分解します。多くの場合、リストは複雑なメッセージの作成に使用されます。そのため、unpack オブジェクトを使って、リストを個々の要素(これを atom と呼びます)に分解することも頻繁に行なわれます。

ナンバーボックスが数値メッセージを表示した後、メッセージはその下の pack オブジェクトに送信されます。ここでは、先ほどと逆の処理が行なわれ、数値メッセージが再びリストにまとめられて prepend オブジェクトに送信され、(print オブジェクトを経て)Max ウィンドウに表示されます。
pack オブジェクトが2つのメッセージ(それぞれのナンバーボックスから送信されたものです)を受け取っているにもかかわらず、Max ウィンドウには1つのメッセージしか表示されない点に注目して下さい。これは、pack オブジェクトが(他のほとんどの Max オブジェクトと同様に)左端のインレットでメッセージを受信した場合にのみメッセージを出力するためです。パッチ編集環境は、次のようなヒントを与えてくれます。そのヒントとは、パッチをアンロックして右インレットにマウスカーソルを置いたときに、そのインレットがコールド(メッセージを出力しない)であることを示すために青い円が表示されるというものです。マウスを左インレットの上に置くと、赤い円が表示されます。これは、インレットがホットであり、メッセージを受信したときにオブジェクトが出力を行なうことを示しています。unpack オブジェクトと pack オブジェクトの間にあるナンバーボックスに直接数値を入力することによって、これを確認することができます。左のナンバーボックスに入力を行なった場合にのみ、pack オブジェクトからリストが出力されます。

pack と unpack のアーギュメントは、それぞれ、オブジェクトが持つインレットとアウトレットの数、およびインレットに送ることができるメッセージの型を決定します。作成するリスト中に浮動小数点数が必要な場合には、0. (あるいは、任意の浮動小数点型の初期値)を使うことができます。同じように、リスト中にシンボル(語)が必要な場合には、文字 s(あるいは、任意のシンボル)を使用することができます。リスト内では、違う型を持つデータを混用することができ、データの型のマッチングが行なわれます。

prepend オブジェクトが、unpack から入力されるリストの前に thelist という語を置いている点に注目して下さい。このシンボルには任意の語を使用することができますが、Maxでは多くの場合、特定のメッセージセレクタを使用するオブジェクトにリストを送信する前に、prepend を使ってリストの先頭にメッセージセレクタを置くという使い方をします。

lcd オブジェクト

それでは、右側の大きいパッチにとりかかりましょう。toggle オブジェクトをクリックして1(チェックされた状態)にし、パッチの最も上にある metro オブジェクトをオンにして、このパッチの動作を見てみましょう。

パッチの中央にある大きな矩形のオブジェクトが lcd(Liquid Cristal Display:液晶ディスプレイの略です)オブジェクトです。このオブジェクトを使って、点(ピクセル)、線(ライン)、図形(シェイプ)、テキスト、およびその他のシンプルな2Dベクタグラフィックスを描画することができます。マウスボタンを押したまま、この中でマウスをドラッグすると、マウスは軌跡に沿って線を描画します。マウスボタンを放すと描画は停止します。

[Shift] キー、[Option] / [Alt] キー、あるいはこの2つを両方とも押し下げると、lcd オブジェクトはマウスの位置に、線ではなく、それぞれ異なった図形を描画します。lcd の上には、色がつけられた3つのメッセージボックスがあります。これを使って(frgb メッセージによって)描画の前景色(描画を行なう色)を変更することができます。さらに lcd にclearメッセージを送信する別のメッセージボックス(右側にあります)を使うと、スクリーンに描画したものを消去することができます。

このパッチの要となるセクションの1つは、[Shift] と [Option]/[Alt] キーを取り扱う部分です。この処理は modifiers オブジェクトを使って行なわれています。この modifiers オブジェクトは metro によってポーリングされ、その時点でのキーボード上の様々な修飾キーの状態を報告します。このケースでは、[Shift] キーと [Option]/[Alt] キーの状態を出力するアウトレットを使用します。具体的には、[Option] キーのステート(状態)に 2 を掛け、それに [Shift] キーのステートを加えています。
その結果、[Shift]キーだけが押された場合には 1、[Option]/[Alt] キーだけが押された場合には 2、2つとも押された場合には 3 という値を得ることができます。修飾キーが押されていない場合の値は、0 になります。このようなパッチの回路は、その下の gate オブジェクトのステートをコントロールするのに最適です。

lcd オブジェクトは、実際の描画スペースを提供することに加え、mousestate オブジェクトと良く似た方法でマウスの現在位置を出力してくれます。mousestateとの違いは、その値がパッチ内のlcd オブジェクトからの相対位置で与えられるという点だけです。lcd オブジェクトに idle 1 というメッセージを送ると、lcd の内部にあるマウスのボタンがクリックされているかどうかに関係なく、マウスの座標位置を取得することができます(このパッチでは、最も上にある toggle オブジェクトをオンにしたときに、idle を有効にしています)。

座標の値はlcd オブジェクトの2番目のアウトレットから出力されます。この値(LCD オブジェクト内の座標位置をX、Y で表した2つの数値によるリスト)はunpack オブジェクトによって別々に分けられた後、右下のナンバーボックスで見ることができます。

同時に、このリストはgate オブジェクトに右インレットに送信されます。そのためのパッチコードは、わかりやすいように赤色になっています。

このgate オブジェクトは、パッチの中のそれぞれ異なる領域にマウス座標をルーティングすることによって、lcd の中でどのような描画を行なうかをコントロールしています。修飾キーが何も押されていない場合には、gate は 0 を受信し、描画ルーチンは全く使用されませんが、その場合でも、lcd の中でマウスボタンを押しながらドラッグすると線を描くことができます。[Shift] キー、[Option]/[Alt] キー、あるいはその両方が押されている場合、gate はマウス位置をパッチ内の適切なセクションに送ります。

それぞれのセクションでは X、Y 座標を unpack オブジェクトに送り、個別の座標値を取得しています。この値は、正確な図形を作成するために用いられます。左側([Shift] キーの場合の処理)の場合には、X、Y それぞれの座標の値から10を減じたものと、それぞれの座標の値に 10 を加えたものを、順に pack オブジェクトに送信しています。

X-10 Y-10 X+10 Y+10

この4つの値によるリストは prepend に送られ、リストの前にシンボルが追加されます。lcdオブジェクトは、それぞれ異なった働きを持つ数多くの描画コマンドをサポートしています。ここでは、lcd に対して、framerect メッセージと4つのアーギュメントを送って、矩形のフレームを描画するよう指示しています。4つのアーギュメントは、描画しようとする矩形の左、上、右、下の境界の座標値を表します。

描画コードの他の2つの部分を見てみましょう。これらも同じ方法で動作していることがわかります。gate オブジェクトの中央アウトレット([Option]/[Alt] キーに対応)からの出力では、10 x 10 ピクセルのサイズで(+ オブジェクトと - オブジェクトに注意して下さい)長円形(訳注:実際には円形になります)のフレーム(frameoval メッセージ)を描画します。これに対し、3つめの描画セクション([Shift] キーと [Option]/[Alt] キーを両方押した場合に対応)では、塗りつぶされた角丸長方形(paintroundrect)を描画します。矩形の座標に加えて、2つのナンバーボックスが追加され、pack オブジェクトに値を送信しています。このナンバーボックスは角の丸みをコントロールします。

座標値が(演算オブジェクトと pack によって)計算され、決定されて、描画ルーチンを判断するためのメッセージセレクタが(prepend オブジェクトによって)付け加えられると、メッセージは lcd オブジェクトに送り返されます。このメッセージの経路をわかりやすくするために、描画コマンドのパッチコードは青色にしてあります。frgb メッセージボックスも、各メッセージボックスが lcd に対して指定する描画の色に合わせた色になっています。これらは、パッチの機能をよりわかりやすくするためにオブジェクトやパッチコードに色をつけている例です。

結び

このチュートリアルでは、いくつかの異なった(しかし重要な)トピックスについて述べてきました。まず、gate オブジェクトを使ってパッチのセクションへメッセージを渡す方法を見ました。また、unapck、pack、prepend オブジェクトを使って複雑なメッセージを構築し、分析する方法を見ました。さらに、パッチコードやオブジェクトに対して色をつけたり、セグメント化などの操作を行なったりすることによって、パッチやメッセージの流れを見やすくする方法についても見ました。最後に、シンプルな描画を行なう lcd オブジェクトの使用法を見ました。

参照

gate 経路のコントロール
pack 数値やシンボルをリストに変換します。
unpack リストの要素を別々のアウトレットから出力します。
prepend 他のリストやメッセージの前に、リストやメッセージを挿入します。
lcd パッチャーウィンドウ内のボックスに図形、線、テキストなどを描画します。