mxjはmax/msp上でjava言語との橋渡しをするオブジェクトで、豊富に用意されているjavaのクラスを利用し信号処理、数値の計算を行うことができるmaxのツールです。現在のコンピュータにおいては実行速度の面でJava/mxjをリアルタイム音響処理や音響合成の実行に利用する場合は内部オブジェクトを利用するよりも不利になる場合が多いですが、繰り返し処理の実行速度などは、むしろmax/msp上でアルゴリズムを作って実行するよりも、mxjでループを作り実行したほうが有利な場合があります。アルゴリズミックコンポジションのちょっとした作曲計算などにはおおいに活用可能です。もう一つmxjにはメリットがあり、windowsでもmacでもクロスプラットフォームでオブジェクトが動作するということです。これからの時代、OS、ソフトも仮想化が進み、仮想マシン上で動くという仕組みをあらかじめ備えていたJavaに再び注目が集まっています。
Max上のJava
Javaで開発されたソフトウェアはJava仮想マシンのもとで動作するため、プラットフォームに依存しないアプリケーションソフトウェアの開発と配備を行うことができます。つまり、mxj用に書かれたコードはwindows版max/mspでもmac版max/mspでも同様に動作することが可能です。
mxjを利用するとmaxが苦手とするテキストベースのプログラミングもjavaを通じて補うことができます。それどころか、javaでは貧弱なオーディオ関係のオブジェクトがmaxには豊富に容易されているため、Javaで作曲を行ない、mspで音響合成を行なうことも可能です。反対にJavaはネットワーク関係のクラスが豊富なため、OSCなどを利用すれば他のクライアントマシンを操作したり、別のソフトと連携をとることが可能です。
当然maxのエクスターナルオブジェクトを経由させてcsoundやsupercollider、RTcmixの音響合成エンジンを利用することも可能で、javascriptに加えmxjのクラスを経由しますがLispやProce55ingとも連携をとることが可能なので、max/mspをマルチ音楽言語を扱える中枢として据えて他の言語と連携をとる方法をとると、それぞれの言語のいいとこ取りをできるため新たな制作環境の可能性が広がります。
JVMのインストール
Java Virtual Machine(JVM)はOSXかwindowsかでインストールの方法が異なります。OSXの場合、MacのOSに標準でJavaが付属するため別途インストールする必要はありません。バージョンアップを行う場合はAppleのADCメンバーになり、開発者向けのサイトから最新版のJDKをダウンロードしましょう。自分のマシンにインストールされているJavaのバージョンを調べる場合はTerminal.appでjava -versionと入力しましょう。
java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-117.1)
Java HotSpot(TM) Client VM (build 1.4.2-34, mixed mode)
というメッセージが表示されます。
Windowsの場合はJ2SE (Java 2 Software Environment)をSun microsystemsのサイトからダウンロードしインストールします。インストールが完了したらMacの場合と同じようにpromptからjava -version.とタイプしましょう。
コーディング
以下のソースコードはフィボナッチ数列を生成するオブジェクトのソースです。ソースは基本的にjavaのプログラム同様に書くことが可能ですが、始めに必ずimport com.cycling74.max.*;の一行を書きましょう。これを抜かすとoutlet()などのmax/msp固有の命令を解釈できず、コンパイルエラーが出ます。
import com.cycling74.max.*;
import java.math.BigInteger;
public class fibonacci extends MaxObject { private BigInteger a = BigInteger.valueOf(0);
private BigInteger b = BigInteger.valueOf(1);
private BigInteger c = BigInteger.valueOf(1);
int radix = 10; //start with base 10
public fibonacci(Atom[] args) {
declareAttribute("radix");
}
public void inlet(int i) {
if (i<=0) {
error("fibonacci: needs an integer index i > 0");
return;
}
a = BigInteger.valueOf(0);
b = BigInteger.valueOf(1);
for (int j = 2; j <= i; j++) {
c=a.add(b);
a=b;
b=c;
}
outlet(0,b.toString(radix));
}
}
コンパイル
javac ファイル名.java
javaのソースコードは必ずコンパイルし、classファイルを生成しなければmax/msp上で実行することができません。上が通常のjavaのコンパイルのコマンドですが、mxjの場合max/mspが持つ固有のclassを読み込ませる必要があるため、コンパイルには以下のコマンドを入力してください。
Mac
javac -classpath "/Library/Application Support/Cycling '74/java/lib/max.jar" ファイル名.java
Windows
javac -classpath "\Program Files\Common Files\Cycling '74\java\lib\max.jar"ファイル名.java
もし上記のようなコマンド入力によるコンパイルが苦手な人向けにmax/mspにはquickieという簡易開発環境があります。
これはmax/msp上のmxjオブジェクトに対してviewsourceというメッセージを送ることで開く小さなウインドウを使い、コーディングやコンパイルを行う環境です。ターミナルやxcodeを使うユーザーでも小規模な定数の手直しなどはquickieを利用すると便利でしょう。
Java classpathの設定
max/mspでjavaを利用する場合、mxjオブジェクトを介してjavaのclassファイルにアクセスするわけですが、.javaファイルから.classファイルの中間コードにコンパイルする際、max/msp固有のclassを利用している場合、javacコマンドに-classpathのオプション記述でmaxのjavaディレクトリの指定を毎回行わなければならず、タイピングのストレスになります。上記のような長いクラスパスを含むコマンドを打たずに、javacコマンドだけでコンパイルを行う方法もあります。そのためにはjavaのクラスパスを設定する必要があります。
クラスパスの設定はjavaの.jarなどで保存されているライブラリを参照する際に必要になるものなのですが、max/mspの場合、javaがデフォルトで参照するクラスパス以外にもMax/MSPのmxj固有のクラスの置き場を指示してあげる必要があります。
/Library/Application Support/Cycling ’74/java/lib/の中にあるmax.jarというファイルがクラスパスを通す必要があるライブラリファイルになります。
ここにクラスパスを通す方法はwindows, mac, LinuxなどのOS環境ではなく、使用しているシェルに依存して変わってきます。
windowsは環境がないので未確認ですが、Macの場合、cshかbashを使っている人が多いと思われますので下記のクラスパスの設定方法をご参照ください。
(csh 系)
% setenv CLASSPATH 任意のパスその1:任意のパスその2:…
(sh系)
$ CLASSPATH=任意のパスその1:任意のパスその2:…; export CLASSPATH
Macでbashをご利用のかたはホームディレクトリ直下の.bash_profileなどの隠しファイルをemacsやviで編集し、
export CLASSPATH=$"/Library/Application Support/Cycling ’74/java/lib/max.jar":.
上の一行を追記してください。
一度ログアウトし再ログインすることでパスが通ります。
以降はjavacのコマンドだけでmaxのクラスまで参照しコンパイルを行う事ができるようになります。