<< Top
Pd Documentation 2 章: 操作方法

目次へ戻る

この章の目的は、Pdのデザインとその働きを述べることにあります。実際的な事について(Pdの入手及び、インストールや運用のしかた等)は、次の章に記載されています。クリック・ノイズを出したり潰れたりしない時間変化する音の生成方法のような、ディジタル・オーディオ・プロセッシングの基礎を学習するためには、Dodge and Jerseの Computer Music という良質な参考文献があります。

2.1 概観

Pdは音声や映像のリアルタイム処理を目的とした、グラフィカルなプログラミング環境です。 PdはMax/MSPシステムに似ていますが、Pdの方がずっとシンプルで柔軟です。その上Pdは(まだ)Max/MSPには搭載されていない2つの機能をもっています。 第一はMark Dank氏によるGEMパッケージを用いることで映像と音声を同時に処理できる事。第二はデータ構造の定義やデータアクセスに関して実験的な便宜がはかられている事です。

2.1.1. メインウィンドウ,キャンバス,プリントアウト

Pdを起動すると、"Pd"のメインウィンドウが現れます。また、ひょっとしたら、"キャンバス"や"パッチ"も表示されているかもしれません。主要なPdウィンドウはこのように見えます:

音声出入力のピーク・レベルとクリップ・インジケーターがあります。 これらは全ての入出力チャンネルにわたるピーク・レベルを表示します。 ちなみに、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"ウィンドウから起動されます。

2.1.2. オブジェクト・ボックス

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メッセージがあろうとなかろうと、常に動いています。 制御部分の働きは計算結果を音声処理部分に代入する、つまりは、オシレーターの周波数のような、音声処理部分のパラメーターを変化させることです。

2.1.3. メッセージ, ナンバー と シンボル・ボックス

ボックスの"ヘリ"は、テキストがどう解釈されるか、そのボックスの働きはどんな風かを教えてくれます。 オブジェクト・ボックスは、パッチがロードされた時に新しいオブジェクトを生成するために、テキストを使用します。 Message ボックスは、それが活性化されたとき(メッセージ入力かそれ自身がクリックされたとき)に出力するメッセージとして、テキストを使用します。 例えば以下のメッセージ・ボックスがクリックされると、"21"というメッセージを"13を加算する"オブジェクト・ボックスに対して出力します。

パッチが動作している最中は、オブジェクトorメッセージ・ボックス内のテキストは固定していますが、 ナンバー・ボックスによって、変更が可能になります。 ナンバー・ボックス内の数字は、クリックやドラッグ&ドロップ、キーボードからの入力で値を操作できます。(shift-KeyやAlt-clickも使える。詳しくは getting help 参照のこと。)

ナンバー・ボックスと同様に、シンボル・ボックスも作成可能です。"cat."のような文字列型のシンボルは、ボックス内に直接文字列を書き込む(末端で"enter"を入力)か、"cat."というメッセージが入力端子に送信されるようボックスを配置してください.

2.1.4. パッチとファイル パッチを保存する際、Pdは全オブジェクトの全部の状態を保存するわけではありません。 あなたが確認しなければいけないの事は、オブジェクトの出力(creation arguments)と各オブジェクトの接続状態です。 確かなデータ構造を持つオブジェクトは、他のファイルへ読み書きの際、それ自身の内部状態を保存・復旧する機能を兼ね備えています。 Pdは起動時に設定された path を使ってファイルを探します。 pathには1つかそれ以上のディレクトリを設定します。複数の場合、各ディレクトリ名をコロン(windowsではセミコロン)で区切って列挙します。 ファイルを読みこむほとんどのオブジェクトは、サーチ・パスをもちいてファイルを探しますが、Pdからファイルを書き出す場合は、パッチ本体のあるディレクトリに出力されます。

2.2. Pdパッチの編集

2.2.1. エディット・モードとラン・モード

パッチには エディット・モード と ラン・モード があり、 モードの違いによってマウス・クリックの意味が異なります。(訳者注: これらのモードは、メニューの[edit]-[edit mode]のチェックボックスで切り替えられます。) エディット・モードでは、クリックやドラッグしてボックスを選択・移動したり、 ボックス同士の接続や切断をします。 ラン・モードでは、ボックスをクリックしてメッセージを送ります。 各ボックスはこれに対してそれぞれちがった反応をします。 ラン・モードでは、ナンバーorメッセージ・ボックスは制御用につかわれます。 普通、パフォーマンスをしている際にはラン・モードになっています。 パッチを編集するにはエディット・モードに移行してください。

