以下の文章は、f r e q(2001.11.3-4) >>> の予稿集に掲載された原稿です。

###########################################################

Max/MSPのための自作オブジェクト/パッチの紹介
External Objects and Patch for Max/MSP Environment.


徳井直生 Nao Tokui
東京大学大学院 工学系研究科 電子工学専攻
Department of Electronic Engineering,
Graduate school of Engineering,
The University of Tokyo.

 

1 はじめに

今さらここで述べるまでもなく、Max/MSPは、アーティスト/ミュージシャンといった人々の間で最も広く使われているプログラミング環境の一つといってよい。その理由としては、インタフェースが直感的で使いやすいといった点が大きい。しかし、忘れてはならないもう一つの大きな理由として、その高い柔軟性がある。
Maxそのものにはない機能も、ユーザがExternal Object (以下では外部オブジェクトとしておく)として制作して追加すれば、他のオブジェクトと全く同じように扱うことができる。Webを検索すれば、そういった自作のオブジェクトを無償で配布しているサイトを多数見つけることができるだろう。こうしたMaxコミュニティとも呼べるユーザ間のつながりの存在が、全体としてMax/MSPを非常に使い勝手の良いプログラミング環境にしている。
この夏、DSPサマースクールに初めて参加した筆者は、多くのユーザがそれぞれ自作のオブジェクトやパッチを作り公開している姿に感銘を受けた。私も自作オブジェクトを作りたい! その日以降、単純な筆者はオブジェクトのC言語でのプログラミングに取り組むことにした。
本稿では、その過程で作ったいくつかのオブジェクトについて解説する。従って、オブジェクトの機能としては疑問符が残るものもあるかと思うが、その点はご容赦願いたい。この文章を読んで自作オブジェクトの制作に少しでも興味を持っていただけることを願っている。


2 外部オブジェクト

2.1 "markov"オブジェクト
Markov (マルコフ)、あるいはMarkov chain (マルコフ連鎖)という言葉は、多くの人にとって聞き慣れないものだと思う。ただし、今年のDSPサマースクールの参加者のみなさんは例外である。毎年IAMASが主催して開かているサマースクールだが、今年は特別講師としてクラーレンス・バルロー氏が招かれた。氏が提案したワークショップの4つの課題のうちの一つがマルコフ連鎖に深く関わるものであったことを、参加された方は覚えておられることだろう。しかし、実際のワークショップの場ではマルコフ連鎖そのものの意味については、あいまいなまま扱っていたように感じる。そこでまず、マルコフ連鎖とはそもそも何なのかという点から説明を始めたい。
はじめに、時間とともに変動する確率変数の系列を、確率過程あるいは時系列という (ここでは時間を離散的な変数として扱うこととする)。確率過程では、一般に現在の状態が過去の状態に依存して決まる。現在の状態がp時点前までの状態にのみ依存する確率過程は、p重のマルコフ連鎖 (Markov chain)と呼ばれる [1]。特にp=1、すなわち現時点での状態が直前の状態にのみよるものを単純マルコフ連鎖という。また、とりうる状態の数が有限の場合を有限マルコフ連鎖と呼ぶ。マルコフ連鎖の考え方を拡張し状態が連続的であるとした場合は、マルコフ過程 (Markov process)として区別される。markovオブジェクトが扱うのは、時間/状態が離散的で状態数が有限のマルコフ連鎖である。
以下にマルコフ連鎖の簡単な具体例を挙げる。

A君は友達N.T君のクラブ・イベント (音響系)に毎月誘われている。R&B好きのA君としてはあまり行きたくないのだが、友達の誘いなのでむげに断れずにいる。ある月にA君がイベントに顔を出さなかったとすると、次の月も続けて断る確率は20%だが、一度遊びに行くと、次の月は40%の割合でクラブには行かない

この例は、「イベントに遊びに行く」と「行かない」という、状態数2の単純マルコフ連鎖といえる。「イベントに遊びに行く」状態を状態1、「行かない」状態を状態2としよう。例えば、一度遊びに行くと次の月に行かない確率は40%であるから、状態1から2への確率が40%ということになる。このような、1タイム・ステップ後にある状態からある状態に遷移する確率を遷移確率と呼ぶ。上の例で述べた各状態間の遷移確率から、次のような遷移関係の図 (遷移図)を描くことができる。


図1 単純マルコフ連鎖の遷移図


