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

イントロダクション

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

pattr とは?

Max プロジェクトでは、基本的なデータ構造オブジェクトで可能なものよりも、さらに洗練されたステート管理システムが必要になることがよくあります。pattr ファミリのオブジェクト(pattr、pattrhub、autopattr、pattrstrage)は、preset オブジェクトの機能に加え、より広範囲な、一連のステート管理機能を提供します。

  • オブジェクトからのデータセットは、Max のパッチ階層を通してメンテナンスすることができます。例えば、pattr によってパッチや bpatcher オブジェクトの内部のオブジェクトの全てのステートをパッチのトップレベルからコントロールすることが可能です。
  • あらゆるタイプのオブジェクトで使用される任意の型のデータを格納することができます(他のオブジェクトと関連せず、単にpattr 自身に格納されるデータを含みます)。

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

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

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

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

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

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

オブジェクトのバインド

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

チュートリアルパッチを眺めてみて下さい。start と表示された toggle オブジェクトボックスをクリックし、metro オブジェクトをオンにして下さい。noteout オブジェクトをダブルクリックして、有効なMIDIシンセサイザを選ぶと、音楽が聞こえるはずです。metro オブジェクトに接続されたナンバーボックスは、パターンが生成されるスピードをコントロールします。パッチの右側にある色つきのメッセージボックスをクリックして下さい。これにより、パッチコードもなく、パッチ内にはsend、foward、receiveといったオブジェクトも存在しないにも関わらず、ナンバーボックスの値が変わっていることに注意して下さい。

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

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

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

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

この pattrオブジェクトの bindto アトリビュートはナンバーボックスの名前 ('temponum')に設定されています。これにより、このpattrオブジェクトはナンバーボックスにバインドされます。Max オブジェクトに名前をつけると、pattr システムを介してそのオブジェクトにアクセスすることが容易にできるようになります。pattrhub オブジェクトが、ナンバーボックス自身の名前('temponum’)ではなく、バインドされている pattr オブジェクトの名前('speed')によってナンバーボックスをコントロールしている点に注意して下さい。

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

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

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

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

他のいくつかの方法

Max オブジェクトに名前を付け、pattr の bindto アトリビュートによってオブジェクトに明示的にバインドする方法は、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 のステートを取得します。

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

umenu の次にあるナンバーボックスの値を変更して、選択した pattr の値を変更して下さい。pattr にコントロールされているナンバーボックスを見て、値が変更されていることを確認して下さい。他の pattr オブジェクトを選択して、その値を変更して下さい。パッチ内のあらゆる所から、オブジェクトのステートの問い合わせや設定ができるようにしているシステムの動作についてよく理解して下さい。

結び

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

参照

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