チュートリアル 04 Plus1 - 変数とインレットの識別

ここでは、Max のプラス(+)オブジェクトと同じ機能を持ったクラスを作成しながら、Java についてより詳しく調べていきます。プラスオブジェクトには2個のインレットがあったことを思い出して下さい。右インレットは加算する値を設定するために使用し、左インレットは最初の値の入力と加算結果の出力をトリガするために使用します。

import com.cycling74.max.*;

public class Plus1 extends MaxObject {

	private int addend = 0;
	
	public Plus1() {
		declareInlets(new int[]{DataTypes.INT, DataTypes.INT});
		declareOutlets(new int[]{DataTypes.INT});
	}
	
	public void inlet(int i) {
		if (getInlet() == 0) {
			outlet(0, i+addend);
		} else {
			addend = i;
		}
	}
}

import 文とクラス定義の後に、変数 addend が整数型として宣言されています。キーワードprivate は、この変数がこのクラスの外部のコードからアクセスできないものであるということを意味します。addend はインスタンス変数と呼ばれ、 Plus1 のコピーはそれぞれ独自にaddend. のインスタンスを持つように作られます。メモリ割り当てが1回だけ行なわれ、クラス全体からアクセスできるような変数を定義することも可能です。クラス変数という、このようなタイプの変数については後のチュートリアルで見ますが、このチュートリアルのケースでは、インスタンス変数を用いるほうが適切です。その理由は、おそらくユーザはそれぞれ異なった addend を持つそれぞれ異なったPlus1 オブジェクトを、パッチの様々な場所に置きたいと考えるだろうと予想されるからです。 addend には初期値として 0 が割り当てられることを覚えておいて下さい。

この変数宣言に続くコンストラクタの中では、インレットとアウトレットの数を変更する方法の例を見ることができます。この方法はこれまで紹介していなかったものです。declareInlets メソッドと declareOutlets メソッドはそれぞれ整数の配列をアーギュメントとして取ります。この配列のサイズがそれぞれインレットとアウトレットの数を決定します。(実際には、アウトレットの数は、declareOutlets に渡される整数の配列の要素の数より1大きくなっています。これは、標準のアトリビュート出力メソッドに対応するためです。アトリビュートは特別な型の変数ですが、これについては後のチュートリアルで説明します。)

上の例では、declareInlets メソッドとdeclareOutlets メソッドの呼び出しの中で新しい配列を作っていることに気がつくと思います。また、配列の内容が DataTypes.INT. を使って初期化されていることにも気がつくでしょう。それぞれのインレットとアウトレットは特定のデータ型と結びつけることができ、これにより、パッチを作成するときの混乱を防ぐことができます。例えば、特定のアウトレットが整数だけを出力する場合、開発者はこのアウトレットをDataTypes.INT を使って宣言しようと考えるでしょう。こうしておくと、Max はこのアウトレットと浮動小数点数だけを受け取るインレットの間の接続ができないようにします。

DataTypes クラスは5つの異なる型を定義していて、これをインレットとアウトレットの宣言に使うことができます。 各々の型は HelloWorld2 チュートリアルの中で調べたメッセージ型の中の1つに対応しています。 DataTypes.INT は整数、 DataTypes.FLOAT は浮動小数点数、DataTypes.LIST はリスト、DataTypes.MESSAGE はメッセージ、そして DataTypes.ALL は様々なデータ型の中の任意のものを送受信するインレットとアウトレットのためのものです。ほとんどの場合、DataTypes.ALL を選択するほうが良いのですが、Plus1 は整数によってのみ動作するように設計されているため、DataTypes.INT を使っています。 パッチコード接続のエラーを防ぐことに加え、整数のインレットとアウトレットを使用することによって Maxは整数の送受信に関連したオーバーヘッドを最小にすることができます。言い換えると、 DataTypes.INT のような型を用いると、型を指定しない DataTypes.ALL を用いるより効率的であるため、可能であれば型を用いるべきであるということになります。

このクラスは、コンストラクタの他にinlet メソッドを1つ持っています。このメソッドは2つのインレットに入力される整数を扱うものです。どちらのインレットが使用されたかを判定するために、使用されたインレットのインデックスを返す getInlet メソッドが呼び出されています。上のメソッドでは、整数が左インレットに入力されると、加算結果を左アウトレットから送信します。右インレットが使用された場合には、入力された値を addend に格納します。

例: