チュートリアル46:
基本的なスクリプト

イントロダクション

Max 4は、パッチャー内でのオブジェクトとパッチコードによる新しい動作の方法 - スクリプト - を提供します。スクリプトは、thispatcher オブジェクトにシンプルなテキストメッセージを送ることによって、Max オブジェクトに対する数多くの操作を可能にします。スクリプト・コマンドは、オブジェクトやパッチコードの生成や消滅、オブジェクトへの値の送信、オブジェクトのプロパティ(可視性、サイズ、位置など)の変更に利用できます。スクリプトを使うことによって、たとえパッチャーウィンドウがロックされている場合でも、Max プログラマは、オブジェクトやその接続、パッチャーレイアウトの変更を行うことができます。

スクリプトは、多くの目的のために役立つでしょう。

  • ユーザが必要とする、パッチャーの要素のインスタンス化と消滅
  • オブジェクト間の接続の生成、変更、削除
  • bpatcher オブジェクトの内部のパッチャーのような、埋め込みオブジェクトの交換
  • パッチのビジュアルな配置のコントロール。オブジェクトのサイズ、配置の変更が可能で、これをユーザの入力に対応して行うこともできます。

名前を付ける

スクリプトが動作するためには、オブジェクトは名前を持っていなければなりません。すべてのスクリプト・コマンドは、オブジェクトに対して正確にアクションを割当てるために、その名前を参照します。名前を付けるためにはいくつかの方法があります。

  1. オブジェクトを選択し、Object メニューから Name... を選択します。Name Object ウィンドウが開きます:


    Name Object ウィンドウ

    デフォルトでは、Max オブジェクトは名前を持っていません。そのため、オブジェクトのName Object ウィンドウを最初に開いた場合、このウィンドウには <none> という表示が現れます。予約済みでない語(予約済みの語には、bang、int、float、list があり、これらを名前として使おうとすると、エラーが生じます)をName Object インスペクタに入力すると、オブジェクトは名前を持つようになります。オブジェクトはパッチャー内でユニークな(他のオブジェクトと異なる)名前を持たなければなりません。あなたがオブジェクトに対して二重に名前を割当てようとすると、Max は「名前がすでに使用されている」という警告を出します。この制約はパッチャーウィンドウ内のオブジェクトに対してだけ適用されるため、複製されたサブパッチャーや bpatcher オブジェクトの中で同じ名前を持つオブジェクトがあっても問題ありません。

  2. スクリプトによって新しいオブジェクトを作る:スクリプトを使ってオブジェクトを生成する場合、新しいオブジェクトは生成の動作の一環として名前をつけられます。オブジェクトに割り当てた名前がすでに使用されている場合、新しいオブジェクトはその名前を持っているオブジェクトから名前を奪い取ります。

  3. 2つのスクリプトコマンド(script class、及び script nth )は、一定の基準に基づいてあなたがオブジェクトに名前を割り当てることを許可します。このコマンドについての詳細は、thispatcher オブジェクトのリファレンスページを参照して下さい。

オブジェクトに名前がついているかどうかは、次の方法で確認できます。

・オブジェクトを選択し、Object メニューから Name... を選んで下さい。オブジェクトに名前がついている場合には、Name Object ウィンドウがそれを表示します。そうでなければ <none> と表示されます。

・オブジェクトを選択し、可能ならば、Max メニューから Get Info... を選んで下さい。オブジェクトのインスペクタウィンドウのタイトルバーに、オブジェクトの名前が表示されます。


インスペクタウィンドウのタイトルバーに表示されたオブジェクトの名前

・Option メニューで Assistance がチェックされていれば、名前を持ったオブジェクトのインレットあるいはアウトレットの上にカーソルを移動させると、パッチャーウィンドウのアシスタンスフィールドにオブジェクト名が表示されます。


アシスタンスエリアのオブジェクト名

基本的なスクリプト

スクリプトコマンドは次のような形式をとります。

script <アクション> <アーギュメント>

スクリプトコマンドは、何かの動作をさせようと思うパッチャーウィンドウ内にある thispatcher オブジェクトへのメッセージとして送られます。例えば、ナンバーボックス1 という名前のナンバーボックスをパッチャーウィンドウ内の座標 (15,27)へ移動させたい場合、これを実行するスクリプトコマンドは、 script move numberbox 15 27 になります。

動作前と動作後の状態は次の図のようになります


script move... メッセージを送信する前


script move... メッセージの送信後

接続(コネクション)を生成する

スクリプトコマンド script connect 及び script disconnect は、Max オブジェクト同士の接続や、接続の解除に使われます。これらは両方とも同じフォーマットです。