2.2.2. ボックスの作成

あなたは4つのクラスの"テキスト・アイテム"(オブジェクト,メッセージ,ナンバー,コメント)を"put"メニューを用いて作成できます。("put"メニューには他にも"シンボル","配列","グラフ"といった項目がありますが、ここでは無視してください。) ショートカット・キーのメモ。 最初ボックスは空になっています。それらは自由にドラッグしたり、テキストを入力したりできます。

ボックスを選択したり"duplicate"していると、"Put"メニューを使うよりも便利なところが目につくはずです。いくつかのアイテムを選択したり複製すると、それらの結合関係も一緒に複製されます。

2.2.3. 選択の方法

Pdウィンドウ内のボックスはクリックすることで選択されます。 ひとつ以上のオブジェクトを選択したい場合は、Shiftキーを押しながらクリックするか、"外側"をクリックして長方形の中にすべてのオブジェクトを入れてください。 接続線だけの選択はできません。ボックスのみが選択できます。 未選択のボックスをクリックすると、テキスト部分の編集にうつります。 ボックスを複数選択している場合は、テキスト部分はアクティブになりません。 テキストを編集するには、さらにクリックしてオブジェクトを選択しなおすか、ボックス内のテキストを選択します。

2.2.4. デリート,カット アンド ペースト

ボックスを選択して、かつテキストがアクティブになっていない場合は、backspaceキーを押すことでボックスを削除できます。メニューの項目から、カット,コピー,ペーストも行えます。「ペースト」は新しいオブジェクトを置く動作であることに注意してください。 "duplicate"はコピー&ペーストを一度に行うので、新しいボックスが出現します。 ドラッグすれば、それらをスクリーンの新しい場所にまとめて移動できます。 カット&ペーストはPdのウィンドウ間であれば働きますが、OSの機能とは統合されていません。テキストに対するCut/copy/pasteは未だ実装されていませんが、LinuxとIrixでは"X-paste"が"text"ダイアログ(メニューの"edit text"項目から選択)に対して実行できます。

2.2.5. テキストの編集

テキスト・アイテムを変更するには、アイテムを選択した後にテキストを 編集してください。一回クリックすると、テキスト全体が選択された状態にな ります。この状態でタイプした内容は選択されたテキスト全体と置き換えられ てしまいます。更にクリック・ドラッグを行って、置き換えるべき範囲を設定 してしなおしてください。

ある程度の分量を越えた(例えばコメントなどの)テキストがある場合、あ なたはEditメニューからテキストエディターを呼び出したいと思うかもしれま せん。"Send"ボタンを押すことで、Pdにテキストを再び入力するのと全く同等 のことができます。必要に応じて、一つ以上のボックスへ順番にそれを送るこ ともできます。

ボックスをクリックして、ボタンを離さずにマウスを移動させれば、ボッ クスをそろって移動できます。すでに選択されているボックスを移動させたい ときは、まず他の場所をクリックしてそのボックスの選択を解除してください。 そうしないとボックスの移動ではなく、テキストを選択した状態になってしま います。

オブジェクトの選択状態を解除すると、最新のテキストだけがパッ チの一部となります。 「オブジェクト」ボックス中のテキストを変更す ると、実際には古いオブジェクトが削除されて新たなオブジェクトが作成されま す; 古いものの内部状態が失われます。(訳者注: プロパティの設定内容がリセットされるという事。)

2.2.6. ボックスの接続と分離

二つのボックスを接続するためには、一方の出力をクリックして、もう一方のボッ クスの入力の上までドラッグしてください。実際には、最も近い入力と接続され るので、対象となるオブジェクト上のどこでマウスのボタンを離してもかまいません。 接続を解除するには、ただ接続線をクリックだけです。(その際カーソルが「x」 に変わります。)
(訳者注: ただし、メニュー項目"Edit"→"protect"の チェック・マークを外しておかないと、カーソルが「x」になりません。)

2.2.7. プロパティとヘルプ

これまで挙げられたすべての「クリック」はマウスの左ボタンを押す動作で した。対して、マウスの右クリック動作は「プロパティ」や「ヘルプ」のポップ アップメニューに割り当てられています。プロパティはナンバー・ボックスおよ びグラフ(そして将来には同様な他のものにも)用に設けられています。オブジェ クト上で"Help"を選択すると、そのオブジェクトの使い方を示したPdパッチが開 かれます。キャンバス(すべてのオブジェクトの外側)のヘルプは、内蔵オブジェ クトの全リストが表示されます。

2.2.8. 種々雑多なこと

コントロール+Q でPdを終了する際には、本当に終了してよいか確認しま す。確認動作抜きで終了させるには、"control+shift+Q"を使用します。

2.3. メッセージ

Pdでは、オブジェクト同士が互いにメッセージやオーディオ信号を送ること で交信します。Pdのメッセージは散発的です。このことはMIDIメッセージや「ミ ュージックN」の"note cards"命令に似ています。

2.3.1. メッセージの分析

メッセージは、数個の変数を伴ったセレクターを含んでいます。セレクターはシ ンボル(空白、セミコロン、カンマを含まない数字以外の文字列)です。変数は シンボルまたは数かも知れません。Pdの内部では常に、数値を32bitの浮動小数点数と して扱います。したがって、Pdの変数は-8388608と8388608の間で整数を正確 に表わすことができます。(Maxには整数および浮動小数点数のための個別のデー タ型があります。対して、PureDataは'浮動小数点数だけ'を用います。)

メッセージが、何か(メッセージを受け取り得るすべてのもの。多くの場合 はボックスの入力端子。)に対して伝達される場合、メッセージのセレクターは レシーバーと照合されます。レシーバーがそのセレクターのメッセージを認識す れば、それに応じた振る舞いが実行されます。例をあげてみましょう。以下にあ るのは "float" オブジェクトです:

(訳者注: ここの文章が特にこなれていない。つーか原文からわからん。)

ボックスの上部に付いている二つの黒い長方形は両方とも「入力端子」と呼 ばれています。左側の入力端子は、入力されたメッセージを"float"オブジェクト 自身へと流します。ゆえに右側の入力端子はメッセージを補助の「入力端子」オ ブジェクトへと流します。"float"オブジェクトは"float"と"bang"セレクターを伴ったメッセー ジを適切に(左手の入力端子で指示されたように)受け取ります。右手の入力端 子はメッセージ・セレクター"float"のみを受け取ります。これらの二つのセレ クターは、「シンボル」および「リスト」と共に、どんなオブジェクトにも、 その主要な動作を表すためによく使われています。これによって、オブジェクト 同士の非常に柔軟な接続が実現されています。

数値で始まるメッセージをタイプすることも可能です。ただし数値はセレク ターとして用いることはできません。単一の数値のみのメッセージには、自動的 に"float"セレクターが付加されます。また、複数個の数値で構成されたメッセー ジには自動的に"list"セレクターが付加されます。

2.3.2. 深度を優先した(depth-first)メッセージの受け渡し

メッセージが伝えられると、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の内部スケジューラが 記録されたメッセージを再生します。

2.3.3. hotな入力端子とcoldな入力端子。出力端子の発信順序。

少数の例外(特に"timer")を除いて、右側の入力端子へのメッセージがアウ トプットメッセージになりうるという意味から、オブジェクトは左端の入力端子 を「ホット」なものとして取り扱います。以下は有効(かつ合理的)なループの 構成です:

"f"は"float"を意味する略語です。"+ 1" の出力が "f" の右側の入力端子に接続さ れていることに注目してください。この「コールド」な入力端子は、次に"f"が "bang"を送信するときにそなえて、ただ値を格納しているだけです。
アクションを作るために、あるオブジェクトの2つ以上の入力端子にメッセージ を送る形はかなりよく使われます。たとえば、二つの数値を加算するためには "+" が使えます; しかし、動作を正確に行わせるためには、右側の入力端子に 最初に値が入っているか確認しなければいけません。さもないと左側の入力端子 に値が入った時点で(左側がホットな入力端子であるから) "+"オブジェクトは 加算結果を出力します。これでは、右側の入力端子に格納されたままの古い値を 用いて加算がおこなわれてしまいます。

ひとつの出力端子がひとつのオブジェクトの入力端子に(直接にあるいは任 意に長いメッセージパスの連鎖で)接続されていると問題が生じることがありま す。この場合、二つの入力端子がメッセージを受け取る順序がはっきりしていま せん。例えば、数を2倍にするために "+" を使用したいとします。下記は正しく ありません:

ここでは、左側の入力端子を接続する前に右側の入力端子を接続しました (パッチの外観を見てもそれは分かりませんが。) このように "+" は、前の (右側の)入力に新しい(左側の)入力を加えます。

"trigger(引きがね)" オブジェクト( "t" は短縮形)は、明確な順序で一 つの出力端子からの接続を分離するのにつかうことができます。慣習により、Pd の全オブジェクトは、出力端子が一つ以上ある場合のメッセージの送信を、右か ら左の順番でおこないます。接続線を交差させないで次のオブジェクトの入力端 子につなげば、左端の入力端子が最後となって普通望まれるような順番になりま す。この"trigger"の使い方は、前回の例をわかりやすくしたものです:

"Cold"な(左端ではない)入力端子は、たいがいの場合は単一の値(数値ある いはシンボルのいずれか)を格納するために使用されます。"line" と "line~" は例外で、これらのあたいは "sticky,"(粘質) なものです。つまり、一度設定 された値は、次に設定しなおすまでずっと有効になります。("line"の例外は健 全さのために存在します。)

もう一つ、実行順序に関する疑問がときどきあります。二つのメッセージが 一箇所の"cold"な入力端子におくられるときの順序についてです。このような状 況では、メッセージが結合されるので、最後に受け取られた値が演算に使用され ます。

2.3.4. メッセージ・ボックス

メッセージボックスはあなたがメッセージをタイプするテキストボックスです。 メッセージボックスは、そこをクリックしたり入力端子に何かメッセージが送ら れると活性化されます。活性化されたメッセージボックスは、その出力端子ある いは他の指定されたところにメッセージを送信します。

上記のメッセージボックスの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"は定義さ れません。) ドル記号変数は、受信したメッセージによって数値かシンボルど ちらかに決まります。シンボルである場合、それを用いて可変メッセージセレクターか 可変ディスティネイション指定とすることもできます。

2.4. オーディオ・シグナル

Pdを用いてオーディオ・パッチを作成できます。オーディオ・パッチにより 楽音を合成したり、入力した音声の分析・加工して出力したり、音声処理を他の メディアに統合したりできます。この節は、Pdがどうオーディオ信号を扱うか解 説します。

2.4.1. サンプルレートとフォーマット

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浮動小 数点)のファイルでサンプルを読み書きできます。

2.4.2. チルダ・オブジェクトとオーディオ・コネクション

Pdでのオーディオ計算は "osc~" のような「チルダ・オブジェクト」によって実行 されます。このような末尾にチルダ記号が付く命名法は、オブジェクトの特性を 示すために慣習的に使われています。チルダ・オブジェクトはオーディオ接続に よってつながれます。オーディオ計算が実行されるか、オーディオがオンである 最中にオーディオ・ネットワークを変更した場合、Pdは実行のためにすべてのチ ルダ・オブジェクトを線形順にソートします。その後この線形リストは 64(44100Hz)のサンプルそれぞれのブロックに流れ落ちます。これはオーディオ ・ネットワークが1.45ミリ秒ごとに動作することを意味しています。

入力端子もしくは出力端子は、メッセージかオーディオ用どちらかに構成さ れます。オーディオ出力端子と非オーディオ入力端子を接続(もしくはその反対) するとエラーになります。通常これらのエラーは、オーディオが開始するかネッ トワークがオーディオ実行と交換される「ソート時」に検知されます。オブジェ クトの左端の入力端子はオーディオ及びメッセージの両方を受信できますが、左 端以外の入力端子はどちらか一種類のみしか受け付けません。入力・出力端子が オーディオ用であるかメッセージ用であるかを素早く判別する方法はありません。 オブジェクトのヘルプウィンドウを調べてください。

オーディオ・ネットワーク(すなわちチルダ・オブジェクトの相互連結)は 非循環形式でなければいけません。もしループになっていると「ソート時」にエ ラーメッセージが表示されます。ソートの際に報告されたエラーは、原因を突 きとめるのが容易ではありません。非局所的信号の接続を使用して、フィードバッ クを備えたアルゴリズムを構築するのが好ましいでしょう。

