チュートリアル43:
パッチャーの中のグラフィックス

パッチャーウィンドウ内のアニメーション

このチュートリアルのパッチが正確に動作するためには、システムにQuickTime がインストールされているかどうかを確認する必要があります。また、スクリーンの描画処理に対して、より多くコンピュータの処理が割り当てられるように、Max の Overdrive オブションを使用不可にしておく必要があります。

チュートリアル19では、他のプログラムからピクチャーをインポートすることによって、パッチのユーザインターフェイスをカスタマイズできることを示しました。この章では、パッチャーウィンドウの内容を動的に変化させ、さらにパッチャーウィンドウでアニメーションを実現するための様々な方法を紹介します。

43.Graphics in a Patcher というパッチでは、スクリーンの下部に、新しい2つの大きなオブジェクトボックスがあることがわかります。1つはパッチャーウィンドウ内で Quick Time ムービーを再生する imove オブジェクト、そしてもう1つは、線、シェイプ、およびテキストを描画するための lcd オブジェクトです。

このパッチ内には、目に見えないオブジェクトがいくつか存在します。それらは Hide On Lock コマンドによって非表示にされているのではなく、境界線を持たないために見えなくなっています。bpatchermenu(Label モードの場合)がこれに該当するものですが、これらのオブジェクトについては、後ほど、この章の中で説明します。

Quick Time ムービーの再生

・シンセサイザのモジュレーションホイールを 0 以外の位置に動かしてみて下さい。

モジュレーションホイールが非 0 の位置にある場合、imovie 内のムービーはループ再生されます。このムービーは 14フレームしか持たないため、1/2 秒未満で終了します。この 14 フレームの中には 4 つの異なったフレームしかないため、有効なフレームレートは毎秒 8 フレーム程度にしかなりません。そのため、ややぎくしゃくした動きになっています。

imovieオブジェクトを選択してObject メニューから Get Info... を選び、ダイアログ・ボックスから QuickTime ムービーを選択すると、パッチがロードされたときに imovieに読み込むムービーを指定することができます。imovieはいろいろなコントロール・メッセージに応答しますが、この例では特に頻繁に用いられる startstop というメッセージだけを使用しています。

・モジュレーションホイールを 0 の位置に戻し、ムービーを停止させて下さい。 patcher playmovie オブジェクトをダブルクリックして、ムービーがどのようにコントロールされているのかを見て下さい。

togedge オブジェクトはモジュレーションホイールの 0 および 非0の状態を検知するために使われています。これは、モジュレーションホイールが生成する多くの非 0 の数値を取り除き、0 / 非 0の状態の変化だけに反応します。状態の変化は、ムービーをスタートさせ、metro を使って 467ミリ秒ごとにムービーをタイム 0に巻き戻します。467ミリ秒=14/30秒(30fpsの14フレーム)です。このように、ムービー再生中に、数値によってimovie オブジェクトの時間位置をセットすると、ムービーはその位置から再生を続けます。

コントロール・メッセージは対になった sendrecieve を経由して imovie に送信されます。r toimovie オブジェクトはメインパッチの中に隠されています。

lcd オブジェクトによる描画

チュートリアル42では、グラフィックウィンドウの中で、スプライトによって色のついたシェイプを描画する方法を学びました。lcd オブジェクトは、スプライトによってではなく、コマンドによってパッチャーウィンドウの内部にシェイプ、線、テキストを描画することを可能にしてくれます。シェイプの色と座標の指定を行なう場合の原則は、2つの場合とも非常によく似ています。

・[playmovie] というサブパッチウィンドウを閉じて、patcher concentrics オブジェクトをダブルクリックし、その内容を見て下さい。MIDI キーボードの低いC(キー 36)を1回弾いて、[concentrics] サブパッチを動作させて下さい。

このノートは metro をトグルし、このmetro は 0から100までのサイクルを持つ counter をインクリメントし、約2秒毎に1サイクルになります。counter からの数値は同心円の色と座標の計算に用いられ、lcd への PaintOval メッセージによって描画が行なわれます。