実は、この例のような単純マルコフ過程を扱うオブジェクトは、すでにMaxの標準的なオブジェクトの中に用意されている。probオブジェクトがそれである。Max4 Referenceのprobの項でも、first-order Markov chainという言葉が使われている。probでは、「出力Aを出力したときに次の出力がBになる遷移確率 (重み)がCである」である場合、A B Cというリストを入力として受ける形で遷移確率の表が作られる。
probを用いれば、ある遷移確率表に基づいた確率過程を生成できる。別の見方をすれば、ある確率過程が与えられたときに、状態間の遷移確率と現在の状態が分かれば次の状態を推測することができるということになる。
しかし、ここで注意すべきことは、p重のマルコフ連鎖を考えた場合、一般にpが大きいほどより正確な予測が可能になるということである。上の例では、A君の行動は直前の月の行動のみから予測するしかない。しかし、実際にはさらに前の月の行動がA君の行動に影響を与えているはずである。例えば、二ヶ月連続で遊びに行ったら次の月は80%の確率で行かない、といった具合にだ。DSPサマースクールでも、バルロー氏は4重、5重以上のマルコフ連鎖の使用を想定していた。残念ながら、probは1重のマルコフ連鎖しか扱うことができないため、氏が求めていたものを実現することは結局できなかった。そこで登場するのがmarkovオブジェクトである。
markovは、多重マルコフ連鎖に基づいた確率過程を実現するオブジェクトである。状態数がnでp重のマルコフ連鎖の遷移表を作る際には、引数としてn pを順に指定してやればよい。遷移確率の入力の方法はprobと同じである。p=2でリストA A' B Cは、状態がA、A'と遷移してきたとして次にBに遷移する確率がCであることを示す。
DSPサマースクールでのバルロー氏は、既存の曲の音符の連なりを確率過程と見なして遷移確率の表を求めることで、似たような曲を生成するという手法を例として挙げていた。全く同じ考え方に基づいて、バッハの曲を確率過程として学習して似た曲を生成するというパッチを、markovのヘルプ・パッチに含めてある。「バッハ風の作曲」を行うには、学習に使われるデータが十分ではないものの、それらしいものが生成されることが確認できるだろう。
一方、問題点としては、次のようなものが挙げられる。まず、状態の識別の仕方についてであるが、現在のバージョンでは状態数がnの場合、状態 (すなわち出力する数)は 0からn-1に限定されているという問題である。例えば、上記のバッハの曲のような場合、ノート・ナンバーを状態としてそのまま使えるのが望ましい。これについては近いうちに対策を講じたい。また、pが増えると遷移確率の表が指数的に大きくなってしまうことは、多重マルコフ連鎖の本質的な難しさといえる。メモリの制約がある以上、注意が必要だが、実用上は問題ないものと考えている。


図2 markovオブジェクト

 


2.2 "heatgauge"オブジェクト
G3以降のPowerPCでは、CPUチップ上にThermal Assist Unit (TAU)と呼ばれるモジュールが組み込まれている。TAUを使ってCPUの温度を計るオブジェクトがheatgaugeである。heatgaugeの動作は、bangを受けてTAUの値を読み出し、摂氏温度を出力するという単純なものだ。
ちなみに、筆者のPowerBookG4では、平均して60度後半の値を示している。PowerBookをひざにおいて作業していて低温やけどを負ったという話はまんざら嘘ではなさそうだ。現在のところ、TAUの仕様からint単位でしか温度を知ることができないという問題はあるものの、何らかの面白い利用法があるものと期待している (どなたか教えて下さい!)。
なお、TAUから温度を読み出す方法については、[2]を参考にした。



図3 heatgaugeオブジェクト


2.3 "rand"オブジェクト
randは、floatの乱数値を返すオブジェクトである。簡潔に言うとrandomのfloat版ということになろう。Maxでランダムな変化を生み出したい場合に、float値の乱数が必要になることが多い。そんな場合、毎回 random 1000 の出力を1000で割るといった方法をとらなくてもいいように、という無精心から制作したオブジェクトである。特に多数のfloat乱数を使う場合など、外部パッチを組み込むといった方法に比べて、動作速度などの点で負担も小さいと思われる。
randは、bangを受けるてデフォルトでは0から1の間のfloat値を返す。引数を指定することで、ある範囲内でfloat値を生成するような仕様になっている。詳しくはヘルプ・パッチを参照していただきたい。


図4 randオブジェクト


