スクリプトによって、パッチ内のオブジェクトの置き換えができます。これを行うためには、まず最初にオブジェクトを削除し、その場所に新しいオブジェクトを生成して、新しいオブジェクトへ、そして新しいオブジェクトからの適切な接続を行います。この機能は、特に、パッチ内のサブパッチャーや bpactcher オブジェクトを置き換え、パッチの一部を一種の「プラグイン」のように変更するアルゴリズムを使う必要がある場合に役立ちます。すでに説明したbpatcher オブジェクトを動的に置き換える方法(bpatcher 内にあるthispatcher オブジェクトに対してreplace メッセージを使用する方法)は、Max 4 ではスクリプトに置き換えられ、次のような改善が行われています。
bpatcher に含まれるパッチの内部的なメカニズムに依存する代わりに、パッチの最上位レベルにコントロール機能が割当てられます。
一度 bpatcher オブジェクトが作られると、新しい bpatcher が持つインレットやアウトレットの数が異なる場合でも、パッチの変更が簡単に行えます。
置き換え機能を実装するためには、次のようなステップを踏む必要があります。
オリジナルのbpachter オブジェクトには名前が付けられていなければなりません。また、このbpatcher オブジェクトのインレットまたはアウトレットに接続されるオブジェクトも名前を付けられていなければなりません。
オブジェクトを置き換えるためには、まず最初に、script delete メッセージによってそれを削除します。
その後、script new メッセージを使って 以前のオブジェクトと同じオブジェクト名を持ち、新しいパッチファイルを参照するbpatcher オブジェクトを生成します。
最後に、必要に応じて、新しいbpatcherのインレット及びアウトレットにオブジェクトを接続します。
それでは、始めましょう。bpatcher の中で、2つのシンプルなパッチ bpatch1 と bpatch2 を使おうと思います。
メインパッチはこのようなもので、すでにmypatcher という名前のbpatcher には bpatch1 パッチが含まれています。
「置き換えられる」マスタパッチ
このパッチの Max テキストファイルはこのようになります。
max v2; #N vpatcher 31 53 416 384; #P number 8 166 35 10 0 0 0 22 0 0 0 221 221 221 222 222 222 0 0 0; #P objectname num_bottom; #P number 78 49 35 10 0 0 0 22 0 0 0 221 221 221 222 222 222 0 0 0; #P objectname num_topright; #P number 8 49 35 10 0 0 0 22 0 0 0 221 221 221 222 222 222 0 0 0; #P objectname num_topleft; #P bpatcher 8 71 105 90 0 0 bpatch1 1; #P objectname mybpatcher; #P connect 1 0 0 0; #P connect 0 0 3 0; #P fasten 2 0 0 1 83 67 108 67; #P pop;
上に挙げたテキストファイルの中で、名前を伴ったアイテムのすぐ後には#P objectnameで始まる行があります。これは、複雑な Max テキストファイルを調べる場合に、どのオブジェクト定義文字列を用いるのかをはっきりさせるための良い手段になります。この例では、4つの名前付きオブジェクト、num_bottom、num_topright、num_topleft、mypatcher があります。
bpatcher のオブジェクト定義はこのようになっています。
#P bpatcher <水平位置> <垂直位置> <幅> <高さ> <水平オフセット(h-offset)> <垂直オフセット(v-offset)> <パッチ名> <ボーダー on/off [1/0]> <アーギュメント 1> <アーギュメント N...>
異なるパッチャーを含む、新しい bpatcher オブジェクトを生成する場合、name 以外のものはすべてそのままにしておきます。一連のスクリプトの流れ(シーケンス)は次のようになります。
置き換えと再接続を行った bpatcher
上の例でもわかると思いますが、たとえ簡単なスクリプトでも、かなり長いものになります。スクリプトの管理は、スクリプトを書くことと同様に興味をそそるものです。日頃から決まり文句のような長いスクリプトを使っていると感じた時、それを coll オブジェクトの中に書き込んでおくことが考えられます。
先ほどの例をモデルとして使った場合、次のようになります。
この方法には、次のような利点があります。
スクリプトの最も面白い機能として、Max パッチに含まれる要素の移動、サイズ変更、非表示などを行うコマンド群があります。この機能を使うことによって、フレキシブルなインターフェイスデザインが簡単に行えます。
オブジェクトの移動を行う主なスクリプトコマンド:
script move <変数名> <上の座標> <左の座標>
水平、及び垂直座標は、ウィンドウ内におけるオブジェクトの左上隅のピクセル位置を表します。
オブジェクトのサイズ変更を行うスクリプトコマンド:
script size <変数名> <幅> <高さ>
この場合も、値はピクセル単位です。次のパッチを参照して下さい。:
script move および script size メッセージの使用例
large と small というメッセージボックスをクリックしてみて下さい。これは、function オブジェクトの移動とサイズ変更を行うスクリプトコマンドのトリガになっています。
large メッセージを送信した結果
script メッセージは、より高度なオブジェクトの移動操作を行うことができます。script offset メッセージによるコマンドでは、オブジェクトの位置の変更を、現在の位置を基準として相対的に変化させることができます。
script offset <変数名> <dela-x (x方向の移動量) > <delta-y(y方向の移動量)>
scriptfrom メッセージによるスクリプトコマンドでは、他のオブジェクトの位置を基準とした相対的な位置にオブジェクトを移動させることができます。
script offsetfrom <移動する側の変数名> <ターゲットの変数名> <top-leftフラグ> <dela-x> <delta-y>
変数 <移動する側の変数名> は移動させるオブジェクトの名前、<ターゲットの変数名> は相対的な位置を決める場合に基準となるオブジェクトの名前を指定します。<top-left フラグ> を 0 にセットすると<ターゲットの変数名> で指定したオブジェクトの左上隅を基準として新しい位置が決定され、1 にセットすると右下隅を基準として新しい位置が決定されます。
次のコマンドを使うとスクリプトによってオブジェクトを非表示にすることができます。
script hide <変数名>
再び表示するには次のコマンドを使います。
script show <変数名>
次のパッチは、script show 及び script hide の簡単な応用例です。ここでは、comment ボックス(mycommentという名前が付けられています)がインターフェイスオブジェクトのアクティブ、非アクティブの状態をわかりやすく示しています。
script show および script hide メッセージ
しかし、上のパッチは、いくつかの前提に基づいて作られてしまっています。それは、mycomment が3つのナンバーボックスの前面にある(そうでないと、これはナンバーボックスの後ろに隠れてしまいます)という前提、また、ユーザが「inactive!(非アクティブ)」というサインを心に留めていて、どんなことがあってもナンバーボックスの値を変えようとはしないという前提です。次のバリエーションを見て下さい。
より良いアプローチ
ここでは、いくつかのメッセージが追加されています。script bringfront および script sendtoback メッセージは、Max のメニューコマンド Bring to Front 及び Send to Back と同様に使われ、comment オブジェクトの視覚的な表示の優先度を合わせます。このメッセージのフォーマットは次の通りです。
script bringtofront <変数名>
script sendtoback <変数名>
また、実際にナンバーボックス(somewhere、nowhere、anywhere という名前が付けられています)を非アクティブにするために、マウスクリックに対するオブジェクトの応答を可としたり、不可としたりするスクリプトメッセージを追加しています。
script respondtoclick <変数名>
script ignoreclick <変数名>
スクリプトを使って、パッチャー内のオブジェクトを置き換え、それまでと同様に接続し直すことができます。これを行うための重要なステップは、必要な全てのオブジェクトに対して、スクリプトメッセージを実行する前に名前を付けておかなければならないということです。オブジェクトの置き換えのようなスクリプトによる操作を行う場合、すべてのスクリプトメッセージをメッセージボックスの中に置く方法では扱いにくくなってしまいます。その場合、スクリプトメッセージを coll オブジェクトの1行として格納することが良い解決方法となります。