サブパッチは "inlet~" と "outlet~" によってオーディオ入力・出力端子 を備えることができます。

2.4.3. メッセージからオーディオ、オーディオからメッセー ジへの変換

制御変数(数値)をシグナルとして使用したいときは、それを変換 するために "sig~" オブジェクトを使用します。"+~", "-~", "*~", "/~" "osc~" および "phasor~" は、数値とシグナルを入力として受け取ることができ ます。

反対にシグナルを数値に変換したい場合、シグナルをサンプリングしたい瞬 間に指定する必要があります。これは "snapshot~" オブジェクトによって扱わ れます。また、"tabwrite~" を用いてもサンプリングをおこなえます。また、サ ンプルの読み出しには "tabread", "tabread4"(注意! チルダ記号が付きません! ) を使うこともできます。さらに分析用のオブジェクトも存在します。そのなかで 最もシンプルなものが、"env~"(エンベロープ付加オブジェクト) です。

2.4.4. スイッチングとブロッキング

"switch~" や "block~" オブジェクトを使用することで、計算の一部分のオン・ オフや、計算するブロック・サイズのコントロールができます。 あるウィンドウに"switch~"や"block~"オブジェクトがあったら、それはウィンドウ 全体およびそこに属するサブ・ウィンドウ全部に対して作用します。"switch~" と"block~"は引数としてブロック・サイズおよびoverlap要因をとります。 例えば、 「block~ 1024 4」はサンプル・ブロックを1024に指定し、親ウィンドウに関し て因数4だけオーバーラップします。"switch~"を使用すると、ブロック・サイズ の変化によるオーバーヘッドにくわえて、計算による小さなオーバーヘッドが発 生します。

ブロックサイズを64より大きくすると、実行効率が少し良くなるはずです。 さらに、"fft~"に関連するオブジェクトはブロックごとに動作するので、ブロッ クサイズの設定はFFTチャンネル数にも反映されます。 メッセージ/オーディオのフィルター分解能を向上させるために、あるいはフィー ドバック・アルゴリズム中で「ブロック遅延」を縮小するために、あなたは64未 満のブロックサイズを使用したいと思うかもしれません。(テストはしていませ んが)極端にいえば、ブロックサイズを1にセットすることで再帰的なフィル ターを記述することができます。

DSP演算処理の見積もりに"switch~"が使えます。例えば、2つの合成アルゴ リズムを切り替えたいと思うかもしれません。それぞれのアルゴリズムをサブパッ チ(これはボイス・バンクなどのために、内部にサブ・サブ・パッチを更に格納 できる)に格納して、各々をオンにして切り替えてください。アウトプット・レ ベルの制御に"line~"を使用しているならば、アウトプット・レベルが0になるま で時間がかかります。あるいは、0になるまでの間は動かすことができないでしょ う。

サブパッチがオフになるとき、そのオーディオ出力はゼロになります。これ はかなり小さなオーバーヘッドを要します。切り替えられるモジュールの内部に "throw~" 、外部に "catch~" を使用することで、より安価に出力を得られます。

2.4.5. ウィンドウをまたいだ(non-local) シグナル・コネク ション

あるウィンドウから別のウィンドウへ、もしくはアルゴリズムの入力へシグナル を送り返すために、シグナルを"non-local"(非局所的)に受け渡したいと思うか もしれません。これは"throw~"/"catch~", "send"/"receive~"あるいは"delwrite~" /"delread~"のペアを使用すれば実現できます。"throw~"と"catch~"はバスを総 計します; "throw~"がバスにシグナルを加算し、"catch~"はバスからシグナル を蓄積した上で次回のためにバスをゼロクリアします。一つの"catch~"に複数の "throw~"オブジェクトを対応させることが可能です。しかし"throw~"は単一の "catch~"としか通信できません。しかし必要であれば"throw~"の対象をリセットする こともできます。

"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~"を削除して作成し直してください。

2.5. スケジューリング

Pdはサンプル制度の正確さと、特にオーバーフローを抑止するために、時間表現に 64-bit浮動小数点数をもちいています。時間単位はミリ秒で表示されます。