2.4 "recycle~"オブジェクト (仮称)
最後にMSP用のオブジェクトについても紹介したい。
すぐに思い当たる人も多いかと思うが、recycle~という仮名称はpropellerheads社のリズムループ編集ソフト"ReCycle!"に由来する[3]。ReCycle!は、サウンドファイルを読み込むとサウンドのアタックを自動的に検知して各音色ごとに切り分けることを可能にする。ユーザはリズムループから特定の音だけを抜き出して他の音と入れ替えたり、ループ自体を作り変えるといったことが簡単にできる。さらに、切り分けた音の位置を元に生成されるMIDIファイルをエディットすることで、ピッチを変えずにテンポやノリを変更できる。
recycle~は、これらの機能をMax/MSP環境上に構築することを目標としている。これが実現すれば、外部入力から録音したリズム・ループを切り刻んで再構築し、出力するといった操作をリアルタイムに行うことが可能になると考えられる。
アタックを検出する他のオブジェクト (bonk~など)とは異なり、recycle~はbuffer~内のサンプルに対して操作を行う。bangを受けると、引数として指定された名前を持つbuffer~の内容 (マルチ・チャンネルの場合は番号で指定されたチャンネル)を走査し、サウンド内のアタックを検出する。アウトレットからは、検出されたアタックで区切られたセグメントの始まりと終わりのタイミング (buffer~の最初から数えた時のサンプル番号)からなるリストが出力される。このリストの使い方は、ヘルプ・パッチに例を示したので、参考にしていただきたい。また、アタック検出の際の敏感さ Sensitivityについては、中央のインレットに入力するfloat値でコントロールできる。
以上がrecycle~の簡単な説明であるが、このオブジェクトはまだまだ開発の途上にあり問題も多いことをご承知願いたい。特に上で述べたReCycle!の機能のうちの後半の部分 (切り分けた音の位置を元に生成されるMIDIファイルをエディットすることで、ピッチを変えずにテンポやノリを変更できる)という点については、全く実装がされていない。またアタック検出の精度やSensitivityパラメータの効果などについても、さらなる検討が必要であろう。
今後の方向としては、本家ReCycle!の方法論にとらわれすぎず、Max/MSPならではの機能を生かせるようなオブジェクトの開発を目指したいと考えている。


図5 recycle~オブジェクト

//(注) recycle~オブジェクトに関しては、近日中の公開を予定しています。

 

3 パッチ

3.1 "GA4MAX"
次に紹介するのは、Max上に対話型遺伝的アルゴリズムを実装したパッチ、GA4MAXである。
遺伝的アルゴリズム (Genetic Algorithms/GA)に代表される進化論的計算手法 (Evolutionary Computation/EC)は、生物の進化のメカニズムをまねてデータ構造を変形、合成、選択する手法である。
例として、飛行機の設計を考えてみよう。飛行機などのもの作りで大切なのは必ずしも新奇な物を作ることではない。独創的な天才肌の職人は確かに必要だが、多くの場合奇抜なデザインは成功しない。それよりも重要なのは、過去の設計物のマイナーチェンジ、合成、そして取捨選択である。これはまさにライト兄弟らの飛行機の設計に用いられていた原理である。上で述べた過程は、生物の(遺伝子の)突然変異、交差、及び選択淘汰と同じといえる。 つまり、人間は知らず知らずのうちに生物の進化の考えを導入し、最適な人工物の設計に用いていたのである。 このように、進化的な手法は各種のパラメータ最適化問題や設計に広く利用可能な手法といえる。
GAでは、解空間内の解を何らかの方法によってコーディングした文字列の集団を扱う[4]。この文字列は遺伝子型 (GTYPE)と呼ばれ、その名の通り細胞内の染色体に相当する。これに対し、解そのものは表現型 (PTYPE)と呼ばれ、染色体の情報に基づいて発現した個体に対応付けられる。ある世代の遺伝子型の集団はその集団内での掛合せ (交叉、crossover)や突然変異 (mutation)によって、次世代の集団を生み出す。このとき、表現型がいかに環境に適応しているか、すなわち最適解にどれだけ近いかよって、各遺伝子型が子孫を残せる確率が決定される。これは、環境に適合した個体のみがその遺伝子を次世代に残していくという淘汰 (選択とも呼ばれる)の考え方に対応している。従って、表現型に解としての好ましさを示す指標、適合度 (fitness value)を与える関数の存在が必要になる。



図6 GA/ECのアルゴリズム


