チュートリアル52:
パッチャーストレージ

pattr とは?

Max にはデータの格納、管理のためのバラエティ豊かなオブジェクトが存在します。 tablefunbuffcollumenuubumenu のようなオブジェクトは全て情報を格納しますが、これは、手作業によって、あるいはパッチ自身によるメカニズムによってセットすることができます。preset オブジェクトもデータを格納しますが、これは、パッチャー内のユーザインターフェイスオブジェクトの「ステート(状態)」をキャプチャし、復元するために役立ち、パッチの複数のセッティングを1つのステップですばやく復元する機能を提供してくれます。これらのオブジェクトに関して復習しておきたい場合は、「チュートリアル 37:データ構造 」を参照して下さい。

しかし、時として Max プロジェクトでは、より洗練されたステート管理システムが必要になる場合があります。pattr ファミリのオブジェクト(pattrpattrhubautopattrpattrstrage)は、preset オブジェクトの機能に加え、より広範囲なステート管理機能のセットを提供します。

  • オブジェクトからのデータセットは、Max のパッチ階層を通してメンテナンスすることができます。例えば、pattr によってパッチャーや bpatcher オブジェクトの内部のオブジェクトの全てのステートをパッチのトップレベルからコントロールすることが可能です。

  • 任意のタイプのオブジェクトで使用される任意の型のデータを格納することができます(他のオブジェクトを必要とせず、単に pattr 自身に格納されるデータを含みます)。

  • pattr オブジェクトを使うと、パッチ内のどこからでも、pattr システムでコントロールされるオブジェクトのステートを遠隔操作によってセットしたり、問い合わせたりすることができます。

  • pattr オブジェクトが格納するセッティングのグループは XML ファイルとして保存されるため、Max の外部から容易に読んだり、編集したり、保存したりすることができます。

  • pattr オブジェクトは、指定した順序でオブジェクトのステートを復元することができます。これは、例えば、処理が正しく機能するための全ての変数が適切に設定される以前に、処理を開始するための toggle オブジェクトの復元が行なわれてしまうというような問題を避けるためです。

  • 1つのアドレスで参照される多くのオブジェクトのステートを格納できるだけでなく、複数のセッティングの間で滑らかなクロスフェードができるように、これらのステートの補間を行なうことも可能です。

  • pattr オブジェクトは、コントロール下にあるオブジェクトの現時点でのステートや、既に保存されているステートを見たり、管理したりするための、高レベルなインターフェイス機能を持っています。

このチュートリアルでは、pattr と pattrhub が持ついくつかの基本的な機能について見ていきます。そして、Max パッチのあらゆる場所からオブジェクトと遠隔的なコミュニケーションを行なうために、このオブジェクトがどのように使われるかを紹介します。

オブジェクトのバインド

・チュートリアルパッチ 52.pattr Basic.patを開いて、start と表示された toggle オブジェクトボックスをクリックし、metro オブジェクトをオンにして下さい。デフォルトの MIDI シンセサイザから MIDI ノートによる音が聞こえるはずです。metro オブジェクトに接続されたナンバーボックスは、パターンが生成されるスピードをコントロールします。パッチの右側にある色つきのメッセージボックスをクリックして下さい。これにより、パッチコードもなく、パッチ内には sendfowardreceiveといったオブジェクトも存在しないにも関わらず、ナンバーボックスの値が変わっていることに注意して下さい。


色つきのメッセージボックスをクリックすると metro オブジェクトの時間値が変更されます。

metro オブジェクトの右側にある pattr オブジェクトは、その上にあるナンバーボックスの値をコントロールしています。パッチャーストレージの言語の中では、これを「pattr オブジェクトが、ナンバーボックスにバインドされている」と言います。pattr オブジェクトにメッセージを送ると、pattr は常にナンバーボックスに格納されている値を参照します。これにより、pattr に対して、今どんな値がセットされているかを問い合わせたり、指定した値を遠隔的にセットするよう命じたりすることができます。