2.5.1. オーディオとメッセージ

オーディオとメッセージ処理は、Pdにおいてインターリーブされます。 オーディ オの処理はPdのサンプルレートで64サンプルごとにスケジューリングされます; 44100Hzの場合サンプリング期間の最小単位は1.45ミリ秒です。"pd" オブジェク トに "dsp 1", "dsp 0" というメッセージを送ることで、DSP演算処理のオン・ オフを制御できます。

インターバルのあいだに、ディレイが終了したり外部入力(MIDIやマウスク リックとか)が発生したりするかもしれません。これによってdepth-firstなメッ セージ・パスのカスケードが発生します。これらのカスケードは、次のメッセー ジかDSP演算が処理されるまえに終了します。メッセージがDSP演算処理の間にオ ブジェクトへ渡されることはありません。各DSP処理の時間間隔は最も小さな処 理単位となります。メッセージカスケード中で変更されたパラメータは、次のオ ブジェクトに渡されると同時にその効果を現わします。

メッセージカスケードの途中で、あなたは遅延0のスケジューリングを記録 できるかもしれません。論理的には同時ですが、実際には、現在のカスケードが 終了した後で、この遅延0のカスケードが起こります。

2.5.2. 演算処理の負荷

Pdのスケジューラはその演算処理上での(ユーザ指定された)優先順位を維持 します; すなわち、予測できない演算処理量の増加をでき得る限り吸収するた めに、Pdは実時間よりほんの少し先まわりした処理をしようと試みます。これは、 "audiobuffer"または"frags"コマンドライン・フラグを使って指定されます。 (getting Pd to run を参照)

Pdが実時間より遅れてしまう場合、オーディオ・ストリームの入出力に途切 れが(時々または頻繁に)起こるでしょう。対して、ディスク入出力系のオブジェ クトは正確に動作しますから、Pdをサウンドファイル処理を伴うバッチ・プログ ラムとして用いることも可能です。このような用途の補助となるよう、スタート アップ・フラグ"-nogui"と"-send"が提供されています。

Pdの「リアル・タイム」演算は、(別個のプロセスで動作する)Pd自身の GUIとCPUタイムを奪い合います。いつかは、この問題を防止するフロー制御メ カニズムが実装されるでしょう。しかしどんな場合でも、Pdが音を出している最 中はGUIの描画を軽くするほうの賢明です。 サブウィンドウが閉じられた場合、 パラジウムはそのウィンドウのGUI描画メッセージを抑止します。バージョン 0.32の時点では、ウィンドウを最小化してもこの効果はありません。あるウィン ドウを使用していない場合は、実際にそれを閉じるべきです。

2.5.3. 決定論

Pdが時間通りに動作しているいないにかかわらず、("delay"関係のオブジェク トでは)すべてのメッセージ・カスケードはオーディオ発生より前に実行される ようスケジューリングされます。他の言葉でいえば、演算処理が実時間を考慮し て再構成されることは無いという事です。この仕様はPdに決定論的なオペレーショ ンをさせるために採用されています。

(訳者注: 次の段落は訳出に自信がありません。原文も参考にしてください。)

メッセージ・カスケードが外部イベントによってスタートする場合、時間タ グが与えられます。時間タグはスケジュールのタイムアウトと計算されたDSPタ イミングが予定どうりであることを保証します。つまり、つまり、時間は減少し ません。(しかしながら、Pdあるいはハードウェアドライバーが、インプットの あった物理的な時間を間違えるかもしれません。このことはオペレーティング・ システムに依存します。)"timer"オブジェクトは、メッセージカスケードの論 理的なタイムスタンプに従って、時間間隔を計測します。その結果、"delay"オ ブジェクトは常に理論値を与えます。(反対に、非決定論的でない結果とともに 実時間を測定するのが、"realtime"オブジェクトです。)

2つのメッセージ・カスケードが論理的に同時刻上にスケジューリングされ た場合、それらはスケジュールへ追加された順に実行されます。

2.6. 記号の意味関係

この節では、データの格納のされ方、オブジェクトやボックスがどのようにメッ セージを受け渡すのかなど、Pd中のオブジェクトがどういう仕組みで出来ているか を解説します。

2.6.1. オブジェクトの生成