lcd の中で、正確にその中心から描かれている同心円の座標をどのように計算しているのか調べてみましょう。この lcd オブジェクトは幅160ピクセル、高さ120ピクセルのサイズになっています。ちょっとした三角関数の利用によって、この lcd の中心から1つの角までの距離は 100 ピクセルに等しいことがわかります。そのため、lcd 全体は半径100 の円によって外接されます。

lcd の大きさが 160 X 120 であることはわかっているため、中心点の座標は lcd の左上隅を基準として、(80、60)であることが容易に計算できます。このため、半径 100 で、正確に中心に置かれる円は、-20、-40、180、160 という座標による正方形に内接することが計算によってわかります。

従って、だんだん小さくなっていく同心円を描くためには、counter が 0 から 100 まで変化するにつれて、円が内接する正方形の座標を -20、-40、180、60(半径 100 の円)から、80、60、80、60(半径 0 の円)に変化させる必要があります。

計算された座標はリストとしてパックされ、PaintOval という語が リストの前に置かれます。そしてメッセージ全体は(メインパッチ内に隠れている) s tolcdr tolcd を経由してlcd に送信されます。

lcd によって描画に使用される色は、0から255の数値を後に続けた color という語によって指定されます。255よりも大きい色の値を受信した場合、値はモジュロ演算により自動的に「包み込まれ」適切な範囲に保たれます。このモジュロ機能は [concentrics] パッチで利用されています。counter の左アウトレットから出力される数値は、右アウトレットから出力されるキャリーカウント( couterが最大に達した回数を表す値)を掛けられます。その結果、それぞれの円が描かれる際に、lcdオブジェクトのペンの色は最初は 1 の倍数、次は 2 の倍数、次は 3の倍数・・・という形で増加していきます。これらの数値はすぐに適切な範囲を超えてしまいますが、lcd は自動的にそれらを適切な範囲内に保ちます。実際には、色の値が常に異なった量だけ増加するため、円の色のパターンは絶え間なく変化します。

カオス的イメージの描画

lcd のその他の描画例を見るために、MIDI キーボードでノートを演奏し、ピッチベンドホイールを動かして下さい。

MIDI ノートとピッチベンドは lcd に線を描画します。多くの線を描画した場合、これらの線が、予測できない、しかしかなり一貫した方法で二等辺三角形を塗りつぶしていくことに気がつくはずです。各々の線分は、現在位置から、ランダムに選ばれた三角形の頂点までの距離の、ちょうど半分の位置へ移動するペンによって描画されます。これは、数学者ワクロー・シェルピンスキー(Waclaw Sierpiski)が示した多くの面白いアルゴリズミック・パターンの1つです。

・[concentrics] ウィンドウを閉じ、patcher Sierpinski オブジェクトをダブルクリックして開いて下さい。

ノートオン・メッセージと、スピードを制限されたピッチベンド・メッセージは b オブジェクト(bangbang の短縮形)によって bang に変換され、3つの乱数の内の1つをトリガして、二等辺三角形の頂点の座標を指示します。

選ばれた頂点の座標から現在位置のペン座標を減じ、その距離を 2で割って線分の長さを決定します。この長さにペンの現在位置を加え、線分の終点を決定します。線分は現在位置からこの終点まで描画され、終点は新しい「現在位置」として格納されます。

乱数はまた、 lcd オブジェクトのペンの色を指定するためにも使われます。このため、各線分は、描画する方向として選ばれた三角形の頂点によって3色のうちから1色を指定されます。ノート96( MIDI キーボードの最も高い C)が受信された場合、 clear メッセージによって lcd の内容が消去され、 + オブジェクトの右インレットに新しい乱数が入力されることによって新しい3色が選ばれます。

テキストの表示と非表示

Max オブジェクトの中に収められているとは思えないような方法で、変化するテキストメッセージを表示することができます。これには、テキストを収めるために境界線を持たないオブジェクトを使用します。