この pattr オブジェクトは名前「speed」を持っています。これは、オブジェクトのアーギュメントによって設定され、他の pattr ファミリオブジェクトとコミュニケートするために使われるものです。パッチの最下部にある pattrhub オブジェクトはメッセージを受け取り、そのメッセージをパッチ内の任意の pattr オブジェクトへ送ることができます。メッセージ speed 125pattrhub に送ることによって、このオブジェクトに対して、'speed' という名前を持った pattr を探すよう命じます。該当の pattr オブジェクトが見つかった場合、その pattr に対し、バインドされているオブジェクト(このケースではナンバーボックス)にメッセージ 125 を送信するよう指示します。

・パッチをアンロックして、metro オブジェクトに接続されたナンバーボックスをクリックし、Object メニューから Name... を選んで下さい。

この pattr オブジェクトの bindto アトリビュートはナンバーボックスの名前 ('temponum')にセットされています。そのため、pattr オブジェクトはナンバーボックスにバインドされます。Max オブジェクトの名前について、あるいは、このテクニックのパッチャースクリプトへの応用については、チュートリアル 46:「 基本的なスクリプト」を参照して下さい。pattrhub オブジェクトが、ナンバーボックス自身の名前('temponum’)ではなく、バインドされている pattr オブジェクトの名前('speed')によってナンバーボックスをコントロールしている点に注意して下さい。

・ナンバーボックスを何か他の名前にリネームし、Name Objectインスペクタを閉じて下さい。再びメッセージボックスをクリックして、パッチのセッティングの変更をしてみて下さい。

参照されるオブジェクトがリネームされると、pattr オブジェクトは、もはやそのオブジェクトにバインドすることができないという点に注意して下さい。再びバインドするためには、pattr に対してもう一度ナンバーボックスにバインドするように指示しなければなりません。

ナンバーボックスの Name Object インスペクタを開き、名前を 'temponum' に戻して下さい。インスペクタを閉じて、'temponum' にバインドする pattr オブジェクトを作り直して下さい(オブジェクトを削除し undo によって削除を取り消すか、新しい pattr オブジェクトを作ります)。再びメッセージボックスをクリックしてナンバーボックスが pattrhub オブジェクトからの更新を受信していることを確認して下さい。

pattr オブジェクトを作り直す代わりに、新しい「バインドされていない」 pattr オブジェクトに bindto メッセージとナンバーボックスの名前を送り、bindto アトリビュートを有効なオブジェクトに設定することができます。

他のいくつかの方法

Max オブジェクトに名前を付け、pattrbindto アトリビュートによってオブジェクトに明示的にバインドする方法は、pattr にパッチ内のオブジェクトを参照させる1つのやり方です。これは2つのオブジェクトの間のパッチコードによる接続を必要とせず、パッチャーの別々な場所から通信することが可能であるという長所を持っています。

・note というサブパッチを含むパッチャーオブジェクトをダブルクリックしてサブパッチを開いて下さい。このサブパッチには、8 個の pattr オブジェクトがあり、パターンジェネレータの 4 つのピッチを定義するナンバーボックスオブジェクト、およびピッチの個々のトリガとトリガの間のビート数を定義するナンバーボックスオブジェクトにバインドされています。これは、1つのcounter オブジェクト(メインパッチの metro オブジェクトによって駆動されています)によるポリリズミックな休みのパターンを作ることができるパッチの一部です。

・このウィンドウを開いたままメインパッチャーに戻って、メッセージボックスをクリックして下さい。異なるパターンをクリックした時に、サブパッチのナンバーボックスオブジェクトが正しく更新されているのに注目して下さい。


メッセージボックスをクリックすると、サブパッチの値も更新されます

pattr オブジェクトは、明示的な名前付けと bindto アトリビュートによってオブジェクトをバインドすることに加え、パッチコードの接続を通して他のMax オブジェクトをコントロールすることもできます。

サブパッチ notes は、これを行なう2つの可能な方法を示しています。

  1. pattr オブジェクト自身を使ってデータを格納する。
  2. pattr オブジェクトの中央のアウトレットを使って、自動的に pattr オブジェクトを他のオブジェクトとバインドする。

内部ストレージ

pattr オブジェクトがバインドされていない場合、pattr は左インレットへ送られたメッセージがどのようなものでも、そのメッセージを格納し、左アウトレットから呼び戻します。同様に、pattrhub オブジェクト からバインドされていない pattr へ送られたメッセージは左アウトレットからエコー出力されます。

・サブパッチ notes をアンロックし、‘val_a’、‘val_b’、 ‘val_c’、‘val_d’という名前をつけられた pattr オブジェクトの内の1つの左アウトレットに、hslider オブジェクトを取り付けて下さい。メインパッチのメッセージボックスをクリックして、pattr オブジェクトのステートを呼び戻して下さい。pattr オブジェクトに接続されたナンバーボックスをスクロールして下さい。hslider オブジェクトが連動して動きます。

ピッチをコントロールしている pattr オブジェクトはどの単体のオブジェクトもバインドされていません。そして、オブジェクトを直接参照する方法ではなく、値をメッセージとして受け取る方法によって、接続されたナンバーボックスオブジェクトの値を供給しています。結果として、これらの pattr オブジェクトに接続されたナンバーボックスオブジェクトは、削除され、他のオブジェクト(あるいは複数のオブジェクト)で置き換えることが可能です。pattr オブジェクトは(直接、または遠隔的に)値が変更されるとその値を出力するため、pattr オブジェクトに複数のオブジェクトを接続して、格納されているデータをセットし、表示することができます。

注:pattr の接続の途中に、'set' アーギュメントを持った prepend オブジェクトを使うことによって、pattr オブジェクトのステートを復元した時にMIDI イベントがトリガされるのを防いでいます。ほとんどの Max オブジェクトとは異なり、pattr オブジェクトは、直接 pattr に接続しているオブジェクトと、スタックオーバーフローを起こさずに相互に接続することが可能です。

自動的なバインド

・同じサブパッチで、mod_a’ ‘mod_b’ ‘mod_c’ ‘mod_d’と書かれている pattr オブジェクトの内のどれか1つの中央のインレットに hslider オブジェクトを接続しようとしてみて下さい

訳注:「中央のインレット」は、「中央のアウトレット」の誤植と思われます)。Max ウィンドウにエラーメッセージが表示され、プログラムは接続をしようとするのを妨げるはずです

