チュートリアル 15:
アブストラクション(パッチオブジェクト)

イントロダクション

このチュートリアルでは、カプセル化の概念を拡張し、アブストラクション(パッチオブジェクト)を導入します。アブストラクション(パッチオブジェクト)の機能は、サブパッチのロジックを別の、再利用可能なファイルとして保存し、これを任意のパッチの中で使用できるようにするというものです。別ファイルとして外部に保存した後、アーギュメントを使用する形にアブストラクション(パッチオブジェクト)を修正し、個別のアプリケーションで便利に使うことができるような汎用のMax パッチを作ることができます。あなたが最もよく使う処理のプログラムをアブストラクション(パッチオブジェクト)として保存しておけば、それ以上全く手を加えずに別のプロジェクトで再利用することができます。

アブストラクション(パッチオブジェクト)は、あなたがすでに作成したプログラムを再利用する可能性を最大限に高めるものであると同時に、あなたのMaxに関する知識がより深いものであることを裏付けるキーになるものです。アブストラクション(パッチオブジェクト)のメカニズムにより、サブパッチに組み込みのMax オブジェクトと同じような外観を与え、同じように動作させることができます。また、アブストラクション(パッチオブジェクト)の機能をより柔軟なものにするために、アーギュメントの受信を可能にすることもできます。(訳注)

訳注:このイントロダクション部分の訳は、なるべくわかりやすくするために多少意訳している部分がありますが、それでも理解しにくいかもしれません。ここで、少々解説を加えておきます。