1つの方法は、Label モードの menu オブジェクトの中でメッセージを表示することです。menu は、mode3 メッセージを送信するか、menu を選択してObject メニューから Get Info... を選び、modeをLabalにセットすることによって、Labal モードに設定できます。この設定を行なった場合、 menu は境界線を表示せず、マウスにも反応しません。menu に項目番号を送信することによって、新しいテキストメッセージを表示させることができます。menu の中に空の項目を置いておけば、その項目番号を送信して menu 全体を隠してしまうことができます。実際には、このチュートリアルパッチの左下には、このようなmenu オブジェクトが3つあります。

・[Sierpinski] ウィンドウを閉じて、パッチャーウィンドウ の右隅にある button をクリックして下さい。

button は数値をトリガし、その値を左下にある、境界線を持たない menu オブジェクトに(非表示になっている sendrecieve オブジェクトを経由して)送信します。

サブパッチ内のウィンドウ

button は確かにパッチャーウィンドウ内にあるように見えますが、実際には bpatcher オブジェクトの内部に含まれるサブパッチの一部です。bpatcher はサブパッチの窓のようなものです。すでに保存してある任意のパッチを bpatcher オブジェクトにロードすることができます。すると、その内容は bpatcher を通して見ることができるようになります。bpatcher のサイズを変更して、サブパッチの見える範囲をコントロールし、bpatcherの中のユーザインターフェイスオブジェクト(この例では button)が、メインパッチにある場合と同様な、マウスへの反応を行なうようにすることができます。

・パッチャーウィンドウ をアンロック状態にすると、その中に2つの bpatcher オブジェクトがあることがわかるでしょう。1つは button を含み、もう1つの長くて細長いものはウィンドウの上部にあって(外見上)何も含まれていないように見えます。

bpatcher のサイズを変更することによって、サブパッチの中身が見えるようにコントロールするだけでなく、bpatcher を通してサブパッチのどの部分を表示するかをコントロールすることもできます。 Macintosh では、 [Shift] +[Command] キーを押しながら、Windows では、[Shift] + [Control] キーを押しながら bpatcher 上をドラッグすると、その中のサブパッチを移動させることができ、サブパッチの位置をオフセットさせることができます。オフセットの量は、メインパッチャーウィンドウのアシスタンス領域に表示されます。

・パッチャーウィンドウをロックし、Macintoshでは [Shift] +[Command] キー、Windows では [Shift] + [Control] キーを押し下げたままで、button をドラッグし bpatcher の中で移動させて下さい。アシスタンスエリアに表示される座標情報に注目して下さい。

bpatcher の中のサブパッチにある thispatcher オブジェクトに offset メッセージを送信することによって、サブパッチの位置を変更することもできます。offset メッセージは、サブパッチをオフセットする水平方向、および垂直方向のピクセル数を表す2つの値を、offset という語の後に続けたものです。このため、bpatcher の中のサブパッチとして使用するパッチを注意深く設計し、bpatcher オブジェクトのサイズを注意深く設定し、適切な offset メッセージを bpatcher のサブパッチ内にある thispatcher オブジェクトに送信することによって、bpatcher から見える部分に全く異なったイメージを表示させることが可能です。

次の例では、左側に表示したサブパッチ内の様々なオブジェクトは、正しい offset メッセージを送信することによって、右側で示しているような、綿密にサイズを指定されたbpatcher の窓から表示させることが可能です。

このサブパッチの内容... ...は、メインパッチの1つの bpatcher の中で、3つの異なった方法によって窓から表示されます。

これは bpatcher の中の thispatcher オブジェクトに対する offset メッセージのもっともわかりやすい使用法です。しかし、どのようなイメージでもピクセル座標の指定によって配置することができるため、異なった位置を指定するメッセージを連続したストリームとして与えることによって、bpatcher の内容をアニメーション化することができます。

bpatcher のアニメーション

・ウィンドウの左下隅にある Roll Credits という語をクリックして、アニメーション化された bpatcher の例を見て下さい。、

