この章の目的は、Pdのデザインとその働きを述べることにあります。実際的な事について(Pdの入手及び、インストールや運用のしかた等)は、次の章に記載されています。クリック・ノイズを出したり潰れたりしない時間変化する音の生成方法のような、ディジタル・オーディオ・プロセッシングの基礎を学習するためには、Dodge and Jerseの Computer Music という良質な参考文献があります。
音声出入力のピーク・レベルとクリップ・インジケーターがあります。 これらは全ての入出力チャンネルにわたるピーク・レベルを表示します。 ちなみに、DCとはインプット・レベルのことを示しています。多くのカードのDCレベルは50sになっています。 RMSのオーディオ・レベルを見るには"test audio and MIDI"をヘルプウィンドウから選択してください。 メインウィンドウの表示は、あなたが入出力のクリッピングを避ける手助けをするくらいにしか作られていません。各ピーク・メーターのon/offは左下のチェックボックスで切り替えられます。
右下のチェックボックスでは全オーディオ処理のオン/オフを切り替えます。オーディオをオフにしても音声の演算処理を停止させるだけで、オーディオ・デバイスは切り離されません。"audio"メニューから操作することもできます。また、ショートカット・キーでオーディオ処理をオフにするには"Control-."、オンにするには"Control-/"が使えます。オーディオがオンになると、Pdは(パッチが画面に表示されている/いないに関わらず)開かれているパッチに従ってオーディオ・サンプルをリアルタイムで処理します。
オーディオ入出力に同期エラーが起こると DIO (Digital I/O) インジケーターが点灯します。"DIO errors"ボタンをクリックすれば前に起こったエラーのリストを見ることができます。 普通このインジケーターは起動時は赤になり、演算処理が遅れた時(DAC FIFOなどが一杯になったりADC FIFOが空になったりした時)や、オーディオの入力と出力の速度が同じでなくなった時も赤になります。詳しくは オーディオとMIDIのサポート を参照してください。
Pdドキュメントは"patches"または"canvases"と呼ばれています。 Pd documents are called "patches" or "canvases." 開かれたドキュメントはそれぞれが1つのメイン・ウィンドウと複数のサブ・ウィンドウをもっています。サブ・ウィンドウは自由に開いたり閉じたりできますが、ウィンドウの表示の有無に関わらず常に作動します。以下はシンプルなPdパッチの例です:
このパッチには四つの text items が存在します。ナンバー・ボックス(0を表示)、"print"と表示されたオブジェクト・ボックス、そして2つのコメントです。ナンバー・ボックスとオブジェクト・ボックスは、ナンバー・ボックスの出力端子からプリント・ボックスの入力端子へと接続されています。各ボックスは幾つかの入力又は出力端子をもっており、入力端子は上に、出力端子は下にあります。
Pdのプリントアウトは標準出力へ表示されます。通常、Pdはプリントアウトやエラーメッセージを表示させる為の"Shell"か"terminal"ウィンドウから起動されます。
Pd パッチには四種類のボックスが存在します: オブジェクト, メッセージ, ナンバー, そして コメント です。
オブジェクト はテキストをオブジェクト・ボックスの中に書き込んで作成します。テキストはホワイトスペースで区切られた atoms に分割されます。 atoms の先頭は、そのオブジェクトのタイプを決定します。 その他の atoms は creation arguments と呼ばれ、そのオブジェクトの初期値として設定されます。 例えば…、
"+" はオブジェクトの class を決定します。 この場合オブジェクトは足し算を行う性質をもち、 "13"が足し算の結果として出力されます。 Atoms には数字もしくは"+"のような シンボル が使用されます。 オブジェクト・ボックスへ書き込まれたテキストによって、そのオブジェクトの持つ入力端子・出力端子の数と性質が決まります。 あるClasses("+"のように、常に決まった構成の入出力端子を持つような)と、その他の種類のClassesは、入出力端子が"creation arguments"に依存します。
以下はシンプルなMIDIシンセサイザーの例です:
このパッチは control オブジェクト(notein, stripnote, and ftom)と チルダ オブジェクト(osc~, *~, and dac~)を結合させています。 コントロール・オブジェクトは、ひとつか複数の event を引き起こすfunctionを"sporadically"(まばら?)に実行します。 この場合、MIDInote信号が入力され制御部分を始動させます。 computationの結果は、noteが"note on" である(または"note off"でない)場合、周波数を計算してオシレーター("osc~")に受け渡します。
パッチのもう半分、osc~, *~, and dac~オブジェクト群は、アナログシンセサイザーと同じ手法でオーディオサンプルを計算します。 osc~オブジェクトは二つの異なる信号(メッセージの型)の間のインターフェースとして振る舞います。 コントロール・メッセージをオシレーターの周波数として入力し、"*~"に対してオーディオシグナルを出力します。オーディオシグナルは断続的にではなく、連続した数列として常に流れています。 結果としてチルダ・オブジェクトはコントロール・オブジェクトとはかなり違った規則で動作します。 パッチの音声に関連した部分は、MIDIメッセージがあろうとなかろうと、常に動いています。 制御部分の働きは計算結果を音声処理部分に代入する、つまりは、オシレーターの周波数のような、音声処理部分のパラメーターを変化させることです。
パッチが動作している最中は、オブジェクトorメッセージ・ボックス内のテキストは固定していますが、 ナンバー・ボックスによって、変更が可能になります。 ナンバー・ボックス内の数字は、クリックやドラッグ&ドロップ、キーボードからの入力で値を操作できます。(shift-KeyやAlt-clickも使える。詳しくは getting help 参照のこと。)
ナンバー・ボックスと同様に、シンボル・ボックスも作成可能です。"cat."のような文字列型のシンボルは、ボックス内に直接文字列を書き込む(末端で"enter"を入力)か、"cat."というメッセージが入力端子に送信されるようボックスを配置してください.
2.1.4. パッチとファイル パッチを保存する際、Pdは全オブジェクトの全部の状態を保存するわけではありません。 あなたが確認しなければいけないの事は、オブジェクトの出力(creation arguments)と各オブジェクトの接続状態です。 確かなデータ構造を持つオブジェクトは、他のファイルへ読み書きの際、それ自身の内部状態を保存・復旧する機能を兼ね備えています。 Pdは起動時に設定された path を使ってファイルを探します。 pathには1つかそれ以上のディレクトリを設定します。複数の場合、各ディレクトリ名をコロン(windowsではセミコロン)で区切って列挙します。 ファイルを読みこむほとんどのオブジェクトは、サーチ・パスをもちいてファイルを探しますが、Pdからファイルを書き出す場合は、パッチ本体のあるディレクトリに出力されます。パッチには エディット・モード と ラン・モード があり、 モードの違いによってマウス・クリックの意味が異なります。(訳者注: これらのモードは、メニューの[edit]-[edit mode]のチェックボックスで切り替えられます。) エディット・モードでは、クリックやドラッグしてボックスを選択・移動したり、 ボックス同士の接続や切断をします。 ラン・モードでは、ボックスをクリックしてメッセージを送ります。 各ボックスはこれに対してそれぞれちがった反応をします。 ラン・モードでは、ナンバーorメッセージ・ボックスは制御用につかわれます。 普通、パフォーマンスをしている際にはラン・モードになっています。 パッチを編集するにはエディット・モードに移行してください。
あなたは4つのクラスの"テキスト・アイテム"(オブジェクト,メッセージ,ナンバー,コメント)を"put"メニューを用いて作成できます。("put"メニューには他にも"シンボル","配列","グラフ"といった項目がありますが、ここでは無視してください。) ショートカット・キーのメモ。 最初ボックスは空になっています。それらは自由にドラッグしたり、テキストを入力したりできます。
ボックスを選択したり"duplicate"していると、"Put"メニューを使うよりも便利なところが目につくはずです。いくつかのアイテムを選択したり複製すると、それらの結合関係も一緒に複製されます。
テキスト・アイテムを変更するには、アイテムを選択した後にテキストを 編集してください。一回クリックすると、テキスト全体が選択された状態にな ります。この状態でタイプした内容は選択されたテキスト全体と置き換えられ てしまいます。更にクリック・ドラッグを行って、置き換えるべき範囲を設定 してしなおしてください。
ある程度の分量を越えた(例えばコメントなどの)テキストがある場合、あ なたはEditメニューからテキストエディターを呼び出したいと思うかもしれま せん。"Send"ボタンを押すことで、Pdにテキストを再び入力するのと全く同等 のことができます。必要に応じて、一つ以上のボックスへ順番にそれを送るこ ともできます。
ボックスをクリックして、ボタンを離さずにマウスを移動させれば、ボッ クスをそろって移動できます。すでに選択されているボックスを移動させたい ときは、まず他の場所をクリックしてそのボックスの選択を解除してください。 そうしないとボックスの移動ではなく、テキストを選択した状態になってしま います。
オブジェクトの選択状態を解除すると、最新のテキストだけがパッ チの一部となります。 「オブジェクト」ボックス中のテキストを変更す ると、実際には古いオブジェクトが削除されて新たなオブジェクトが作成されま す; 古いものの内部状態が失われます。(訳者注: プロパティの設定内容がリセットされるという事。)
これまで挙げられたすべての「クリック」はマウスの左ボタンを押す動作で した。対して、マウスの右クリック動作は「プロパティ」や「ヘルプ」のポップ アップメニューに割り当てられています。プロパティはナンバー・ボックスおよ びグラフ(そして将来には同様な他のものにも)用に設けられています。オブジェ クト上で"Help"を選択すると、そのオブジェクトの使い方を示したPdパッチが開 かれます。キャンバス(すべてのオブジェクトの外側)のヘルプは、内蔵オブジェ クトの全リストが表示されます。
コントロール+Q でPdを終了する際には、本当に終了してよいか確認しま す。確認動作抜きで終了させるには、"control+shift+Q"を使用します。
Pdでは、オブジェクト同士が互いにメッセージやオーディオ信号を送ること で交信します。Pdのメッセージは散発的です。このことはMIDIメッセージや「ミ ュージックN」の"note cards"命令に似ています。
メッセージが、何か(メッセージを受け取り得るすべてのもの。多くの場合 はボックスの入力端子。)に対して伝達される場合、メッセージのセレクターは レシーバーと照合されます。レシーバーがそのセレクターのメッセージを認識す れば、それに応じた振る舞いが実行されます。例をあげてみましょう。以下にあ るのは "float" オブジェクトです:
(訳者注: ここの文章が特にこなれていない。つーか原文からわからん。)
ボックスの上部に付いている二つの黒い長方形は両方とも「入力端子」と呼 ばれています。左側の入力端子は、入力されたメッセージを"float"オブジェクト 自身へと流します。ゆえに右側の入力端子はメッセージを補助の「入力端子」オ ブジェクトへと流します。"float"オブジェクトは"float"と"bang"セレクターを伴ったメッセー ジを適切に(左手の入力端子で指示されたように)受け取ります。右手の入力端 子はメッセージ・セレクター"float"のみを受け取ります。これらの二つのセレ クターは、「シンボル」および「リスト」と共に、どんなオブジェクトにも、 その主要な動作を表すためによく使われています。これによって、オブジェクト 同士の非常に柔軟な接続が実現されています。
数値で始まるメッセージをタイプすることも可能です。ただし数値はセレク ターとして用いることはできません。単一の数値のみのメッセージには、自動的 に"float"セレクターが付加されます。また、複数個の数値で構成されたメッセー ジには自動的に"list"セレクターが付加されます。
メッセージが伝えられると、Pdでは常に、レシーバーがさらにメッセージを 送信します。またそれらのメッセージのレシーバーも他に対してメッセージを送 り得ます。したがって、個々のメッセージは(木構造からなる)一連のメッセー ジ集合を始動します。メッセージの木は階層の深いものが優先して実行されます。 例えば、以下に示すパッチの中では:
メッセージの到着の順序は A-B-C-D あるいは A-C-D-B のいずれかです。 「D」が終了するまで「C」のメッセージは終わりません。また、4つすべてが 終了するまで「A」は終了しません。(訳者注: この説明は 変。これだとAがA自身の終了に影響されることになるので無限ループになるよ) 「B」あるいは 「C」のどれが最初におこなわれるかは不定です; これは、あなたが接続をおこ なった順序によります。(Maxでは、接続順序は右から左に自動的にソートされます。)
メッセージの受け渡しによっては、ここに示された種類の無限ループが生じ
るかもしれません:
この例では、右手のものが結果「2」を送られるまで、左手の「+」は処理を 終了することができません。左手側もまた、右手側が「3」を送るまで処理を終 えられません。Pdはこのような場合に「スタック・オーバーフロー」を報告する エラーメッセージを表示でしょう。
しかしながら、"delay(遅延)"オブジェクトがどこかにある場合は、ループを作る ことは有効です。"delay"オブジェクトは、メッセージを受け取ると未来に備え て(遅延時間が0であっても)それをスケジューリング(訳者注: 時間軸にそって記録) します。その後"finished;"メッセージが送信されると、Pdの内部スケジューラが 記録されたメッセージを再生します。
少数の例外(特に"timer")を除いて、右側の入力端子へのメッセージがアウ トプットメッセージになりうるという意味から、オブジェクトは左端の入力端子 を「ホット」なものとして取り扱います。以下は有効(かつ合理的)なループの 構成です:
"f"は"float"を意味する略語です。"+ 1" の出力が "f" の右側の入力端子に接続さ
れていることに注目してください。この「コールド」な入力端子は、次に"f"が
"bang"を送信するときにそなえて、ただ値を格納しているだけです。
アクションを作るために、あるオブジェクトの2つ以上の入力端子にメッセージ
を送る形はかなりよく使われます。たとえば、二つの数値を加算するためには
"+" が使えます; しかし、動作を正確に行わせるためには、右側の入力端子に
最初に値が入っているか確認しなければいけません。さもないと左側の入力端子
に値が入った時点で(左側がホットな入力端子であるから) "+"オブジェクトは
加算結果を出力します。これでは、右側の入力端子に格納されたままの古い値を
用いて加算がおこなわれてしまいます。
ひとつの出力端子がひとつのオブジェクトの入力端子に(直接にあるいは任 意に長いメッセージパスの連鎖で)接続されていると問題が生じることがありま す。この場合、二つの入力端子がメッセージを受け取る順序がはっきりしていま せん。例えば、数を2倍にするために "+" を使用したいとします。下記は正しく ありません:
ここでは、左側の入力端子を接続する前に右側の入力端子を接続しました (パッチの外観を見てもそれは分かりませんが。) このように "+" は、前の (右側の)入力に新しい(左側の)入力を加えます。
"trigger(引きがね)" オブジェクト( "t" は短縮形)は、明確な順序で一 つの出力端子からの接続を分離するのにつかうことができます。慣習により、Pd の全オブジェクトは、出力端子が一つ以上ある場合のメッセージの送信を、右か ら左の順番でおこないます。接続線を交差させないで次のオブジェクトの入力端 子につなげば、左端の入力端子が最後となって普通望まれるような順番になりま す。この"trigger"の使い方は、前回の例をわかりやすくしたものです:
"Cold"な(左端ではない)入力端子は、たいがいの場合は単一の値(数値ある いはシンボルのいずれか)を格納するために使用されます。"line" と "line~" は例外で、これらのあたいは "sticky,"(粘質) なものです。つまり、一度設定 された値は、次に設定しなおすまでずっと有効になります。("line"の例外は健 全さのために存在します。)
もう一つ、実行順序に関する疑問がときどきあります。二つのメッセージが 一箇所の"cold"な入力端子におくられるときの順序についてです。このような状 況では、メッセージが結合されるので、最後に受け取られた値が演算に使用され ます。
上記のメッセージボックスの1番めは単一の数値1.5を含んでいます; この メッセージは暗黙のセレクター"float"を持っています。2番めはその中に3つの数 値のあるリストです。3番めのボックスの中身には、"my"というセレクターと、数 値5とシンボル"toes(足指)"という二つの引数が入っています。
以下のように複数のメッセージをカンマを使って区切ることも可能です:
三つのメッセージは数値1,2,と3です。これらは順番に送信されます。 ("trigger" オブジェクトのそれと同様に、各送信は連続しておこなわれます。 さらには、深度優先の結果、"1"に依存する一連のアクション全部が、"2"に 依存しているすべてのアクションより先に起こります。)
セミコロンを用いてもメッセージを区切ることができます。セミコロンに続く メッセージは、目的地を与えるシンボルを指定しなければいけません。 (言い換えれば、セミコロンは、次のメッセージが新しいものを指定するために 「現在の目的地」を明確にすることを除いてカンマに似ています。) はじめの 「現在の目的地」は、そのメッセージボックス自体の出力端子です。 下記の例において、 セミコロンに続くメッセージは直ちに、出力端子から"fred"という名前のオブジェ クト(ここでの受信側のオブジェクト)に出力されます。同様に、その次のメッセー ジも "sue" へと送信されます。
あるほかのオブジェクト(Pdウィンドウや配列など)はPdネームを持ってお り、この名前を使ってオブジェクトにメッセージを送ることができます。さらに は、スペシャル・オブジェクト "Pd" が定義されており、これにはDSPのスター ト・ストップを指示するメッセージを送ることができます。
あなたは以下に示されるようなメッセージボックス中に変数を入れることがで きます:
"$1"は、受信したメッセージの変数を参照します。("bang"メッセージある いは、このメッセージボックスをクリックして活性化した場合は、"$1"は定義さ れません。) ドル記号変数は、受信したメッセージによって数値かシンボルど ちらかに決まります。シンボルである場合、それを用いて可変メッセージセレクターか 可変ディスティネイション指定とすることもできます。
Pdを用いてオーディオ・パッチを作成できます。オーディオ・パッチにより 楽音を合成したり、入力した音声の分析・加工して出力したり、音声処理を他の メディアに統合したりできます。この節は、Pdがどうオーディオ信号を扱うか解 説します。
Pdのオーディオ信号はソフトウェアの内部で32bit浮動小数点数に固定され ています。したがって、あなたは必要なダイナミックレンジをすべて利用できま す。しかしながら、オーディオI/Oはハードウェアに依存するのでたいていは 16bitか24bitに限られます。入力はすべて-1から1の間の値になります。また、 出力される値はこの範囲に切りおとされます。
コマンドラインから指定しない限り、Pdのサンプルレートは41100に設定され ます。Pdはこれがオーディオ入力・出力のサンプルレートと一致しているかチェッ クしません。また、Pdはあなたのコンピュータのオーディオ・サンプルレート をPd自身のサンプルレートとして設定しません。もしオーディオ・システムが正 しくないサンプルレートで動いていた場合、オーディオ出力は移調されるでしょ う。("test audio and MIDI"パッチを使ってこれを調べることができます。ヘ ルプメニューを見てください。)
Pdは"soundfilter","readsf","writesf"オブジェクトを用いて、WAV, AIFF, AU形式(サンプリング・レートが16-bitか24-bit固定小数点あるいは32-bit浮動小 数点)のファイルでサンプルを読み書きできます。
入力端子もしくは出力端子は、メッセージかオーディオ用どちらかに構成さ れます。オーディオ出力端子と非オーディオ入力端子を接続(もしくはその反対) するとエラーになります。通常これらのエラーは、オーディオが開始するかネッ トワークがオーディオ実行と交換される「ソート時」に検知されます。オブジェ クトの左端の入力端子はオーディオ及びメッセージの両方を受信できますが、左 端以外の入力端子はどちらか一種類のみしか受け付けません。入力・出力端子が オーディオ用であるかメッセージ用であるかを素早く判別する方法はありません。 オブジェクトのヘルプウィンドウを調べてください。
オーディオ・ネットワーク(すなわちチルダ・オブジェクトの相互連結)は 非循環形式でなければいけません。もしループになっていると「ソート時」にエ ラーメッセージが表示されます。ソートの際に報告されたエラーは、原因を突 きとめるのが容易ではありません。非局所的信号の接続を使用して、フィードバッ クを備えたアルゴリズムを構築するのが好ましいでしょう。
サブパッチは "inlet~" と "outlet~" によってオーディオ入力・出力端子 を備えることができます。
制御変数(数値)をシグナルとして使用したいときは、それを変換 するために "sig~" オブジェクトを使用します。"+~", "-~", "*~", "/~" "osc~" および "phasor~" は、数値とシグナルを入力として受け取ることができ ます。
反対にシグナルを数値に変換したい場合、シグナルをサンプリングしたい瞬 間に指定する必要があります。これは "snapshot~" オブジェクトによって扱わ れます。また、"tabwrite~" を用いてもサンプリングをおこなえます。また、サ ンプルの読み出しには "tabread", "tabread4"(注意! チルダ記号が付きません! ) を使うこともできます。さらに分析用のオブジェクトも存在します。そのなかで 最もシンプルなものが、"env~"(エンベロープ付加オブジェクト) です。
ブロックサイズを64より大きくすると、実行効率が少し良くなるはずです。 さらに、"fft~"に関連するオブジェクトはブロックごとに動作するので、ブロッ クサイズの設定はFFTチャンネル数にも反映されます。 メッセージ/オーディオのフィルター分解能を向上させるために、あるいはフィー ドバック・アルゴリズム中で「ブロック遅延」を縮小するために、あなたは64未 満のブロックサイズを使用したいと思うかもしれません。(テストはしていませ んが)極端にいえば、ブロックサイズを1にセットすることで再帰的なフィル ターを記述することができます。
DSP演算処理の見積もりに"switch~"が使えます。例えば、2つの合成アルゴ リズムを切り替えたいと思うかもしれません。それぞれのアルゴリズムをサブパッ チ(これはボイス・バンクなどのために、内部にサブ・サブ・パッチを更に格納 できる)に格納して、各々をオンにして切り替えてください。アウトプット・レ ベルの制御に"line~"を使用しているならば、アウトプット・レベルが0になるま で時間がかかります。あるいは、0になるまでの間は動かすことができないでしょ う。
サブパッチがオフになるとき、そのオーディオ出力はゼロになります。これ はかなり小さなオーバーヘッドを要します。切り替えられるモジュールの内部に "throw~" 、外部に "catch~" を使用することで、より安価に出力を得られます。
"Send~"はシグナルを保ちます。シグナルは何回も"receive~"に受信されま す。"receive~"は一度に単一の"send~"からしか受信できません。(しかし、 対応する"send~"を好きなときに切り替えることができます。)
異なるブロックサイズのウィンドウ間で、"throw~"と"catch~"もしくは "send~"と"receive~"の接続を試みないでください。再ブロッキングのメカニズ ムが十分にテストされているのは "inlet~" と "outlet~" だけです。
(訳者注: 次の段落の前半は訳の質がいまいちです。誰か教えて!)
チルダ・オブジェクトのソートされたリストのなかでより早いポイントにシ グナルを送る場合、シグナルはDSP演算処理の次のサイクル(1ブロック後)まで そこに届きません。したがって、1ブロック(1.45ミリ秒)遅れるでしょう。 "delread~"と"delwrite~"は同じ制限を持っています。この1.45ミリ秒はとりう る最小の遅延です。たとえば単純なフランジャーのようなシンプルなアルゴリ ズムのために、"delread~"が"delwrite~"より後ろの順番にソートされるようにし たい場合があるとします。これを確実におこなう唯一の方法は、"delwrite~"を 先に作成して、その後で"delread~"を作成することです。ぐあいが悪いときは、 一旦"delread~"を削除して作成し直してください。
インターバルのあいだに、ディレイが終了したり外部入力(MIDIやマウスク リックとか)が発生したりするかもしれません。これによってdepth-firstなメッ セージ・パスのカスケードが発生します。これらのカスケードは、次のメッセー ジかDSP演算が処理されるまえに終了します。メッセージがDSP演算処理の間にオ ブジェクトへ渡されることはありません。各DSP処理の時間間隔は最も小さな処 理単位となります。メッセージカスケード中で変更されたパラメータは、次のオ ブジェクトに渡されると同時にその効果を現わします。
メッセージカスケードの途中で、あなたは遅延0のスケジューリングを記録 できるかもしれません。論理的には同時ですが、実際には、現在のカスケードが 終了した後で、この遅延0のカスケードが起こります。
Pdのスケジューラはその演算処理上での(ユーザ指定された)優先順位を維持 します; すなわち、予測できない演算処理量の増加をでき得る限り吸収するた めに、Pdは実時間よりほんの少し先まわりした処理をしようと試みます。これは、 "audiobuffer"または"frags"コマンドライン・フラグを使って指定されます。 (getting Pd to run を参照)
Pdが実時間より遅れてしまう場合、オーディオ・ストリームの入出力に途切 れが(時々または頻繁に)起こるでしょう。対して、ディスク入出力系のオブジェ クトは正確に動作しますから、Pdをサウンドファイル処理を伴うバッチ・プログ ラムとして用いることも可能です。このような用途の補助となるよう、スタート アップ・フラグ"-nogui"と"-send"が提供されています。
Pdの「リアル・タイム」演算は、(別個のプロセスで動作する)Pd自身の GUIとCPUタイムを奪い合います。いつかは、この問題を防止するフロー制御メ カニズムが実装されるでしょう。しかしどんな場合でも、Pdが音を出している最 中はGUIの描画を軽くするほうの賢明です。 サブウィンドウが閉じられた場合、 パラジウムはそのウィンドウのGUI描画メッセージを抑止します。バージョン 0.32の時点では、ウィンドウを最小化してもこの効果はありません。あるウィン ドウを使用していない場合は、実際にそれを閉じるべきです。
(訳者注: 次の段落は訳出に自信がありません。原文も参考にしてください。)
メッセージ・カスケードが外部イベントによってスタートする場合、時間タ グが与えられます。時間タグはスケジュールのタイムアウトと計算されたDSPタ イミングが予定どうりであることを保証します。つまり、つまり、時間は減少し ません。(しかしながら、Pdあるいはハードウェアドライバーが、インプットの あった物理的な時間を間違えるかもしれません。このことはオペレーティング・ システムに依存します。)"timer"オブジェクトは、メッセージカスケードの論 理的なタイムスタンプに従って、時間間隔を計測します。その結果、"delay"オ ブジェクトは常に理論値を与えます。(反対に、非決定論的でない結果とともに 実時間を測定するのが、"realtime"オブジェクトです。)
2つのメッセージ・カスケードが論理的に同時刻上にスケジューリングされ た場合、それらはスケジュールへ追加された順に実行されます。
オブジェクト・ボックス中では、メッセージボックスと同様に、テキストは メッセージとして機能します。しかしここで、メッセージは一度Pd本体に渡され ることになっています。このメッセージによって該当するオブジェクトが生成さ れます。ファイルを読み込んだ際に、ファイル中すべてのオブジェクトはテキス トを「生成メッセージ」に使用して作成されます。新しいメッセージをオブジェ クト・ボックスにタイプ入力した場合、古いオブジェクトは破棄され、変更した メッセージによる新しいオブジェクトの生成がおこなわれます。
メッセージのセレクター(メッセージ列の先頭要素)は、Pd本体に読み込まれ、 生成すべきオブジェクトの特定作業に利用されます。メッセージ列の残りの要素 は、生成されたオブジェクトの設定値(「生成引き数」とも呼ばれる) として利 用されます。従って、"makenote 64 250" のセレクター"makenote"は生成すべき オブジェクトの型を決定し、生成引き数である 64 と 250 はそれぞれベロシティ (変化速度)とデュレーション(持続時間)の初期値となります。
サブパッチの作成はこの限りではありません。サブパッチの設定状態はその 配置そのものだからです。特別な例として、この設定状態はパッチがファイルか らロードされた際にも再現されます。またサブパッチの名前を変更(たとえば "pd spot"を"pd jane"に)した場合、サブパッチの内容は保持され、オブジェク ト・ボックスのテキストとサブパッチのウィンドウ・タイトルのみが変化します。
生成引き数を後で上書きするつもりならば、それらを"makenote 64 250"と して指定するのはおそらく悪いスタイルです。これは、パッチを理解しようとす る人を混乱させる原因になります。
オブジェクト・ボックスは様々なクラスをもっているかもしれません。普通 クラスは生成メッセージのセレクターによって決定されます。通常はシンボルが 生成メッセージの第一要素になっています。
各クラスは、それが送られるかもしれないメッセージの固定コレクションに 付属します。たとえば、"float"または"f"オブジェクトは"bang"と"float"を受 け付けます。これらのメッセージは、左端のhotな入力端子を通して"float"オブ ジェクトに送信されます。(右の入力端子は独立した補助的なオブジェクトです。) クラス"float"のオブジェクトはメッセージ"bang"に反応して、現在保持している 値を出力します。すなわち、"float"メッセージを自身の出力端子へ送信します。 また、"float"メッセージに対しては、メッセージの値を保持すると同時に出力 して反応します。
Pd中の("float"のような)他の各クラスは、独自にメッセージ応答プロトコル を備えていて、 "float"と"bang"メッセージの代わりに(またはそれに加えて)他 のメッセージを受け付けます。
(訳者注: 原文'Unless they arrange otherwise by defining a "list" method,' が理解できず訳が変。)
もしオブジェクトが"list"メソッドの定義により他の方法で配列しなかった 場合、オブジェクトはinlet(入力端子)に対して"list"メッセージを要素ごとに 分配します。ただし、"float"または"symbol"メッセージとして、オブジェクト に渡される第一要素が適切であった場合は除きます。
オブジェクト・ボックスはテキスト(Pdにオブジェクトを作成・初期化する メッセージ)を含んでいます。ここで、ロードされたパッチのコンテキストか ら $1, etc., が得られたとします。パッチが新規のドキュメントであるまたは ファイルから開かれた場合、"$"変数は確定していません。しかしパッチがアブ ストラクション(次節を参照)である場合は、アブストラクションの生成引き数に よって設定されます。
"$1-x" のような構成は文字列の連結によって拡張されます。これはローカ ル変数を作るためのメカニズムです。特に、アブストラクション中の $0 はその アブストラクションに唯一であることが保証されているカウンターです。 よって "$0-bear" のような名前を使っての受け渡しを、ローカルな送信/受信の ペアとして使うことができます。
これらのオブジェクト"inlet", "inlet~", "outlet" と "outlet~"を、サブ パッチに設置すると、サブパッチを含んだオブジェクト・ボックスに入力端子と 出力端子が設置されます。これはワン・オフ・サブパッチおよびアブストラクショ ンの両方に等しくはたらきます。チルダ記号のついた "inlet~" と "outlet~" は、オーディオ・シグナル用の入力端子と出力端子を作成します。サブパッチの 入力端子や出力端子にメッセージとオーディオを混合することはできません。 それぞれの端子に一種類のみを割り当てなければいけません。
呼び出し・ボックス(オブジェクト・ボックス)上の入力端子と出力端子は、サブパッチに表示されているのと同じ順で、左端から順に表示されます。
アブストラクションはオブジェクト・ボックスにパッチの名前(".pd"拡張子は除 く)をタイプ入力することでinstantiateされます。さらに引き数をタイプするこ ともできます; たとえば、もし"my-abstraction.pd"というファイルを持ってい る場合、"my-abstraction 5" と入力することで、変数 $1 に 5 を設定できます。 これはアブストラクションのオブジェクト・ボックス(メッセージにではない) にのみ有効です。(メッセージ・ボックスでの "$1" などは、前述したものとは 違った意味になります。) もしアブストラクションの生成引き数に $1 が伴っ ているメッセージを送りたい場合、オブジェクト・ボックスから "float $1", "symbol $1" もしくは "pack $1 $2" のような、メッセージ・ボックスに送るた めのメッセージを生成しなければいけません。
(訳者注: ごめんなさい訳が変です。原文が理解できま せんでした。:< )
Max(opcode及びIRCAMの両方)でこれに関連している構成概念は "#1" でした。
"#1"のアブストラクション中の事象は生成引き数によって取って代わられています。
これは、"#"変数が代用されている為に、パッチ中でinstantiatedされるように
はアブストラクションを編集できないという不利をもっています。Pdにおいて、
オブジェクト・ボックス中の "$"変数は、文字通り"$"変数を意味します。ゆえ
に、それを呼び出しているパッチの内部から編集することが有意義なものになっ
ています。しかしながらPdの側で、メッセージ・ボックスよりオブジェクト・ボッ
クス中で別々の時間に "$" が拡張される不利益があります。