アブストラクションとは、前のチュートリアルで説明されている「サブパッチ」を独立したファイルとして保存し、これを他のパッチから通常のオブジェクトと同じように使用できる機能のことを言います。通常のオブジェクトにアーギュメントを与えることができるのと同様に、このアブストラクションにアーギュメントを与え、その値をアブストラクションの中で使用することができます(具体的には、アブストラクションの中にあるオブジェクトに #1 というアーギュメントを与えると、この #1がアブストラクション自身に与えられた第1アーギュメントで置き換えられます)。詳しくは以下のチュートリアルで述べられています。

日本では、別ファイルとして保存されたサブパッチを「パッチオブジェクト」と呼ぶことが多いようです(パッチでありながら、同時にオブジェクトのような動作をおこなうことができるという意味で、この呼び方は理解しやすいのではないでしょうか)。ここまでは、「アブストラクション(パッチオブジェクト)」という形で併記していましたが、これ以降は見やすさを考えて、別ファイルとして保存されたものを「パッチオブジェクト」と呼び、これを可能にするメカニズムを「アブストラクション機能」と呼ぶことにします。

大きなパッチの概要

チュートリアルを開いて下さい。

チュートリアルパッチの中には、3つの異なったパッチがあることがわかると思います。ここでは、その3つのパッチは全く同じことを実行しますが、アブストラクション機能のレベルが異なります。最初のセクション(1 と表示されています)は、これだけですべての機能を備えているパッチです。toggle によって metro をオンにすると、このパッチはスクリーン上のマウスカーソルをトラッキングし、lcd の画面にマウスの動きをそのまま縮小したものを描きます。このパッチでは bucket オブジェクトを使用しています。このオブジェクトの動作を示す簡単な例がlcd の左側にあります。最も単純な場合、値を受信すると、bucket は常にその前に受信していた値を出力します。これにより、bucket はイベント1つ分の遅れを発生させるオブジェクトとして使うことができます。メインパッチでは、カレントのマウス位置を1つ前のマウス位置を結ぶ linesegment メッセージを組み立てるために bucket が使用されています。セクション 1 の場合、スクリーン上に非常に多くのロジックが存在しているため、これをサブパッチにカプセル化すると便利なように思われます(これは、前のチュートリアルで行ないました)。しかし、マウスをポーリングし、これをスクリーンサイズに基づいてスケールするというこのパッチのロジックは、別のプログラムでも役に立つようにも思えます。このロジックをコピー、ペーストを行なわずに、他のパッチでも利用できたらすばらしいのではないでしょうか。

このような場合、パッチオブジェクトが威力を発揮します。パッチオブジェクトは別のファイルとして外部に保存されたサブパッチで、標準の Max オブジェクトと同じように使うことができます。あなたのパッチオブジェクトがMax のファイルサーチパスで見つかるのであれば、その名前を新しいオブジェクトボックスに入力して、あなたのパッチにこのパッチオブジェクトを直接ロードすることができます。このチュートリアルで使用しているパッチオブジェクトは、パッチがアクセスできるようにするためにチュートリアルと同じフォルダに置かれています。パッチオブジェクトのライブラリは簡単に作ることができます。そのためには、パッチオブジェクトをフォルダの中(あるいは、数多くのフォルダに分けてその中)に置き、そのフォルダをMax をインストールした場所にある "patches" フォルダの中、またはMax がファイルを探すことができる場所に置きます。

シンプルなパッチオブジェクトの使用

パッチの第2のセクション(2 と表示されています)では、動作するパッチオブジェクトを見ることができます。セクション 1 の metro をオフにし、スペースバーを押して(スペースバーを押すと、lcd をクリアします)、セクション 2 の metro をオンにして下さい。このプログラムが、前のものと寸分違わない動作をすることがわかるでしょう。WTHITM という「オブジェクト」(これは、"Where The Heck Is The Mouse(マウスはどこにいるの?)" の頭文字を取ったものです)は、実際には、セクション 1 でスケーリングを行なっていたロジックによるパッチオブジェクトです。(訳注)WTHITM というパッチオブジェクトをダブルクリックすると、新しいパッチウィンドウが開いてパッチオブジェクトの内容を表示します。この動作はカプセル化の場合と非常に良く似ていますが、1つだけ異なる点があることに注意して下さい。それは、このウィンドウをアンロックして編集することができないということです。これは、WTHITM が、チュートリアルパッチと同じフォルダの中にある別のパッチファイルとして存在しているためです。

訳注:原文では、「セクション 1 でスケーリングを行なっていたロジックのアブストラクション」という文になっています。これは、「実際のパッチの機能の一部を抽象化したもの」というニュアンスに受け取れます。「アブストラクション」と呼ばれるのはそのためではないでしょうか。

パッチオブジェクトは複数のパッチで共有するためのものであるため、1つのパッチでその内容を編集したいとは考えないでしょう。そうでないと、他のパッチで果している機能を壊してしまう恐れがあります。どうしてもパッチオブジェクトを編集したいという場合には、そのパッチオブジェクト自体を開く必要があります。File メニューから Open を選んで、パッチオブジェクトがあるフォルダを探し、"WTHITM.maxpat" を選んで、このファイルを編修することができます。あるいは、New File Browser(これもFile メニューの中にあります)で新規にファイルブラウザを開き、Max のサーチパス内の適切なフォルダを探すこともできます。最後に、WTHITMパッチャーウィンドウのタイトルバー上で [Alt]/[Option] + クリックする方法があります。これにより、ポップアップメニューが現れ、このバッチオブジェクトからトップまでのパッチ階層が表示されるので、このポップアップメニューで WTHITM を選ぶと、オリジナルのファイルが参照され、これを Max で開くことができます。

こういった方法によって、WTHITM のソースファイルを開くことを選んだ場合、再びパッチオブジェクトの内容が表示されますが、今度は、このロジックを編集することができます。何らかの変更を行なってファイルを保存すると、このパッチオブジェクトを使用しているすべてのパッチにこの変更が反映されます。これは、パッチがロードされている状態であっても同様です。WTHITM パッチオブジェクトに2個目のインレットを追加して保存すると、この動作を見ることができます。Max はパッチオブジェクトの新しいバージョンを見つけると、その瞬間にパッチオブジェクトを再ロードし、チュートリアルパッチの WTHITM パッチオブジェクトに新しいインレットを追加します。

WTHITM パッチを開いている間に、このパッチオブジェクトのinletオブジェクトとoutletオブジェクトに追加されているドキュメントを見てみましょう。inlet のインスペクタを開くと、いくつかの異なったタイプの組み込みドキュメントがあることがわかります。第1のものは Annotation と呼ばれます。annotation フィールドに置かれたテキストは、オブジェクトの上にマウスを置いた時にクルーウィンドウに表示されます。第2のドキュメントフィールド、Hint フィールドに置かれたテキストは、ロックされたパッチでinlet オブジェクトの上にマウスを置いたときに、ヒントバルーンの中に表示されます。最後に、Comment セクションに置かれたテキストはパッチャーの中には表示されません。しかし、このテキストは最も上のレベルのパッチで「オブジェクト」のインレットにマウスを置いたときに、アシスタンステキストとして表示されます。頻繁に使うパッチオブジェクトのinlet オブジェクトやoutlet オブジェクトにドキュメントをつけておくことは賢いやり方です。これにより、再利用可能なロジックのために、シンプルですが、効果的な資料を提供することができます。

WTHITM パッチオブジェクトの中では、より上のレベルのパッチについて知っておくべきことは何もありません。しかし、パッチオブジェクトに、lcd オブジェクトのサイズに基づいて出力を正しくスケールして欲しい場合にはどうしたらよいでしょうか?この場合、パッチオブジェクトにlcd のサイズを知らせなければなりません。これはパッチオブジェクトにアーギュメントを与えることによって可能になります。

パッチオブジェクトでの置き換え可能なアーギュメントの使用

チュートリアルパッチのセクション 3 は、セクション 2 と同じものです。しかし、このパッチオブジェクトは WTHITM_scaled という名前を持ち、2つのアーギュメントを持っています。このアーギュメントはlcd オブジェクトの横と縦のサイズを表すものです。"WTHITM_scaled.maxpat" パッチを(File メニューから Open コマンドを選んで)開くと、非常に面白いものがあることがわかります。掛け算の係数には、アーギュメントとして与えられた値の変わりに #1 と #2 が使用されています。想像がつくかもしれませんが、#1 は第1アーギュメントの値で、#2 は第2アーギュメントの値で置き換えられます。

これらの置き換え可能な値(ポンドサインアーギュメントと呼びます)は柔軟で、再利用可能なパッチオブジェクトを作るためのキーポイントです。"319." と "239." がパッチオブジェクトにハードコーディング(あらかじめ値をコードに書き込んでおくこと)されている場合、マウスの動きを表示するためには320 x 240 というサイズの lcd オブジェクトしか使用することができません。一方で、トップレベルのパッチにこの最後のスケーリングを行なわせた場合(セクション 2 はそのようになっています)、低いレベルのパッチで容易に抽象化できる作業を、トップレベルパッチで重ねて行なわなければなりません。パッチオブジェクトの中で置き換え可能な値を使用することによって、高レベルのパッチをシンプルなままにしておくことができます。

結び

あなたのロジックをパッチオブジェクトとして保存しておくことによって、追加のプログラミングを全く、あるいはほとんど行なわずに、将来の作業の中で再利用できるモジュールを作ることができます。これにより、あなたのMax の知識をこれから先のより効果的な仕事に振り向けることができ、モジュール化された、メンテナンスのしやすいプログラミングシステムを作ることが容易にできるようになります。

参照

bucket n個の段数を設定できるシフトレジスタ