quickie quickie クラスとMax 内での開発

前のセクションで触れたように、インスタンスに対して "viewsource" メッセージを送信すると、エディタ環境が起動します。オブジェクトの「ピア Java Class」のための .java ファイルとクラスファイルが同じディレクトリにある場合、エディタウィンドウにソースコードが読み込まれます。このコードに変更を加え、エディタウィンドウの FileSaveという メニュー項目によって保存することができます。同様に、Java:Complile... メニュー項目を使ってコンパイルを行なうことができます。MXJ コンパイル ウィンドウ でコンパイルを行なう前に、ソースの場所、コンパイラコマンド、ビルドディレクトリ、クラスパス、コンパイラオプションにに関するオプションを指定しておく必要があります。Max/MSP と Java の標準インストールを行なっていれば、デフォルトの設定でうまく動作するはずです。Java コンパイラへのデフォルトのパスが正しくない場合、あるいは、別のJava コンパイラを使用したい場合、browse ボタンを使って、新しいコンパイルコマンドを選択することができます。この設定は、アプリケーションを終了させた場合でも、次に変更されるまで保持されます。

.java ファイルが見つからない場合には、.classバイトコードの逆アセンブルが試みられます。私たちは現在、この逆アセンブルを行なうために、JODE ライブラリ(http://jode.sourceforge.net)を使用しています。class が .JAR ライブラリから逆コンパイルされた場合には、コンパイルを行なう前に、自動的に生成されたソースコードを新しいファイルに保存しなければなりません。

コンパイルが成功した後、それ以降にインスタンス化されたクラスにだけ変更点が反映されます。クラスが変更される前にインスタンス化されていたクラスのオブジェクトは、古いクラスのインスタンスとして動作を続けます。さらに、max.classloader.fromdisk オプション(「環境設定」のセクションで説明します)を有効にしていなかった場合には、クラスのインスタンスが "_zap"メッセージを受信したときにのみクラスファイルが再度読み込まれます。そうでない場合、Max はその前のインスタンス化の際にキャッシュしておいたバージョンのクラスを使用します。max.classloader.fromdisk が有効な場合、クラスの新しいインスタンスが生成されるたびに、ディスクのディレクトリから.class ファイルが読み込まれます。この機能は開発者には便利なものですが、新しい mxj オブジェクトの作成がかなり遅くなるためデフォルトではオフになっています。

Max 内での編集環境のためのもう1つの便利なツールは、クラスリファレンスウィンドウです。この機能によって、Mac では [Command] + D、Windows では [Ctrl] + D を押したときに、クラスがハイライト表示されます。ポップアップする Max クラスリファレンスウィンドウは、クラスのフィールドとメソッドの分析を行なってくれます。

クラスのソースにアクセスするもう1つの方法は、quickie クラスによるものです。quickie はアーギュメントとしてクラス名を取ります。例えば、新しい Max オブジェクトを "mxj quickie MyClass" という形で初期化します。その後、この新しく作成されたオブジェクトに bang を送信するか、オブジェクト自身をダブルクリックすると、MyClass というコードを編集するエディタ環境が読み込まれます。MyClass.java と MyClass.class が見つからない場合、エディタはクラスのテンプレート を開きます。テンプレートクラスは、Max サーチパス内に置かれている QUICKIE_PROTO というファイルの内容によって定義されます。デフォルトでは、QUICKIE_PROTO は次のようになっています。

import com.cycling74.max.*;

public class MyClass extends MaxObject
{
	public MyClass(Atom[] args)
	{
		declareInlets(new int[]{DataTypes.ALL});
		declareOutlets(new int[]{DataTypes.ALL});
	}

	public void bang()
	{
	}

	public void inlet(int i)
	{
	}

	public void inlet(float f)
	{
	}

	public void list(Atom[] list)
	{
	}

}