script connect <アウトレット変数名> <アウトレットインデックス > <インレット変数名> <インレットインデックス>

インレットとアウトレットは、0から始めて、一番左から右へ向かって順に数えていきます。オブジェクトの接続を解除する場合は、connect という語の部分を disconnect に変えます。

script disconnect <アウトレット変数名> <アウトレットインデックス > <インレット変数名> <インレットインデックス>

 
訳注:「アウトレット変数名」、「インレット変数名」とした所は、原文ではそれぞれ「outlet-variable-name」、「inlet-variable-name」になっています。サンプルパッチを見てもわかるように、これらは、実際には「接続するアウトレットを指定したいオブジェクトの“名前”」「接続するインレットを指定したいオブジェクトの“名前”」になります。

これは、このメッセージの送信前と送信後です。


script connect メッセージを送信する前

上の例では、3つのナンバーボックスオブジェクトがあり、それぞれ John、Philip、Sousa という名前がついています。この script connect メッセージの右側は、それらをお互いに接続するために用いることができます。


script connect メッセージを送信した後

接続の解除は、単純に “connect”を “disconnect” に変えるだけです。


script disconnect メッセージの送信後

メッセージの送信

スクリプトを使って、あらゆる名前付きのオブジェクトにメッセージを送信することができます。これを実行するコマンドは次のようになります。

script send <変数名>

訳注:「変数名」は “variable-name”となっていますが、実際には値やメッセージを送りたいオブジェクトの “名前”と考えて下さい


script send メッセージ

これは、gatesend オブジェクトでは扱いにくいような、名前をつけられたオブジェクトの大きなグループに対して実行する場合に、特に役立ちます。このパッチを考えて下さい。


gatesend を使って多くのオブジェクトに値を送る

前のパッチとこのバージョンを比較して下さい。


script send を使って多くのオブジェクトに値を送る

2番目のパッチでは、gatesend オブジェクトが取り除かれているだけだなく、それを受け取るもう片方の receive オブジェクトも必要なくなります。値を受け取るナンバーボックスはシンプルな名前付けがされています。このケースでは、個々のナンバーボックスは、numberbox で始まり数字で終わる名前を持っています。sprintf オブジェクトを使うと、これらの名前を簡単に生成することができます。

script send のもう1つの重要な使い方は、comment のようなインレットを持たないオブジェクトにメッセージを送ることです。例えば、次の例では、オブジェクトのパッチをつなぎ変え、ナンバーボックスの右にある comment のテキストを更新しています。


スクリプトを使用した comment の変更と、script connect / script disconnect を使用したオブジェクトのパッチのつなぎ変え

この方法は、インレットを持たないbpatcher オブジェクトに offset メッセージを送る場合にも使用できます。

オブジェクトの生成

スクリプトの最も強力な機能は、新しいオブジェクトを生成することです。スクリプトコマンドの形式は次のようになります。

script new <変数名> <creation メッセージ>

上にある <変数名> フィールドは、生成されたオブジェクトに割当てられる新しいオブジェクトの名前になります。

script new のメッセージ部分は、簡単には行きません。Max のテキストパッチファイルと同じものをメッセージとして送りたいところです。これを理解するために、このシンプルなパッチのテキストフォーマットを見てみましょう。


シンプルなパッチ

(Max パッチのテキストバージョンは、File メニューから Open As Text を選択すると見ることができます)

 
max v2; ヘッダ情報
#N vpatcher 40 55 299 300; パッチャーウィンドウ定義
#P button 65 98 15 0; button オブジェクトのオブジェクト定義

#P number 94 75 35 10 0 0 0 22 0 0 0 221 221 221 222 222 222 0 0 0;

ナンバーボックス (number box)オブジェクトのオブジェクト定義
#P message 94 124 14 1441802 0; 下のメッセージボックスのオブジェクト定義
#P message 94 98 43 1441802 set \$1; 上のメッセージボックスのオブジェクト定義
#P newex 94 148 50 1441802 print a; print オブジェクトのオブジェクト定義
#P connect 3 0 1 0; パッチコード
#P connect 4 0 2 0; パッチコード
#P connect 1 0 2 0; パッチコード
#P connect 2 0 0 0; パッチコード
#P pop; パッチャーウィンドウの生成

スクリプトを使って、Max でオブジェクトを生成するためには、(Max テキストファイルで見た例では)#P の後から、セミコロンの前までにあたる、オブジェクト定義の部分を使います。

上のような button オブジェクトを生成するためのスクリプトコマンドは次のようになります。

script new mybutton button 65 98 15 0

上のような ナンバーボックス オブジェクトを生成するためのスクリプトコマンドは次のようになります。