それでは、コンピュータに似顔絵を描かせると言った問題の場合の適合度関数はどうなるだろう。まず考えられるのは、顔写真から抽出した構造情報とコンピュータが描いた似顔絵とのユークリッド距離を適合度計算に用いる方法であろう。しかし、似顔絵とは、写真そっくりな顔を描くことではない。顔の特徴を捉え、デフォルメして描くことに似顔絵の面白さがある。それでは、コンピュータにその人ならではの顔の特徴を捉えたり、デフォルメされて描かれた似顔絵と写真を同定するといった判断が可能だろうか。現在の技術水準では非常に困難であると言わざるを得ないだろう。しかし、我々の身近にはこのような判断を瞬時に行えるものがある。それは、我々自身の脳である。
このように、コンピュータによる計算が困難な人間の感性や主観などを、ECで扱うために考え出されたのが、対話型進化的計算手法 (Interactive Evolutionary Computation/IEC)である [5]。
端的に言うと、IECはECの適応度関数を人間に置き換えたものである。IECでは、集団内の各個体をあらかじめ定められた適応度関数によって評価するのではなく、ユーザーが各個体を直接評価する。すなわち、各個体は、環境にいかに適合するかではなく、利用する人間 (ユーザー)にとっての「好ましさ」によって評価され、次の世代での生存度が決定される。こうすることで、個人の好みや感覚などのユーザーの主観に基づく評価系をモデル化することなく、ブラックボックスのままでシステム内に取り込むことができる。従来のECが、生命がその誕生から現在に至るまで何十億年もの間、繰り広げてきた生存競争の結果としての進化の歴史に発想を得ているのに対して、IECは人間が行ってきた農作物や家畜の品種改良にヒントを得た方法であると考えることもできる。
このようなIECの手法をMax上に実装したのがGA4MAXである。GA4MAXを用いることで、対話型遺伝的アルゴリズム (Interactive GA/IGA)に基づく探索が可能になる。
Max上で多数のパラメータの最適化を行いたいという場合がある。例えば、音の合成 (FMなど)やフィルタの設定などを考えてみればよい。パラメータの数が少ないときは、自分で少しずつ値を変化させて、その影響をみるといった方法が可能であろう。しかし、パラメータの数が増えれば増えるほど、個々のパラメータの変化が他の要素に与える影響が複雑に絡み合い、欲しい効果を得るのが難しくなる。
そのような場合に、GA4MAXが役に立つものと考えている。複数通りのパラメータ・セットをGAで扱う遺伝子としてコーディングしたのものを集団として持ち、ユーザはそれぞれのセットについて、全体 (フィルタの効果、合成される音など)を聴いて/見て評価を与える。そして、GA4MAXはユーザの与えた評価に基づいて、次の世代の集団を生み出す。このサイクルを繰り返すことで、始めランダムに生成したパラメータのセットがやがて望みのものに近づいていくことが期待できる。
この手法の利点は、各パラメータの意味、全体に与える影響などを全く知らなくても、各個体を評価するだけで最適解に近いパラメータのセットを得ることができる点である。
今後、GA4MAXを応用した、シンセサイザやエフェクタといったパッチを制作する予定である。また、GAを応用して構造的な表現を可能にした遺伝的プログラミング (GP)についても、パッチあるいはオブジェクトを制作し、リズムやメロディーといった音楽構造の生成にも挑戦したいと思っている [6]。

4 おわりに

以上、筆者が制作したオブジェクト、パッチについて簡単に説明した。ここで紹介したオブジェクトは、ホームページ上で公開している。具体的な使い方については、それぞれのヘルプ・パッチが参考になると思う。バグ・レポートや要望などがあれば、ぜひ教えていただきたい。
全体を通してみて内容的にまとまりのないものになってしまったことを反省している。筆者のオブジェクトが読者のみなさんが制作活動を行う上で少しでも役に立つことがあれば、幸いである。

 

>>> 参考文献
[1] 足立紀彦, 酒井英昭 他. システム工学. コロナ社. 1996
[2] Apple Computer. "Technical Note TN1190 Power Manager 2.0". 1999
[3] http://www.propellerheads.se/
[4] 伊庭斉志. 遺伝的アルゴリズムの基礎. オーム社. 1994
[5] 高木 英行, 畝見 達夫, 寺野 隆雄. 対話型進化計算法の研究動向. 人工知能学会誌. 1998.
[6] Nao Tokui and Hitoshi Iba. "Music Composition with Interactive Evolutionary Computation" in Proc. 3rd Int'l Conference on Generative Art (GA2000), Italy, 2000


>>> 連絡先
e-mail: tokui@miv.t.u-tokyo.ac.jp
web: http://www.miv.t.u-tokyo.ac.jp/~tokui/


>>> 活動予定
11/20 Tue 22:00 -
"ache." / Bullet's (六本木)
DJ: Mizuki NOGUCHI
Live: JUMI ほか

12/6 Thu 22:00 -
"HANDS" / RockWest (渋谷)
DJ: Takuya Kashiwada (Complex UK)
Junya Asanabe, Yasushi Aoki
Live: Nao Tokui (Music Man)