ボックスの中のテキストは、それがメッセージ, アトム(数値/シンボル)あるい はオブジェクト・ボックスかどうかに依存した異なる機能を持っています。 メッセージ・ボックス中のテキストは、出力として送信されるメッセージになり ます。アトム・ボックス中のテキストは、数値またはシンボルであり、ボックス の状態を反映して処理の実行とともに変化します。

オブジェクト・ボックス中では、メッセージボックスと同様に、テキストは メッセージとして機能します。しかしここで、メッセージは一度Pd本体に渡され ることになっています。このメッセージによって該当するオブジェクトが生成さ れます。ファイルを読み込んだ際に、ファイル中すべてのオブジェクトはテキス トを「生成メッセージ」に使用して作成されます。新しいメッセージをオブジェ クト・ボックスにタイプ入力した場合、古いオブジェクトは破棄され、変更した メッセージによる新しいオブジェクトの生成がおこなわれます。

メッセージのセレクター(メッセージ列の先頭要素)は、Pd本体に読み込まれ、 生成すべきオブジェクトの特定作業に利用されます。メッセージ列の残りの要素 は、生成されたオブジェクトの設定値(「生成引き数」とも呼ばれる) として利 用されます。従って、"makenote 64 250" のセレクター"makenote"は生成すべき オブジェクトの型を決定し、生成引き数である 64 と 250 はそれぞれベロシティ (変化速度)とデュレーション(持続時間)の初期値となります。

2.6.2. データの持続性

Pdの設計方針には、外見からその機能が十分に理解できるという意味で、パッチ は印刷可能であるべきだという考え方があります。このおかげで、 もし受け取ったメッセージがオブジェクトの挙動を変えるときは、変化がオブジェ クトの外見に現れないので、パッチとしてファイルには保存されません。 ゆえにその部分はパッチをリロードしても再現されません。 同様に、一旦オブジェクトを削除して再び作成した場合もオブジェクトの設定状態は 保持されず、かわりに、再初期化されます。(このとき生成引き数があればにこ れが初期値になります。)

サブパッチの作成はこの限りではありません。サブパッチの設定状態はその 配置そのものだからです。特別な例として、この設定状態はパッチがファイルか らロードされた際にも再現されます。またサブパッチの名前を変更(たとえば "pd spot"を"pd jane"に)した場合、サブパッチの内容は保持され、オブジェク ト・ボックスのテキストとサブパッチのウィンドウ・タイトルのみが変化します。

生成引き数を後で上書きするつもりならば、それらを"makenote 64 250"と して指定するのはおそらく悪いスタイルです。これは、パッチを理解しようとす る人を混乱させる原因になります。

2.6.3. メッセージの受け渡し

Pdのメッセージはセレクター(シンボル)及び0ないし0以上の引き数(シンボルま たは数値)から成っています。メッセージがオブジェクトに受け渡されると、Pd は最初にセレクターとオブジェクトのクラスとを照合します。メッセージ・ボッ クスはすべて1つのクラスであり、それらすべては同じメッセージを受け取り、 それらの状態(すなわちボックスにタイプ入力されたテキスト)に従って分配しま す。その(数値またはシンボルで表される)状態が変わる可能性があることを除い て、アトム・ボックス(数値またはシンボル)にも同じことがいえます。

オブジェクト・ボックスは様々なクラスをもっているかもしれません。普通 クラスは生成メッセージのセレクターによって決定されます。通常はシンボルが 生成メッセージの第一要素になっています。

各クラスは、それが送られるかもしれないメッセージの固定コレクションに 付属します。たとえば、"float"または"f"オブジェクトは"bang"と"float"を受 け付けます。これらのメッセージは、左端のhotな入力端子を通して"float"オブ ジェクトに送信されます。(右の入力端子は独立した補助的なオブジェクトです。) クラス"float"のオブジェクトはメッセージ"bang"に反応して、現在保持している 値を出力します。すなわち、"float"メッセージを自身の出力端子へ送信します。 また、"float"メッセージに対しては、メッセージの値を保持すると同時に出力 して反応します。

Pd中の("float"のような)他の各クラスは、独自にメッセージ応答プロトコル を備えていて、 "float"と"bang"メッセージの代わりに(またはそれに加えて)他 のメッセージを受け付けます。

2.6.4. 入力端子とリスト

ほとんどのオブジェクトの左上端にある接続ポイントはオブジェクトをそれ自身 表わします。ほかの黒い長方形は"inlet(入力端子)"と呼ばれており、Pdには4つ のinletクラスがあります。inletクラスによって受け付けられるメッセージの種 類(シンボル, float, その他)が決定されます。またinletは適切なオブジェクト または代理(時折オブジェクトによって作成される)のどちらかにメッセージを 転送します。

(訳者注: 原文'Unless they arrange otherwise by defining a "list" method,' が理解できず訳が変。)

もしオブジェクトが"list"メソッドの定義により他の方法で配列しなかった 場合、オブジェクトはinlet(入力端子)に対して"list"メッセージを要素ごとに 分配します。ただし、"float"または"symbol"メッセージとして、オブジェクト に渡される第一要素が適切であった場合は除きます。

2.6.5. ドル記号

メッセージまたはオブジェクト・ボックス内では、("$1"や "$3-bazoo"のように)ドル記号と数字で始まるメッセージ要素は、メッセージが 渡される環境の一部として供給された値を代用する変数です。メッセージ・ボッ クスの場合、環境はメッセージ・ボックスが反応する"list"メッセージの要素 (おそらく"bang","float"かその他でしょう)から成ります。従って、もしメッセー ジ・ボックスが "23 skidoo" を受け取り、そのボックスがテキスト"$2 until $1" を含んでいた場合、出力されるメッセージは "skidoo until 23" となりま す。

オブジェクト・ボックスはテキスト(Pdにオブジェクトを作成・初期化する メッセージ)を含んでいます。ここで、ロードされたパッチのコンテキストか ら $1, etc., が得られたとします。パッチが新規のドキュメントであるまたは ファイルから開かれた場合、"$"変数は確定していません。しかしパッチがアブ ストラクション(次節を参照)である場合は、アブストラクションの生成引き数に よって設定されます。

"$1-x" のような構成は文字列の連結によって拡張されます。これはローカ ル変数を作るためのメカニズムです。特に、アブストラクション中の $0 はその アブストラクションに唯一であることが保証されているカウンターです。 よって "$0-bear" のような名前を使っての受け渡しを、ローカルな送信/受信の ペアとして使うことができます。

2.7. サブパッチ

Pdは「ワン・オフ・サブパッチ」と「アブストラクション」と呼ばれるサブパッ チを作成するために2つのメカニズムを提供しています。いずれの場合も、サブ パッチは(親となる,メインの)パッチ上でオブジェクト・ボックスとして表示さ れます。オブジェクト・ボックスに "pd" または "pd my-name" とタイプ入力す ると、ワン・オフ・サブパッチが作成されます。対して、"mypatch.pd" のよう な名前でパッチを保存すれば、オブジェクト・ボックスに "mypatch" 入力とす ることで呼び出すことができます。この使い方では、"mypatch"が独立したファ イルとして保管されます。これによって様々なパッチのインスタンスを作成して 呼び出すことができます; "mypatch"の内容を変更すると、それを呼び出してい るすべての箇所に反映されます。ワン・オフ・サブパッチが括弧でくくられたコー ドの集合に、また、サブストラクションがサブルーチンに似ている所が、Cプロ グラミング言語と類似している点です。

これらのオブジェクト"inlet", "inlet~", "outlet" と "outlet~"を、サブ パッチに設置すると、サブパッチを含んだオブジェクト・ボックスに入力端子と 出力端子が設置されます。これはワン・オフ・サブパッチおよびアブストラクショ ンの両方に等しくはたらきます。チルダ記号のついた "inlet~" と "outlet~" は、オーディオ・シグナル用の入力端子と出力端子を作成します。サブパッチの 入力端子や出力端子にメッセージとオーディオを混合することはできません。 それぞれの端子に一種類のみを割り当てなければいけません。

呼び出し・ボックス(オブジェクト・ボックス)上の入力端子と出力端子は、サブパッチに表示されているのと同じ順で、左端から順に表示されます。

2.7.1. アブストラクション

アブストラクションはオブジェクト・ボックスにパッチの名前(".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の側で、メッセージ・ボックスよりオブジェクト・ボッ クス中で別々の時間に "$" が拡張される不利益があります。



< 目次に戻る
<< Top