チュートリアル21

MIDIコントロール:poly‾オブジェクトを使う

ポリフォニーへの違ったアプローチ

これまでの章では、単純にポリフォニックなボイスのアサインメント(割当て)をするためのpolyオブジェクトの使い方を示してきました。この章では、ポリフォニックなボイス割当てを行う、よりエレガントで効率のよい方法ーpoly‾オブジェクトーについて述べようと思います。

これまでの章の例では、サンプラのサブパッチのコピーを作り、polyオブジェクトのボイスナンバリング機能を用いてメッセージをそれぞれのサブパッチに振り分けていました。これまでの例では、どんな種類のサウンド生成サブパッチでも簡単に使用することができました。次の例では、シンプルな4音ポリフォニックを実装するために、littlesynth‾というサブパッチを使用しています。

しかし、このメソッドが動作する時、2つの不都合な点があります。第1に、littlesynth‾の多くのコピーを複製し、つなぎ合わせることは多くの管理を必要とする点です。さらに、CPUの利用に関する問題も生じます。littlesynth‾サブパッチャーの4つのコピーすべては常に動作していて、サウンドが作られていない時でも常に処理を行っています。

MSP2.0では、この問題を解決するための異なった方法が導入されています。poly‾オブジェクトは、それ1つで同じMSPサブパッチの複数のコピーを作り管理することができます。またCPUリソースの節約のために、サブパッチの各々のコピーのシグナル処理動作をコントロールすることもできます。

poly‾オブジェクト

poly‾オブジェクトはパッチャーファイル名を引数として取り、そのコピー(インスタンス)が作られる数を指定する値がその後に続きます。これまでの方法では、ポリフォニーを実装するために手動で複製をしていましたが、それを同じ「数」で指定する必要があります。下の図はpoly‾オブジェクトの実例です。

poly‾ オブジェクトをダブルクリックするとサブパッチャーが開き、littlebeep‾の中を見ることができます。

ちょっと、littlebeep‾パッチを見てみましょう。これまでにはなかったin,out‾,そしてthispoly‾というオブジェクトがありますが、それ以外はかなり簡単なものです≠こでは、入力されるMIDIナンバを取得し、mtofを用いて周波数値に変換して、その周波数のサイン波を140ミリ秒間出力します。140ミリ秒間の振幅エンベロープはline‾オブジェクトによって与えられます。

ところで、in,out‾オブジェクトはどんな働きをしているのでしょうか?poly‾オブジェクトによって作られるサブパッチは、インレット、アウトレットとして特別なオブジェクトを使用します。in,outオブジェクトはコントロール用のインレット、アウトレットを作り、in‾,out‾オブジェクトはシグナルインレットとシグナルアウトレットを作ります。どのインレットをどのオブジェクトに割り当てるかは、オブジェクトに数値の引数を追加することによって指定します。inオブジェクトはpoly‾オブジェクトの最も左のインレットに対応します。poly‾オブジェクトは、インレットとアウトレットの数を保持しています。これは、サブパッチのロードが指定された時、それらを生成するために必要になります。

poly‾オブジェクトに送られるメッセージは、note,midinoteメッセージを用いて、あるいは手動でtargetメッセージを用いてサブパッチの異なるインスタンスに動的に振り分けられます。

poly‾は、noteメッセージを左インレットに受け取ると、使用されていない(ビジーでない)サブパッチのコピーが見つかるまでメモリ内を探索し、メッセージをそれに送ります。サブパッチのインスタンスは、thispoly‾オブジェクトを使用して、親となるpoly‾オブジェクトに、自分自身がビジーであることを知らせることができます。thispoly‾オブジェクトはインレットからシグナルまたは数値を受け取り、ビジーかどうかの状態(ステート)をセットします。0シグナルまたは数値0がインレットに送られると、親のpoly‾にインスタンスがnote,midinoteメッセージを受け入れ可能であることを通知します。非0のシグナルまたは値がインレットで受け取られると、親のpoly‾にインスタンスがビジーであることを通知します。これらがビジーでなくなるとnote,midinoteメッセージが送信されます。ビジー状態(ステート)はサブパッチャーのインスタンスによって出力される音の持続と一致しますが、その他の意味をあらわすものとしても利用できます。上の例では、*‾からのオーディオレベルが0でない時、サブパッチの繰り返しは一般的にビジーになります。もし、line‾からの振幅エンベロープが0になるとサウンドはストップしますが、サブパッチのコピーのthispoly‾はpoly‾に対して入力可能であることを通知します。

thispoly‾オブジェクトはまた、サブパッチのコピー各々のシグナル処理の使用をコントロールすることができます。muteメッセージが値1を伴ってthispoly‾に送られると、そのサブパッチのシグナル処理はストップします。mute 0メッセージが受け取られるとシグナル処理は再開します。このことを利用して、littlebeep‾を書き換えることができます。ここでは、音が終えられるとシグナル処理はオフになり、新しいイベントが受け取られるとシグナル処理は再開されます。

この方法は、パッチの機能は同じですがより効率的です。それは、CPUの割当て量は、常にその時点で出力されている音の数に基づいているからです。

poly‾を利用してイベント割当てを行う他の方法として、targetメッセージの使用があります。整数を伴うtargetメッセージを
poly‾の左インレットに送ると、サブパッチはpoly‾に、次のメッセージをそのサブパッチのインスタンスに送るよう要請します。poly‾オブジェクトをpolyオブジェクトと併用することで、前の章の例からMIDIシンセサイザを作ることができます。

poly‾サブパッチは次の例のようにtargetメッセ−ジを使用します。

この例のサブパッチャーでは、入力されてくるMIDIピッチとベロシティのペアがサイン波によるサウンドをシンセサイズするために使用されています。リストが受け取られると、サブパッチャーはthispoly‾にbangを送り、インスタンスまたはボイスナンバを出力させます。下の例では、ボイスナンバがアウトレットから送信されるのを親パッチ上で見ることができます。

親パッチではpolyオブジェクトはボイスナンバをmakenoteから出力されるMIDIピッチ/ベロシティのペアに割当てます。polyオブジェクトからのボイスナンバはtargetメッセージを前に付け加えられてpoly‾に送られます。これはpoly‾に対し、poly‾によって指定されるtargetbeep‾サブパッチャーのインスタンスに次のデータを送るよう要求します。新しいノートが生成されると、targetは変更されます。polyはノートオフを保持しているので、正しくボイスは循環していくはずです。poly‾の第2アウトレットは最後にメッセージを受け取ったボイスを報告します。ここではpolyを特定のターゲットを指定するために使用していますので、これはpolyによって出力されたボイスナンバと同じはずです。

thispoly‾オブジェクトはpoly‾サブパッチャーの特定のインスタンスに対するパラメータを指定するために利用できます。
loadbangオブジェクトをthidpoly‾に連結することによって、ボイスナンバをフィルタのセンターフリケンシをコントロールするために利用することができます。

ここでは、littlefilter‾サブパッチャーはthispoly‾からのボイスナンバを使い、それに第2インレットで受け取った基本周波数を掛けています。入力シグナルは、16個すべてのインスタンスによってフィルタリングされますが、各々のインスタンスの振幅出力は第1インレットから入力されるintによってコントロールされます。

これはlittlefilter‾を使用したパッチ例です。

metroオブジェクトはcounterとrandomの両方に接続されています。counterはtargetメッセージを供給しますが、これは
littlefilter‾のpoly‾オブジェクトにロードされた16のボイスを循環させ、ボイスの振幅をコントロールするために使われる乱数を各々に提供します。

poly‾のインレットに接続されたシグナルは、すべてのサブパッチャーのインスタンス内の対応するin‾オブジェクトに送られます。そのため、上の例のnoise‾オブジェクトはpoly‾内部のすべてのサブパッチにノイズを供給します。第2インレット(サブパッチャーのin 2ボックスに対応)はフィルタの基本周波数をコントロールします。すべてのpoly‾にくり返し送信される周波数は、target 0 メッセージの後にある点に注意して下さい。poly‾サブパッチの特定のインスタンスを見るためには、オブジェクトにopenメッセージを送り、その後に見たいボイスナンバを続けます。ボイスナンバ15に割り当てられたサブパッチは次のようになります。

御覧のように、ここでのlittlefilter‾の個別の周波数値は1500Hzです。これはボイスナンバ(15)に、最後に第2インレットに送られた周波数値(100.Hz)を乗じたものです。

まとめ

poly‾は、同じサブパッチの複数のコピーを使ったポリフォニックなボイスアロケーション(割当て)を管理するための強力な手段となります。thispoly‾オブジェクトはサブパッチの中にあって、ビジーステート(ビジーかどうかの状態)やシグナルプロセッシングのオン/オフをコントロールします。in,in‾やout,out‾は、コントロール情報やシグナルの特別なインプット・アウトプットを作ります。これらは、poly‾オブジェクトのインレットやアウトレットとして働きます。

<-前の章 次の章->