チュートリアル 03 HelloWorld 3 - メッセージに関する詳細

Max オブジェクトが送受信できるメッセージ型についてより詳しく説明するために、今までのクラスをさらに変更して、名前をHelloWorld3に変更してみます。

import com.cycling74.max.*;

public class HelloWorld3 extends MaxObject {

	public void bang() {
		post("hello bang!");
		outletBang(0);
	}

	public void loadbang() {
		post("welcome to the patch!");
	}
	
	public void inlet(int i) {
		post("hello integer " + i + "!");
		outlet(0, i);
	}
	
	public void inlet(float f) {
		post("hello float " + f + "!");
		outlet(0, f);
	}
	
	public void list(Atom[] a) {
		post("hello list " + Atom.toOneString(a) + "!");
		outlet(0, a);
	}
	
	public void anything(String s, Atom[] args) {
		post("hello anything " + s + " " + Atom.toOneString(args) + "!");
		outlet(0, s, args);
	}
}

最初に注目する点は、ここではコンストラクタメソッドが存在していないことです。デフォルトで作られる1つのインレットと1つのアウトレットがあれば良く、インスタンス化の際に行なわなければならないことも何もないという場合、コンストラクタは必要ありません。

上記のクラスには6個のメソッドがあり、それぞれが特定の型を持つMax メッセージに対応します。bang メソッドはオブジェクトが bang を受信した際に呼び出されます。このメソッドはMax コンソールにメッセージを送り、前の例では紹介しなかったメソッドを呼び出します。 MaxObject の outeletBang はオブジェクトの第1アウトレットから bang を送信します。

loadbang メソッドは、そのクラスのオブジェクトが存在するパッチをユーザが開いたときに呼び出されます。このメソッドはコンストラクタが実行された後に呼び出されるため、この中でoutlet メソッドを呼び出しても安全です。しかし、このケースでは、単に感じの良い歓迎メッセージを送っているだけです。

次の2つのメソッドの実装は、2つとも inlet という名前がつけられていますが、これはもう1つのオーバーロードの例です。 inlet(int) メソッドと inlet(float) メソッドは、それぞれ1つの整数と1つの浮動小数点数に応答します。整数を受信すると、その整数 i を取り込んだメッセージがMax コンソールに送られ、その後 i が第1アウトレットから送信されます。 浮動小数点数を受信した場合にも、同じような一連の処理が実行されます。

次のメソッド、list はオブジェクトのインレットにリストが送信された場合に呼び出されます。アーギュメントaAtomの配列です。ここでは Atom クラスが持つメソッドの1つ Atom.toOneString() を使って、個々の Atom を1つの長い文字列(String)に変換し、Max コンソールに出力しています。

最語に、anything メソッドは、メッセージの最初の要素が、クラスの中で宣言されているパブリックメソッドの名前(ここでは "bang"、"inlet"、"list")以外のシンボルになっている場合に応答します。 String s は最初のシンボル、args はそれに続く Atomの配列で、長さは任意です。

クラスで inlet(float)が定義されていて、inlet(int) が定義されていない場合、入力された整数はinlet(float)にリダイレクトされます。両方とも定義されていない場合、list(Atom[])が存在すれば、mxj はこれを呼び出します。これも存在しない場合、mxj は anything(String, Atom[])を呼び出します。 list メソッドが定義されていない状態でリストを受信した場合、mxj は String に "list" をセットして anything(String, Atom[])を呼び出します。anything メソッドが定義されていない場合には、mxj はリストの最初の要素を取り出し、その第1要素の型に基づいて inlet(int) または inlet(float) を呼び出します。適切なメソッドが存在しない場合、mxj はMax コンソールにエラーメッセージを送ります。

 

実行例: