オブジェクト指向MAX#1 モジュール化のための機能

初めまして、nanonumです。
さて突然ですが

  • 同じオブジェクトを同じように組んでいる時が何度もある
  • あるシンセを他のパッチにコピーしたいがコピーすべき範囲がぱっと見分からない
  • 他のパッチにコピーしたエフェクトがなぜか動かない
  • 今までに作ったシンセのパラメーター範囲が周波数だったり0〜1や0〜127などバラバラだった

などといった経験はないでしょうか。

このような「以前作ったパーツが別のプロジェクトでうまく再利用できない」という悩みはMAXだけに存在するものではなくテキストベースのプログラミングにおいても昔から議論されており、本屋のプログラミング書籍コーナーにはそれだけについて書かれた本が何冊も並んでいるような状態ですが、MAXにおいてはまだあまり問題視されていないように感じます。

先日公開されたMAXER JPインタビュー#1ではモジュール化・ライブラリの構築にスニペットなどが便利であると書きましたが、第1回の本記事ではまずそれらの機能について一通り解説をします。そして連載を通じてオブジェクト指向などの考え方を借用しながらパッチの再利用性・メンテナンス性の向上をお伝えしていければと思います。

もくじ


 patcher(アブストラクション)

patcher

最も基本的なモジュール化の機能。
カプセル化によるグループとは違い、サーチパス内に保存されたmaxpatを参照として呼び出します。

画像の例ではまずinletとoutletを持ったbang2click.maxpatをサーチパス内に保存し、その後標準オブジェクトのようにmaxpatのファイル名と同じ[bang2click]というオブジェクトを作成することで先ほど保存したmaxpatが呼び出されています。(patcherオブジェクトへの名前指定[patcher bang2click]とは違うので注意)

今はオブジェクトが6個並んでいますが中身が個数分複製された訳ではなく全てのコピーが同じファイルを参照しています。そのため、オリジナルのbang2click.maxpatを編集すると複製されている6個全ての中身が自動的に更新されるので、変更のたびに全てのサブパッチを修正するといった作業が必要ありません。

patcherはこれ以降紹介する手法においても役立つテクニックなので是非覚えておいてください。


 bpatcher

bpatcher

上記のpatcherにUI表示の機能がついたオブジェクト。新規オブジェクト作成時に[bpatcher〜]に続いてmaxpatの名前を入力するか、インスペクタでファイルを指定することで外部ファイルを呼び出すことができます。その他の機能は通常のpatcherとあまり変わりませんが、bpatcherの場合UIオブジェクトを利用するのでプリセットやパラメーター管理のためにpattrやautopattrなどを使ったパラメーター管理についても考える必要があります。

スクリーンショットはインタビュー記事で書いたbpatcherによる自作ライブラリでモジュラーシンセ系ソフトのように扱うことが出来ます。MAX7の新機能BEAPやVizzieもbpatcherを中心として作られているので、モジュール化によって作業がどう変わるのかを想像するのにまずそれらを試してみるのも良いでしょう。


 スニペット

snippet

MAX7から導入された、複数のパッチの集まりを保存・管理して他のパッチで再利用するための機能。

オブジェクトを選択し、ウインドウ下部にある[ +add snipet ]をクリックすることで保存され、スクリーンショットも自動的に用意されます。保存されたスニペットは左側のツールバーのスニペットアイコンや右クリック > Paste From > User Snippetsなどから編集画面に追加することができます。

保存した元のパッチからは完全に切り離されるので、追加したオブジェクトを削除したりパッチの場所を移動したりしても問題はありません。ただし登録するオブジェクトの中のpatcher/bpatcherなどが参照になっている場合はオリジナルを変更した時にスニペット内のpatcherにも影響が出ます。また保存時同名のスニペットがすでに存在する場合は上書きではなくsnippet-1のように自動的に数字が付けられてしまうので注意してください。保存したスニペットの実態はユーザーディレクトリのSnippet以下にmaxsnipという拡張子で存在しています。

File Browserと組み合わせることでタグ管理できるようなのですがまだそこまで踏み込んでいないので今回はとりあえず簡単な紹介にとどめます。


 clipping/Paste From

Clipping / Paste From

MAX7でスニペットとして再デザインされたと思われるClipping / Paste From。編集画面の右クリック > Paste Fromからオブジェクトの集合体を貼り付けられます。基本的な動作・挙動はスニペットと大体同じで、実際Paste Fromメニューの中からスニペットを呼び出すことも可能です。スニペットと同じく参照ではないので貼り付けたものを編集してもオリジナルには影響しません。

スニペットとは違いメニューから追加するのではなく指定ディレクトリにmaxpatを保存し一度再起動するという若干面倒な手順があります。またスクリーンショットも保存されません。さらにMax6の場合指定ディレクトリがディフォルトのサーチパス内に存在しているため他のオブジェクトと競合しやすいという問題もあります。自分の場合、競合を避けるためfilename(clip).maxpatなど確実に被らないであろう名前をつけています。


 amxd~

amxd~

Max7から実装されたmax for liveデバイス読み込み用のオブジェクトで、bpatcherのようにUIを埋め込むことも出来る。Ableton Liveの仕様に合わせてオブジェクトの入出力に制限がありますがデバイスごとのpowerスイッチオンオフによる負荷低減はMax上でも有効で、Liveで使用する場合固定されてしまう縦幅にも制限がないため、Maxしか使わないユーザーにも利用価値は高いと思われる個人的に今注目の機能です。


 prototype

prototype

単体オブジェクトの現在の設定値を保存しておく機能で、オブジェクトの右クリックメニューから例えばsliderのmaximum / minimum / 色などの設定を保存し、別のsliderからその設定を呼び出すことができます。インスペクタ上の設定以外にgen~やpatcherでは中身ごと保存することも可能です。注意しなければならないのはScripting Nameやumenuのリスト項目なども変更されてしまうため、見た目だけを変更したい場合はMAX7以降であればスタイル機能を使う方が安全です。

保存したprototypeは拡張子maxprotoとしてオブジェクトの種類ごとにフォルダ分けされ保存されます。そのためオブジェクト間での競合はしませんがsliderのprototypeをnumberに反映することもできません。

ちなみにprototypeというとJavaScriptのプロトタイプチェーンが連想されるかもしれませんが、こちらは特に何か継承されるものはないので設定のコピー・ペースト、と捉える方が正確かと思われます。


この他にも例えば本来ポリシンセのために用意されているpoly~を動的にpatcherを複製するだけのオブジェクトとして使用し、ドラム音源のような鍵盤ごとに違う音が出るシンセを作る方法。gen~オブジェクトを拡張できるgendspやgenexprファイル。jsオブジェクトから外部ファイルを参照するrequireなどパッチ開発の効率をUPする機能が用意されています。

gen/jsについては機会があればまた紹介していきたいところですがpoly~についてはまだ手探りの状態ですのでpoly~なら自分に任せろ!という方がいましたらMAXERJPまでご連絡いただけると助かります。

どの機能もまずそれを試すためだけのパッチを作り、条件を変えながら「こうするとどうなるのか、この場合はどう動くか」などを検証してテストし、記事では伝えきれない個々の機能についての癖なども掴んで行くことが大事かと思いますので色々と試してみてください。制作中のパッチで試すのは全くもっておすすめできません。

次回のテーマは「patcherを極める」を予定しています、お楽しみに。


オブジェクト指向MAX#1 モジュール化のための機能」への1件のフィードバック

コメントは停止中です。