pattr の中央のアウトレットによって、pattr と、同じパッチャー内の単一のオブジェクトとの自動的なバインドを行うことができます。% オブジェクトをコントロールしているナンバーボックスオブジェクトは、その名前によって手作業で pattr オブジェクトとバインドされている場合と同様、それぞれの pattr オブジェクトと通信を行っています。

・Object メニューから Name… を選んで、ナンバーボックスオブジェクトの名前を見て下さい。

pattr オブジェクトの ‘bindto’アウトレット(中央のアウトレット)は、名前を持っていないオブジェクトに対して、参照されるオブジェクト名を付けます。この名前は接続されているオブジェクトのクラス名に基づき、パッチ内に同じクラスによる複数のオブジェクトが存在する場合には、それぞれを識別するために順番に数字をつけて表すようにします(例えば、 ‘number’、‘number[1]’、‘number[2] など)。

・メインパッチに戻って、メインパッチの durs というサブパッチを含むパッチャーオブジェクトをダブルクリックし、サブパッチを開いて下さい。2つの pattr オブジェクト( ‘min’と ‘max’)があり、その中央のアウトレットによって、2つのナンバーボックスオブジェクトにそれぞれバインドされていることに注意して下さい。

全てを管理する1つのハブ

・サブパッチャーを閉じて、メインチュートリアルパッチに戻って下さい。メッセージボックスに再び注目し、その中でサブパッチャー内の pattr オブジェクトを参照する場合に使われる表記に注意して下さい。

