Maxオブジェクトは、パッチコードを通してお互いにメッセージを送ることによって通信しています。これらのメッセージは、ユーザによるアクション(マウスクリック、MIDIノートの受信など)への応答として、あるいはイベントが起ることが予定されている場合(metro、delayなど)に、その特定の瞬間に送られます。
MSPオブジェクトは、同じようにパッチコードによって接続されますが、それら相互の通信はその概念から異なっています。MSPオブジェクトの接続は、メッセージを送るために経路を作るのではなく、接続されたオブジェクトの間の関係を作り上げるものであると言えます。そして、その関係はすべての瞬間瞬間に必要なオーディオ情報を計算するために使用されています。このMSPオブジェクトの形状は「シグナル・ネットワーク」と呼ばれます。
次の例は、メッセージが送られるMaxパッチと、常に関係が確立され続けているシグナルネットワークの違いを示しています。
Maxメッセージは特定の瞬間に発生します。:MSPオブジェクトは絶えまなく通信しています。
左のMaxの例では、ナンバーボックスは float オブジェクトにストアされている数値0.75については何も知りません。ユーザが button をクリックすると、float オブジェクトはストアしている数値を送り出します。ナンバーボックスは値0.75を受け取り、表示し、送り出すだけです。しかし、右のMSPの例では、シグナルネットワークの一部として接続されている各々のアウトレットは、絶えず方程式のために現在の値を与え続けています。そのため、特別なMaxメッセージが送られなくても、*~ オブジェクトは2つの sig~ オブジェクトからの出力を受け取っています。そして、*~ オブジェクトのアウトレットに接続されたどのオブジェクトも積の値0.75を受信しています。
MSPシグナル・ネットワークについて考えるためのもう一つの方法は、シグナル・ネットワークがMaxより速い(オーディオ)レートで実行されるパッチの一部であるとみなすことです。Maxやユーザが、パッチのシグナル部分に直接影響を及ぼすことができるのはミリ秒単位でだけです。MSPによる実行および計算は、これらのミリ秒のインターバルの間で起こります。このように(非常に速いパッチとして)シグナルネットワークを考える場合でも、MSPオブジェクトが絶えずメッセージの「送信」や「受信」を行なっていると考えることは意味があります(たとえ、これらのメッセージがMaxが理解できないくらい速く送られているとしてもです)。そのため、送信(send)、受信(receive)、インプット(input)、アウトプット(output)、といった、標準的なMaxの用語を、MSPオブジェクトについても同様に使います。
Maxにおける基本的な(そして最小の)イベントのスケジューリング時間の単位は、ミリ秒(0.001秒)です。このレート(毎秒1000回)は、通常、シンセサイザのような外部デバイス、またはQuickTimeムービーのようなビジュアル効果に対して行なう、どのような種類のコントロールにおいても充分な速さです。しかし、デジタルオーディオは、もっと速いレート(通常、オーディオの1チャンネルにつき毎秒44,100回)で処理されなければなりません。MSPは、このレートを処理の基準として、オーディオの次の数ミリ秒を生成するために必要なすべての数値を計算します。これらの演算は、シグナルネットワークの構成に基づいて、各々のオブジェクトごとに行われます。
オシレータ(cycle~)、及び他のオシレータ(phasor~)によって制御されるアンプ(*~)
この例では、周波数2000Hzのコサイン波オシレータ(cycle~ オブジェクト)は、スケールされた(サンプルごとに *~ オブジェクトの持つ数値を掛けられた)振幅を持ち、これがDAコンバータ(dac~)に送られます。1秒ごとに、phasor~ オブジェクトから出力される(サブオーディオ)ノコギリ波は、0 〜 1まで連続して傾斜的に増加する値を送信します。この増加する値は、オーディオ波形の各サンプル毎に *~ の右オペランドとして使用され、結果として2000Hzの音は、1秒ごとに無音状態から最大振幅まで直線的にフェードインします。オーディオの各ミリ秒ことに、MSPはおよそ44個のサンプル値(44,100Hzのオーディオサンプルレートを仮定した場合)を生成しなければなりません。そのため、サンプルごとに、各オシレータから該当する値を探し、その2つの値を乗じて、出力サンプルを作り出さなければなりません。
多くのMSPオブジェクトはミリ秒で表される入力値を受け入れますが、その場合でも、オーディオ・サンプリングレートでサンプルを計算しています。Maxメッセージはずっと遅く伝わり、その速さは、たいていの場合「コントロール・レート」と呼ばれます。事実上、2つの違った速さの動作が存在すると考えることは有用でしょう。2つの動作とは、Maxスケジューラによる遅い「コントロール・レート」、そしてより速い「オーディオサンプル・レート」です。
注:Max では浮動小数点数によるミリ秒で時間を指定することができるため、スケジューラの解像度はそれが実行される頻度によって変化します。正確なコントロールレートは、後で述べるいくつかの MSP の設定によってセットされます。しかし、スケジューラの中で実行される「コントロール」機能によってオーディオを「処理」することは、専門のMSPオブジェクトを使った場合に比べて、はるかに効率の悪いものになります。
MaxとMSPのリンク(そして、コントロール・レートとオーディオ・レートの変換)のために、いくつかのMSPオブジェクトが特に用意されています。これらのオブジェクト(例えば sig~ や line~ )は、インレットでMaxメッセージを受取りますが、アウトレットはシグナルネットワークに接続されます。また、逆に、いくつかのオブジェクト(例えば snapshot~など)はシグナルネットワークに連結されていて、シグナルネットワークの特定の点での現在値を見ることができます(ただし、1ミリ秒に1回の速度でしかできません)。
Maxメッセージをシグナルネットワークに供給、またはシグナルからMaxメッセージを取得
これらのオブジェクトは、シグナルネットワーク内での処理をMaxやユーザが直接コントロールすることができるようにしてくれるため、非常に重要なものです。
シグナルの振幅に関するユーザインタフェース・コントロール
いくつかのMSPオブジェクトのインレットはシグナルとMaxメッセージの双方を入力として受け取ることができます。このようなオブジェクトは、シグナルネットワークの一部として接続することができ、Maxメッセージによって命令や変更を受け取ることもできます。
例えば、オーディオシグナルの演奏を行なう dac~(デジタルーアナログコンバータ)オブジェクトでは、Maxメッセージの start と stop によってオン/オフを、切り替えることができます。
いくつかのMSPオブジェクトはオーディオシグナルとMaxメッセージを同じインレットで受信できます
また、cycle~(オシレータ)オブジェクトは周波数をMaxの float や int メッセージで受け取ることができますが、周波数を他のMSPオブジェクトから受け取ることも可能です。(しかし、両方を同時に行うことはできません。オーディオ入力は常に値を供給し続けていると考えられるため、float や int のメッセージによる効果を直ちに上書きしてしまうからです。)
いくつかのMSPオブジェクトはMaxメッセージとシグナルを同じ目的のために受信することができます。
このように、Maxパッチ(またはサブパッチ)がMaxオブジェクトとMSPオブジェクトの両方を同時に持つことができるということがわかるでしょう。多くの場合、構成をわかりやすくするために、シグナルネットワークのようなプロセス全体をサブパッチの中にカプセル化しておくと便利です。このようにしておくと、他のMaxパッチの他の部分からは、このサブパッチが1つのオブジェクトとして見えるようになります。
カプセル化は、Maxパッチ内の関係を明白にします
これまでの説明から、ディジタルオーディオ処理がたくさんの「ナンバクランチング(数値演算処理)」を必要とすることは明らかです。コンピュータは、サウンドのチャンネル1つにつき毎秒数万のサンプル値を生成しなければなりません。そして、各々のサンプルはシグナルネットワークの複雑さによって、多くの演算を必要とします。さらに、「リアルタイム・オーディオ」を作り出すためには、サンプルは少なくとも演奏されるのと同じ時間で計算されなければならないのです。
この複雑なリアルタイム・サウンド合成を汎用パーソナルコンピュータで行うことは、PowerPCのような十分に速いプロセッサが導入されるまでは全く問題外でした。しかしPowerPCでさえ、このタイプのナンバクランチングは、プロセッサによる多くの処理を必要とします。そのため、コンピュータがMSPで処理できる量の限界を認識しておくことは重要です。
MIDIシンセサイザとは異なり、MSPは、コンピュータがリアルタイムで演算するには複雑すぎるようなものでも設計できてしまうほどの柔軟性を持っています。その結果、オーディオの歪み、コンピュータのレスポンスの低下、また極端な場合にはクラッシュを引き起こしてしまいます。
コンピュータによってプロセッサの処理能力は様々であり、可能なシグナルネットワークの構成は非常に多様なため、MSPが扱える、あるいは扱えないオーディオ処理の複雑さがどの程度のものであるかを正確に述べるのは難しいことです。ここでは、いくつかの一般的な原則を示します。
MSPインストゥルメントを設計する場合、いくつかのオブジェクトは、他のものより集中したコンピュータの使用を必要とするということを心に留めておかなければなりません。シンプルで僅かな演算命令だけを行うようなオブジェクト(例えば、sig~、line~、+~、-~、*~、phasor~など)では、コンピュータに多くの負荷はかかりません(しかし、/~はより負荷がかかります)。ファンクションテーブルから数値を探したり、値の補間を行うようなオブジェクト( cycle~ など)はあまり多くの計算を必要としないため、同様にあまり負荷はかかりません。最も負荷の大きいオブジェクトは、サンプルごとに多くの計算を必要とするものです。フィルタ(reson~、biquad~)、スペクトルアナライザ(fft~、ifft~)、そして、play~、groove~、comb~、tapout~ のようなオブジェクトのパラメータを連続したシグナルでコントロールした場合などがこれにあたります。処理の効率については、MSP チュートリアルで更に論議されています。
注:パッチがどれくらいプロセッサタイムを使っているかを見るためには、DSP Status ウィンドウの CPU Utilization の値に注目して下さい。Options メニューから DSP Status... を選ぶと、このウィンドウが開きます。
PowerPCは汎用コンピュータで、商用のサンプラやシンセサイザのようにサウンド処理に特化して設計されたものではありません。そのため、概して、それらと同じレベルのパフォーマンスを期待することはできません。しかし、必要とする特定のシンセシスやプロセッシングに合致した比較的シンプルなインストゥルメント設計を行う場合や、新しいオーディオ処理を実験する場合においては、非常に便利なインストゥルメント構築環境であると言えます。
このようないくつかのアイデアは、MSPチュートリアルで紹介されています。
オーディオ I/O | MSP のオーディオ入出力 |