Max/MSPでLispを動かすmaxlispj


maxlispjというオブジェクトをご存知でしょうか。コロンビア大学音楽学部教授兼コンピューターミュージックセンター所長のBrad Garton氏が開発しているオブジェクトです。彼はExpo’74でもプレゼンターを務めたり、Cycling’74のサイトでチュートリアルを書いている、コンピュータ音楽界の大御所です。

http://music.columbia.edu/~brad/maxlispj/

maxlispjはMax/MSPのmxjオブジェクトを利用し、javaでlispを実行するという仕組みになっています。LISP は 1958年MITのジョンマッカーシーが発明した言語です。この言語は人工知能の分野で広まり、Emacsの拡張、音楽の世界でもIRCAMのOpenmusicやModalysがLispによって書かれたソフトとして有名です。ただしこの言語は大変マシンのパワーやメモリーを必要とするもので、近年まではパーソナルコンピュータで動かす事は不可能でした。

Lispの特徴は、関数型のプログラミング言語ということです。既に定義されている関数を組み合わせて新しい関数を定義するという形でプログラムを記述する点が他の言語とは大きく異なります。
C言語を中心とした手続き型と、手続き型をベースにした Java などのオブジェクト指向型言語が中心となっていますが、LISP の関数型プログラミングはまたそれとは違ったメリットデメリットを持っています。近年流行しているRubyもLispから多くの影響を受けている言語と言えるでしょう。

Lispの文法についてはwikipediaを引用します。

//—–引用—–//

LISP は「式指向」の言語である。他の多くの言語とは違って、
は区別されず、すべてのコードとデータは式として書き下される。式が評価されたとき、それは1つの値(または値のリスト)を生成する。式は他の式に埋め込まれることができる。

マッカーシーの1958年の論文では、2つのタイプの文が導入されている。S式(Symbolic Expression, シンボル式、sexp)と、S式の関数を表すM式
(Meta Expression, メタ式)である。M式には利点がなかったため、今日ではほとんどすべてのLISP言語でM式は使用されておらず、コードとデータの両方の操作にS式のみを使用する。

S式は括弧を大量に使用するため、批判を受けることもある。「Lisp は "Lots of Irritating SuperfluousParentheses"(過剰でいらいらさせる大量の括弧)の略」というジョークもある。しかし、S式による構文はLISPの能力を生み出してもいる。
この構文は極めて正規化されているので、コンピュータによる操作が容易に行うことができる。

式への依存が、LISP に優れた柔軟性を与えている。LISP の関数は、それ自身がリストとして書かれており、データとまったく同様に扱うことができる。LISP のプログラムは他の LISP プログラムを処理するように書くことができる。これは、メタプログラミングと呼ばれる。多くの LISP方言はこの機能をマクロシステムで活用しており、言語自身の機能をほとんど際限なく拡張することを可能にしている。

LISP でのリストは空白と括弧で区切られた要素で記述される。たとえば、

(1 2 "foo")

1, 2, "foo"の値を要素としてもつ1つのリストである。これらの値は暗黙の型を持つ。これらは2つの整数と1つの文字列であるが、そのように宣言されている必要はない。空のリスト()nilとも書ける。

式は前置記法のリストとして書かれる。最初の要素はフォーム(関数、演算子、マクロ、特殊フォームのいずれか)の名前である。リストの残りは引数である。たとえば、関数listはその引数をリストとして返すが、式

(list 1 2 "foo")

は評価されてリスト(1 2 "foo")を返す。

もし引数のどれかが式であれば、それを含む式が評価される前にそれが再帰的に評価される。たとえば、

(list 1 2 (list 3 4))

はリスト(1 2 (3 4))に評価される。つまり、3番目の引数はリストであり、リストはネストできるのである。

算術演算も同様に処理される。式

(+ 1 2 3 4)

は10に評価される。この式は中置記法では"1+2+3+4"と等価である。

「特殊フォーム」はLISPの制御構造を提供する。たとえば、特殊フォームifは3つの引数をとり、 第一引数の値が真なら第二引数に、偽なら第三引数に評価される。ここで真とはnil以外、偽とはnilのことである。したがって式

(if nil
  (list 1 2 "foo")
  (list 3 4 "bar"))

(3 4 "bar")に評価される。言うまでもないが、nilのところに自明でない式が来ることによって有用になる。

その他の特殊形式defunは、関数を定義するために用いられる。defunの引数は引数のリストと、関数として評価される式である。

//———–//

maxlispjの使用にあたって、abclを先にインストールしておく必要があり下記からダウンロードが可能です。

http://common-lisp.net/project/armedbear/

lispworks

abclのインストールには若干のLispの知識が必要となります。私はLispWorksを使ってコンパイルを行いましたが、net beansなどの環境からもコンパイルを行う事が可能なようです。
READMEにあるように、customizations.lisp.inをcustomizations.lispに変えてからコンパイルすることを忘れずに。

maxlispj

さて、インストールが終わり、Max/MSPでヘルプパッチを開くとこのような画面が出てきます。
あとはLispの文法に従ってテキストを打ち込み、mxjのmaxlispjオブジェクトにデータを流し込めば計算結果を吐き出してくれます。ヘルプパッチの操作は以下の映像で確認が可能です。ただ、riff-o-maticのパッチはエラーでMaxが落ちてしまうので、どなたか動いた方がいらっしゃればご報告ください。ちなみに最後のヘルプだけはrtcmix~オブジェクトを必要とします。これもブラッドガートン教授が開発したもので、彼のサイトからダウンロードすることが可能です。

http://music.columbia.edu/~brad/

ちなみに私の母校であり、現在の勤務先玉川大学芸術学部は高岡明先生を始めとしジョナサンリー先生、キャシーコックス先生、小島有利子先生らコロンビア大学出身者が多くいらっしゃいます。その関係で、ブラッドガートン先生も玉川に来られた事があります。Maxを使って数千年先の音楽をモデリングされたり、非常に面白いプレゼンテーションをしていただいたのですが、その際様式模倣のアルゴリズムのバックで動いていたのがLispです。

アルゴリズミックコンポジションに挑戦されているかたはトライする価値があると思います。言うまでもなく数々のアルゴリズミックコンポジションによる傑作をサポートしてきたIRCAMのOpenmusicも中身はLispです。