・このチュートリアルにある pattr オブジェクトのほとんどはサブパッチャーの中にあるため、pattrhub オブジェクトはそれらの pattr を、次のようなフォームによるコロンで区切った表記法を使って参照しています。

subpatcher::pattr_name

同様な表記によって、ネストされた(入れ子になった)サブパッチャー内の pattr と通信することができます。例えば ‘yikes’という名前の pattr が stuff というパッチャー内にあり、これが things という bpatcher の中にある場合、pattrhub はそれらの名前によって次のようにアクセスします。

things::stuff::yikes

・メインチュートリアルパッチの中の ubumenu オブジェクトを使って、パッチにある pattr オブジェクトの中の1つを選択して下さい。

pattrhub を通じて pattr オブジェクトのステートを設定することに加え、pattr オブジェクトに対する問い合わせを行うことができます。これは、pattrhub に内部のステート、あるいはバインドされているオブジェクトの値を報告させるものです。これは、pattrhub に対して、get の後に 問い合わせる相手の pattr オブジェクトの名前を付けたメッセージを送ることによって行います。get と名前の間にはスペースを入れません。例えば、getspeed は ‘speed’ という名前の pattr のステートを取得します。

ubumenu の右側にあるナンバーボックスは、選択された pattr の現在の値を反映しています。pattrhub の2番目のアウトレットからの出力は、問い合わせを受けた pattr の名前から始まるメッセージになります。

ubumenu の次にあるナンバーボックスの値を変更して、選択された pattr の値を変えて下さい。pattr によってコントロールされるナンバーボックスを見に行くことによって、値が変更されることを確かめて下さい。他の pattr オブジェクトを何通りか選択しその値を変えて下さい。それによって、パッチ内のあらゆる所からオブジェクトのステートの問い合わせやセットを行うことを、システムはどのような方法によって可能にしているかをよく理解して下さい。

まとめ

pattr オブジェクトは、Max パッチの中の複数のオブジェクトからのデータを管理するために、パワフルな手段を提供してくれます。pattr オブジェクトは、自分自身の内部の情報を維持(最も左のインレットとアウトレットを通じての送信と再受信を行います)することができます。また、オブジェクトの名前と pattr オブジェクトの bindto アトリビュートによって、あるいは pattr オブジェクトの中央のインレットを使った自動的な名前付けとbindto アトリビュートによって、Max のユーザインターフェイスオブジェクトとバインドすることができます。個々の pattr オブジェクトは一度に1つのオブジェクトとだけバインドできます。pattrhub オブジェクトによって、パッチ、およびそのサブパッチの中にある全ての pattr オブジェクトのステートをコントロールすることができます。これらの pattr にアクセスするためには、階層的な表記システムをいます。この表記システムは、階層をなしているパッチャー名をダブルコロン(::)で区切り、最後に該当する pattr オブジェクトの名前を指定します。get メッセージ(get の後にスペースを空けずに pattr の名前を続けます)をpattrhub に送ることによって、pattrhub からパッチ内にある任意の pattr オブジェクトに対してステートを問い合わせることができます。

次のチュートリアルでは、pattr ファミリの他の2つのオブジェクトを見ることにします。これらによって、複数の Max オブジェクトを pattr システムにバインドし、複数の pattr オブジェクトからのデータのセットを格納したり、復元することが可能になります。

参照

pattr パッチャーに特化した名前付きデータのラッパー
pattrhub pattr オブジェクトをあなたのために動作させます!
patcher パッチ内にサブパッチを作成
preset 他のオブジェクトのセッティングの格納と復元
thispatcher パッチャーにメッセージを送信