Max/MSPとgen~、フィードバックとhistoryオペレーター


Screen Shot 2012-10-18 at 3.16.58 AM

Max6から新たに登場したgen~ですが、バリバリ使ってる人とオールドスクールなMSPのプログラミングしかしていないユーザーで結構差が開いてきているイメージです。

コンピューター言語に限らず、自然言語もそうなんですが、仕事しながら新しい言語を習得するのは時間的になかなか難しいのです。
新しい言語とまではいかないものの、gen~はこれまでのMSPのプログラミングとは結構違い、1サンプル単位での設計をできるようになったので、いわゆるモジュラーシンセのブロック的に積み上げて音を作るというより、本当に計算づくでプログラムを作るようなアプローチが中心になると思います。Maxはもともとそういうソフトですが、gen~は更に論理的にものごとを考える必要があります。

従来のMax/MSPだと音を出しながらあれこれ繋いでるうちに偶然おもしろいものが出来たりしたと思うんですが、gen~のプログラムは適当に繋いでも音にすらならないケースが多いと思います。
信号処理のアルゴリズムの引き出しがどれくらいあるか、音作りのためにどれくらい独創的な新しい処理を思いつくかということにつきると思うんですが、そもそもMax/MSPのオブジェクトとは違うものも多いのでまずはオペレーターと呼ばれるgen~オブジェクト内部で使用される最小単位の部品の理解を進めようと思います。

gen~で最重要オペレーターであろうhistoryはMax6以降では理解必須のものだと思います。
この記事ではhistoryオペレーターについてしか書きません。

historyオペレーターはgen~をダブルクリックして開くパッチャーの中でのみ使用できるオペレーターで(コンパイルが必要なgen~内部のオブジェクトはオペレーターと呼ぶようです)、1サンプルだけ遅延を生じさせてフィードバックループを作るためのオペレーターです。
なぜ1サンプルかというと、これが0サンプルであった場合にリアルに無限ループが発生してコンピューターが壊れてしまうからです。

historyオペレーターはアーギュメントをとることができます。第一アーギュメントはこのオペレーター一つ一つに任意の固有の名前を与えるためのもので、これはあってもなくても機能します。アーギュメント名は同じ名前でgen~の外側からMaxのメッセージを送ることもできます。[history counter 0]オペレーターに(counter 1)というメッセージを送ればその時点でhistoryは1にリセットされます。こういった1サンプル単位の処理をリアルタイムでできるのがgen~の特徴です。
第二アーギュメントはhistoryオペレーターが保持する初期値です。何も入れなければ0が代入されています。

untitled

例えば上のサンプルの左上のようにhistoryオペレーターの出力をループバックさせ、アーギュメントに1が入力された+オペレーターを経由してから入力に戻すと1サンプルごとに数値が1ずつ増えていくような出力をします。
gen~の出力はオーディオ領域なので、当然outオペレーターを通じてオーディオシグナルとして出力できますが、オーディオの振幅は基本的に-1.0から1.0なのでこのままではアウトです。
周期もありませんし、スピーカーのコーンをどんどん押していく力に変換されて、それが引き戻される方向には変化しないので、下手にオーディオ機器に接続したら壊れる可能性があります。

通常のDAWなんかではオーディオ機器が壊れるような音を出せるものは少ないのですが、Maxの出力は簡単に機材を壊すので、注意が必要です。

untitled2

historyオペレーターを何に使うか考えると、当然フィードバックループを持たせることができるので、フィードバック機能を持ったディレイを思いつくと思います。オーディオの信号の音量を一定の割合で減衰させたものを一定の時間の遅延後に入力に戻すというアルゴリズムでディレイはつくることができますが、それはMSPでも作れるものです。

historyを使う例でgen~でしかできないことというと、まず僕が東大でセンサーネットワークのプロジェクトで取得した値をどうにか面白い音響にできないかと思いついたのが、シグナルを1サンプルごとにサンプリングして、前のサンプルと足し算と割り算をして平均化して出力すると極端な変化が無い波形を生み出せるのではということなんですが、
でもこれは何てこと無い、ただのローパスフィルターのアルゴリズムなんです。
突発的な入力を防ぐというのは高周波を消すということと同じですもんね。

basic

onepole~オブジェクトの右上にある図と同じことをgen~でできます。
historyオペレーターを使って信号を1サンプル遅れで戻したものを原音と混ぜて、更にそのhistoryオペレーターにループバックさせるアルゴリズムはローパスフィルターです。
その戻す割合をコントロールすることでカットオフされる周波数は変わります。

他にも漸化式のようにn項がn-1項に依存して決定されるようなシステムはhistoryオペレーターを使って音としてモデル化しやすいです。
その実例として、カオティックな方程式を使って僕が作ったgen~のシンセサイザーが、しばらくしたら某所から発表になると思います。
プロダクトではありませんが、お楽しみに。

もしMax6の購入を検討しているけどgen~が必要かよくわからないという人は、今後このブログで何回かgen~を取り上げると思うので、それを見て判断してもいいと思います。

Max 6+Gen Max 6+Gen

Cycling ’74/MI7 Japan
売り上げランキング : 2052

Amazonで詳しく見る