script new mynumber number 94 75 35 10 0 0 0 22 0 0 0 221 221 221 222 222 222 0 0 0

個々のオブジェクトに関する詳細に立ち入らなくても、オブジェクト(buttonnumber、message 等)の名前(またはクラス)の後に続いている数値の意味を説明することは可能です。ほとんどの場合、最初の2つの数値は、パッチャーウィンドウの左上を基準とした水平、及び垂直の位置を表しています。View メニューから Set Origin を選んでパッチャーウィンドウの新しい原点を設定している場合でも、スクリプトの new メッセージがオブジェクトをウィンドウ座標によって配置する際にはそれを考慮しないということを覚えておいて下さい。

オブジェクト生成メッセージには多様なバリエーションが存在します。このことから、スクリプトを使ってオブジェクトを作る上での最も効果的な方法は、多くの場合、単純に従来からの方法を使って必要なオブジェクトを作り、その後、テキストとして編集され、保存されたパッチから、オブジェクトを再現するために使うメッセージをコピーすることであると言えます。一度、オブジェクトを作るための正しいメッセージを得た後、いくつかの数値を変更して、どのような変化が起きるかを見て下さい。

Max のテキストファイルを調べるときに参照できるように、最も一般的なオブジェクトのタイプを挙げておきます。

オブジェクトタイプ オブジェクト
newex オブジェクトボックス(object box)
messageメッセージボックス (message box)  
number ナンバーボックス (number box)
flonum float ナンバーボックス (float number box)
button button
toggle toggle
bpatcher bpatcher

この情報を武器として、オブジェクト生成スクリプトを使い、同じオブジェクトの多くのインスタンスを生成するタスクを自動化することができます。例として、すでに見てきたナンバーボックス( number box )オブジェクトを使ってみましょう。具体的なナンバーボックス( number box )のためのオブジェクト定義文字列は、次のようになっていました。

#P number 94 75 35 10 0 0 0 22 0 0 0 221 221 221 222 222 222 0 0 0;

最初に、#P とセミコロン(;)を取り除きます。さらに、オブジェクト名に続く1番目と2番目の数値が、パッチャーウィンドウ内でのオブジェクトの水平、及び垂直位置であることがわかっています。次のパッチは、数多くのナンバーボックス(number box) オブジェクトを一度に量産することへのアプローチの様子を示しています。

これが実行結果です。整然とした15個のナンバーボックスが並び、0mynumbox から 14mynumbox までの固有な名前が付けられています。

なぜこのようにしたかったのでしょうか? パッチを広げてみましょう


ナンバーボックス(number box) と receive オブジェクトを作っています

ここでは、すでにパッチの中で調べた print オブジェクトを生成する行をコピーして、receive オブジェクトを生成する機能をパッチに追加しています。オブジェクトボックス定義のケースでは、newex の次の1番目と2番目の数値が水平、及び垂直の座標を示し、3番目の数値はオブジェクトの幅を示しています。(4番目の数値はフォント、及びフォントサイズ情報です)

スクリプトコマンドを実行すると、次のような結果になります。


実行結果

次に、スクリプトを使って receive オブジェクトと ナンバーボックス(number box )オブジェクトの接続を自動化します。

これでパッチは終わりです。全ての接続を行ってみましょう。


number box オブジェクトとreceive オブジェクトの接続

30個のオブジェクトを生成し、接続することは非常に面倒なことに思えるでしょうが、ここでは、各々のオブジェクトは固有の名前(パッチャー内で固有なスクリプト名、また、receive オブジェクトの場合はグローバルなシンボル名)を付けられています。このことは、パッチが存在する限り、私たちがこれらを操作し続けることが可能であることを示しています。今まで見てきたような基礎的なテクニックを使って、何千もの接続されたオブジェクトをプロトタイプから生成することが可能です。

オブジェクトの削除

オブジェクトを削除する場合には、script delete メッセージを使います

script <変数名>

この例では、今までに苦労して作成したものをすべて消滅させます。


オブジェクトの削除

まとめ

スクリプトは script という語で始まるメッセージを dispatcher オブジェクトに送ることによって実行されます。スクリプトで取り扱うためには、オブジェクトは名前を付けられていなければなりません。多くのタスクはスクリプトによって実行することができます。これには、オブジェクトの生成、それらの接続、メッセージの送信、さらには、オブジェクト間の接続の解除やオブジェクト自体の削除が含まれます。

次のチュートリアルでは、より高度なスクリプトの使用法について調べます。これには、オブジェクトの置き換え、オブジェクトの移動、オブジェクトの非表示が含まれます