bpatcher の中の thispatcher オブジェクトに対する offset メッセージの使用は、様々なテキストメッセージを表示したり、隠したりするもう1つの方法です。このケースでは、Roll Credits という単語を含むメッセージボックスは、非表示のパッチコードによって bpatcher のインレットに接続されています。そして、その出力は、連続して異なった offset メッセージをトリガし、スクロールするテキストを表示させます。

・スクロールするテキストを表示する bpatcher の内容を見るために、Max Tutorial フォルダの中の scrollingtext という名前のファイルを開き、アンロックして下さい。

bpatcher のインレットでメッセージが受信されると、b オブジェクトによって bang に変換され、10秒間かけて450から -450までの数値のストリームを送信する line オブジェクトをトリガします。数値は thispatcher への offset メッセージの中の水平座標として(垂直座標として数値 -70を追加し、そして offset と言う語を前につけて)使用されます。

button を含んでいるもう1つの bpatcher は、bpatcher の内容をアニメーション化する極端な例で、ちょっとした遊びのようなものです。また、いくつかの新しい便利なオブジェクトを紹介しています。

・MIDI キーボードの 高いC (キー 96)を一回弾いて、バウンドする button のアニメーションをトリガして下さい。アニメーションが極度にぎこちなく動いたり、何も音が聞こえない場合には、Overdrive オプションが使用不可になっているか、コンピュータのコントロールパネルでサウンド出力がオンになっているかどうかを確認して下さい。

訳注:バージョン 4.6の Max/MSP では snd オブジェクトは存在せず、チュートリアルパッチのサブパッチも変更されています。以下の訳は、なるべく原文に忠実に行なっているため、サウンド関係の記述もごく一部残っていますが、ご了承下さい。

バージョン 4.6の 43. Graphics in a Patcher.pat にある patcher bouncing オブジェクトの内容

button は移動しながら現れますが、実際には、その効果は bpatcher の中のサブパッチでの offset の連続した変化によって実現されていることがわかるでしょう。

・これがどのように実現されているかを見るために、まず patcher boucing オブジェクトをダブルクリックし、その内容を見て下さい。


patcher bouncing オブジェクトの内容

キー96からのノートオン・メッセージが受信されると、それは metro をオンにし、それによって counter は 0 から 310 までの数値を、毎秒 50個の速さで送信します。

これらの数値は、s tobpatcher2オブジェクトを経由して bpatcherの中の thispatcher オブジェクトに送信され、bpatcher サブパッチの水平、および垂直オフセットの計算に使用されます。

expr オブジェクトの中の少々複雑な方程式は、振幅が現象し、周波数が増加するコサイン波を使って、垂直方向のオフセット値を計算しています。コサイン波は調和的な物理運動を表現できるため、この減衰するコサイン波の絶対値は、重力の影響を受けてバウンドする硬い物体を模倣するために使用できます。

このコサイン波の値は時間全体に渡って2π(6.2832、完全な360度の弧を表します)×増加する周波数($1 / 77.5 + 1、1 Hzから5 Hzまで増加します)×「時間」( $1 / 310.、入力される0から310までの数値の進行として考えられる「時間」)、+ π/2の位相オフセット(1.5708、サイン波をコサイン波にするための 90 度の位相オフセット)の値のサインとして計算されます。このコサイン波の振幅は、絶えず変化する振幅を掛けられています:( 310. - $f1 )/ 310. * 88. 。すべての結果は int に変換され、その絶対値が使用されます。方程式の始めで -1を掛けているのは、button が垂直オフセット 0 に静止するように、-88 から 0 までの垂直ピクセル値を用いて bpatcher の内容を移動する必要があるためです。

テキストメッセージへのアクセス

・[bouncing] ウィンドウを閉じて下さい。Max Tutorial フォルダの bouncingbutton.pat ファイルを開いて、ウィンドウをアンロックし、bouncingbuttonというbpatcherの内容を見て下さい。

