チュートリアル 10   パッチへのデータの埋め込み

keep クラスはパッチのセッション間の簡単なデータ伝達の方法を提供します。 

public class keep extends MaxObject {
	
	private Atom[] stuff = null;
	private MaxPatcher patch = getParentPatcher();
	private MaxWindow window = patch.getWindow();
	boolean autobang = true;
	
	keep() {
		declareIO(1,1);
		declareAttribute("autobang");
		setInletAssist(0, "(anything) whatever is input is stored and saved with the patch");
		setOutletAssist(1, "info outlet");
		setOutletAssist(0, "(anything) outputs whatever is stored on bang");
	}
		
	private void setStuff(Atom[] a) {
		window.setDirty(true);
		stuff = a;
	}
	
	public void inlet(int i) {
		setStuff(new Atom[] {Atom.newAtom(i)});
	}
	
	public void inlet(float f) {
		setStuff(new Atom[] {Atom.newAtom(f)});
	}
	
	public void list(Atom[] a) {
		setStuff(a);
	}
	
	public void anything(String msg, Atom[] a) {
		setStuff(Atom.newAtom(msg, a));
	}
	
	public void bang() {
		outlet(0, stuff);
	}
	
	public void loadbang() {
		if (autobang)
			bang();
	}
	
	public void save() {
		embedMessage("list", stuff);
	}
}

keep は、stuff の中の Atom の配列のメンテナンスを行ないます。クラスのインスタンスが新しく入力を受け取ると、そのデータは stuff に格納されます。このチュートリアルの目的のために、ここで取り上げるメソッドは save です。ユーザがパッチを保存したとき、Max はmxj オブジェクトごとに save メソッドを呼び出します。デフォルトでは、このメソッドは何も行ないません。しかし、上のクラスの例のようにオーバーライド(上書き)した場合、embedMessage メソッドを使ってパッチファイルの中にメッセージを埋め込むことができます。このデータは、次回ディスクからパッチファイルを読み込んだ際、新しく作られるオブジェクトに対して送信されます。

keep クラスのsave メソッドの中で、 embedMessage は埋め込まれた "list" メッセージをアーギュメントとして stuff から呼び出します。 パッチがディスクから読み込まれる際、オブジェクトのインスタンス化の直後に、オブジェクトがこのメッセージを受け取ります。 したがって、stuffが持っている古い値をアーギュメントとしてlist メソッドが呼び出され、これによって、新しいオブジェクトの stuff の値は、パッチが最後に保存されたときの値に設定されます。

loadbang やクラスのコンストラクタの場合と同様、パッチファイルに保存されているメッセージによって出力をトリガしてはいけません。これを行なった場合、不安定になる危険性があります。