![]() |
チュートリアル 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 やクラスのコンストラクタの場合と同様、パッチファイルに保存されているメッセージによって出力をトリガしてはいけません。これを行なった場合、不安定になる危険性があります。