patcher bouncing オブジェクトの中からメッセージを受信する r オブジェクトがあるのがわかるでしょう。 button に対する color メッセージは r tobpatcher1 オブジェクトで受信され、offset メッセージは r tobpatcher2 オブジェクトで受信されます。button の隣に表示されている comment のように見えるものは、実際にはLabel モードの menu です。menu はメニュー項目 0 にテキストを含み、メニュー項目 1 の中には何も持っていません。そのため、patcher bouncing オブジェクトから r tobpatcher3 オブジェクトを経由して数値 1を受信することによって、テキストを隠すことができます。

button をクリックした場合、チュートリアルパッチの左下隅にある menu にテキストが表示されることをすでに見てきました。下の例では、それが bpatcher 内部でどのように実現されているかを見ることができます。

urn オブジェクトは random に非常によく似ています。これは、bang を受信すると、「 0 〜 アーギュメントから 1 を引いた数値」までの乱数を出力します。しかし random と異なる点は、urn は送信した数値を記憶していて、同じ数値を2回出力しないことです。urn オブジェクトは、反復せずに集合のすべての要素を生成したい場合に使用することができます。このケースでは、urn オブジェクトは0から11までの数値を出力し、それに 1 を加えて menu オブジェクトの1から12の項目を選択します。3つの menu はすべて同じ数値を受信するため、これらのメッセージが関連づけられ、いっしょに表示されることが保証されます。

urn はその範囲内にある可能な数値をすべて出力してしまった場合、それ以上数値を送信せず、代わりに右アウトレットから bang を送信します。この bang を使って urn 自身に clear メッセージを送り、このメッセージによって記憶をクリアして、もう一度数値を出力するための準備ができます。この例ではurn は数値を送信し終わると、常に自分自身が持つリストをクリアし、自分自身に bang を送信します。このため、urnは常に数値を送信しますが、繰り返しの発生を最小限にとどめます。

まとめ

パッチャーウィンドウの中でアニメーションを作成する方法はいくつかあります。imovie オブジェクトを使ってパッチャーウィンドウの中で Quick Time ムービーを再生することができます。また、lcd オブジェクトに対し、Quick Draw のようなメッセージを送信して、色を持った線、シェイプ、テキストを描画することができます。さらに、境界線を持たないmenu オブジェクトにメニュー項目ナンバーを送信して、パッチャーウィンドウの中のテキストメッセージを表示し、変更し、非表示にすることが可能です。

グラフィックイメージは、アルゴリズムによるアニメーション化を行なうことができます。そのためには、乱数、フラクタクル公式、または任意の数式を使い、その式に対して連続的に変化する入力値を送って、グラフィックオブジェクト、線、シェイプの座標の計算を行ないます。

bpatcher オブジェクトを用いて、サブパッチの中に「窓」を作ることができます。bpatcher を通して見ることができるユーザインターフェイスオブジェクトは、メインパッチ内にある場合と同じようにマウスに反応することができます。サブパッチの中にある thispatcher オブジェクトに offset メッセージを送信することによって、1つの bpatcher 内にサブパッチの様々な部分を表示することができます。bpatcher に連続した offset の値を送信することによって、テキストをスクロールさせたり、オブジェクトが移動しているかのような印象を与えることができます。

urn オブジェクトは random と似た機能を持っています。urn は、bang を受信すると、指定された範囲内の乱数を出力しますが、送信した数値を記録しておき、そのメモリがクリアされるまで同じ数値を2回送信することはありません。このため、urn はメッセージやイベントの集合の、ランダムで、かつ重複を伴わないシーケンスを生成するために役立ちます。

参照

bpatcher

ボックス内にサブパッチを可視の状態で埋め込みます。

Graphics (Max トピックス)グラフィック・ウィンドウ とオブジェクトの概説
imovie パッチャーウィンドウ 内で Quick Time ムービーを再生。
lcd パッチャーウィンドウ 内で Quick Draw グラフィックを描画。
menu コマンドの表示と送信のためのポップアップ・メニュー。
urn 同じ値を重複しない乱数を生成。
チュートリアル42 グラフィックについて。