チュートリアル 02 HelloWorld 2 - メッセージとメソッド

Max オブジェクトが作られると、メッセージの送受信ができるようになります。Max オブジェクトは整数、浮動小数点数、シンボルによって作られるメッセージの送受信によってお互いの通信を行ないます。mxj API では これら3つのデータ型のすべてを表現できる単体のユニットである Atom クラスが定義されています。さらに、このAPI はAtom と8種類の基本的な型(byte, short, int, long, float, double, boolean and char)の間で相互変換を行なうことができる便利なメソッドを持っています。

メッセージの送受信を行なうために、オブジェクトはインレットとアウトレットを持たなければなりません。以降のチュートリアルではインレットとアウトレットの数を指定する方法を学びますが、ここでは同じコンストラクタを使って、MaxObject クラスのデフォルトである1つのインレットと2つのアウトレットを使用します。

HelloWorld1 クラスに メソッドをいくつか追加して、Max 環境とのやり取りを可能にしてみましょう。このクラスの名前を HelloWorld2 に変更します。コンストラクタの名前と.java テキストファイルの名前が、新しいクラス名と同じでなければならない点に注意して下さい。

import com.cycling74.max.*;

public class HelloWorld2 extends MaxObject {

	public HelloWorld2() {
		post("hello world!");
	}
	
	public void errpost() {
		error("hello error!");
	}
	
	public void hello() {
		outlet(0, "world!");
	}
	
	public void cycling() {
		outlet(0, 74);
	}
}

mxj オブジェクトが Java クラスのインスタンスを生成する際、Javaクラスで定義されている、public メソッドの名前を使って、サポートしているメッセージのテーブルが作られます。新しい Max オブジェクトボックスを作り、その中に mxj HelloWorld2 と タイプしたとき、mxj オブジェクトはJava クラスを分析し、"hello"、"cycling"、"errpost" メッセージの入力に応答するための準備を行ないます。コンストラクタはこのプロセスには含まれないため、このケースでは、オブジェクトは"HelloWorld2"メッセージには応答しません。この先のチュートリアルでは、このようにプロセスに含まれない特別な関数によるメソッド名をいくつか見ることができます。メソッドに対し mxj が入力メッセージを割り当てないようにするために、メソッドを publicではなく private として宣言することができます。。

Max 環境の中で "errpost" メッセージを受信すると、mxj オブジェクトはerrpost メソッドを呼び出し、それによってMaxObjecterror メソッドが呼び出されます。errorpost とよく似たものですが、Max の標準エラープリフィックスが前に置かれてコンソール出力される点が異なります。

hello および cycling メソッドでは、MaxObjectoutlet メソッドの使い方が示されています。 outlet の最初のアーギュメントは整数によるインデックス、これによって使用するアウトレットを指定します。アウトレットには左から右にインデックス0から始まるナンバーがつけれられています。そのため、この2つのメソッドの場合、データは左端のアウトレットから送信されます。

outlet メソッドの第2のアーギュメントは、 いくつかの異なった書式が使用できます。 hello メソッドでは、第2のパラメータとして String が渡され、Max 環境で "hello" というメッセージを受信すると、オブジェクトはシンボルworld!を出力します。 cycling メソッドでは、第2のアーギュメントは整数で、"cycling" というメッセージを受信すると、オブジェクトは整数 74 を出力します。

ここで、いくつかの有用なプログラミング用語を定義しましょう。メソッドのシグネチャ(signature)とは、メソッドの名前、およびアーギュメントのデータ型とその並びのことです。例えば、上のhello メソッドで使用している outlet メソッドのシグネチャは、 outlet(int, String) ですが、cycling メソッドで使用しているoutlet メソッドのシグネチャは、outlet(int, int) になります。C では、2つのメソッドが同じ名前を持たないことが義務付けられていますが、Java では、これと異なり、違うシグネチャ(すなわち、アーギュメントの数や型が異なるもの)を持った同じ名前のメソッドを区別することができます。このテクニックはオーバーロード(overloading)と呼ばれていて、これを注意深く使用することにより、コードの読み書きを簡単にすることができます。 outlet メソッドはオーバーロードされたメソッドの例で、次のものは正当に呼び出すことができるすべてのシグネチャをリストにしたものです。

outlet(int, Atom)
outlet(int, Atom[])
outlet(int, boolean)
outlet(int, boolean[])
outlet(int, byte)
outlet(int, byte[])
outlet(int, char)
outlet(int, char[])
outlet(int, double)
outlet(int, double[])
outlet(int, float)
outlet(int, float[])
outlet(int, int) 
outlet(int, int[])
outlet(int, long)
outlet(int, long[])
outlet(int, short)
outlet(int, short[])
outlet(int, java.lang.String) 
outlet(int, java.lang.String, Atom[])

これらすべてのoutlet メソッドは同じ関数に基づくものですが、出力させるデータをどのように取り扱うかが異なります。 コンストラクタの中では、決してoutlet を呼び出してはいけないという点を覚えておいて下さい。これは、コンストラクタメソッドの実行が完了するまでオブジェクトは完全には作られず、データを送信する準備もできていないためです。

実験してみるのであれば、メソッド名を変えたり、アウトレットから出力するデータを変更したりして、再コンパイルを行い、新しいクラスがMax 環境でどのように動作するかを見ることができます。

実行例: