/**/

チュートリアル 27:
JitterマトリックスでのMSPオーディオの使用

このチュートリアルでは、jit.poke~ というオブジェクトを使ってMSPオーディオシグナルをJitterマトリックスにコピーする方法について説明します。その中で、jit.qt.movie のサウンド出力コンポーネントアトリビュートや spigot~ という新しいMSPオブジェクトを利用して、QuiciTimeムービーからのサウンドトラックをMSPシグナルネットワークで使用する方法についても調べていこうと思います。

このチュートリアルは、すでに send~ と receive~ を使ったMSPシグナルのルーティング、さらに tapin~ tapout~ オブジェクトを使った簡単なディレイネットワークについて十分理解していることを前提としています。これらの項目に関してはMSPマニュアルのチュートリアル4およびチュートリアル27に説明があります。

・Jitter Tutorialフォルダにある、27jAudioIntoMatrix.pat というチュートリアルパッチを開いて下さい。

チュートリアルパッチを開くと、パッチの左上にある jit.qt.movie オブジェクトは rca.mov という QuickTimeムービーを読み込みます。


パッチ内の jit.qt.movie オブジェクト

toggle ボックスをクリックして、パッチの上部にある metro オブジェクトをスタートさせて下さい。 jit.qt.movie オブジェクトの下の左側の jit.pwindow オブジェクトに映像が表示されるのがわかるでしょう。ここではまだ、もう1つの jit.pwindow オブジェクトには何も表示されず、サウンドも聞こえないと思います。

この jit.qt.movie オブジェクトでは、オブジェクトボックス内に dim アトリビュート(320×240セル)に続いて2つのアトリビュートが設定されています。loop アトリビュートに値2が設定されていることから、jit.qt.movie オブジェクトはムービーを「回文」のようにループします。いったんムービーが最後まで再生されると、最初へ戻って再生する(デフォルトの動作:loop アトリビュートが1に設定されている場合)のではなく、その時点からファイルの先頭へ向かって逆再生を始めます。ムービーでは、オシレータのつまみを手動で繰り返し上げ下げする様子がエンドレスなループとして映し出されていると思います。実際には、このムービーには手動でつまみを上げるシーンだけが含まれているのですが、ループの後半部分は、loop アトリビュート使った逆再生が行われているのです。

サウンド出力コンポーネント

jit.qt.movie オブジェクトにセットした2番目のアトリビュートは、この jit.qt.movie オブジェクトのインスタンスのサウンド出力コンポーネント (Sound Output Component : soc)を設定するものです。soc アトリビュートのアーギュメントとして指定した名前(ここでは glissとしています)は、 jit.qt.movie オブジェクトに読み込まれたムービーのサウンドトラックを取得してMSPで利用できるようにするための、新しいサウンド出力コンポーネントを示しています。デフォルトでは soc アトリビュートは none にセットされていますが、この場合ムービーのオーディオ出力は直接サウンドマネージャに送られます。名前を持った soc アトリビュートは、コンポーネントと同じ名前を持つ spigot~ オブジェクトにオーディオを送り、MSPのオーディオシグナルとしてアクセスすることを可能にします。


spigot~ オブジェクト

チュートリアルパッチの右上隅にある spigot~ オブジェクトは、jit.qt.movie オブジェクトの soc アトリビュートと同じアーギュメント( gliss )を持っています。jit.qt.movie オブジェクトに読み込まれたムービーがサウンドトラックを持っている場合(ここでの rca.mov ファイルは格好な例です)、ムービーのオーディオは spigot~ からMSPシグナルとして送り出されます。spigot~ オブジェクトが2つのアウトレットを持っている点に注目して下さい。これらはムービーサウンドトラックの左と右のチャンネルに対応しています。rca.mov ファイルの場合はモノラルサウンドトラックなので、このパッチでは1つののアウトレットを使うだけで十分です。

重要:jit.qt.movie soc アトリビュートによって、パッチ内で1つ1つの jit.qt.movieごとに別々のサウンド出力コンポーネントを作ることが可能です。必要なだけの数の、それぞれ固有な名前を持った spigot~ オブジェクトを使って、複数のQuickTimeムービーからオーディオを取得することができます。しかし、特に注意すべき重要な点は、1つのサウンド出力コンポーネントに対して1つの spigot~ しか使えないということ、および、各 jit.qt.movieオ ブジェクトは固有な soc アトリビュートを持っていなければならないということです。(当然ながら、soc が none に設定されている場合は除きます。サウンドマネージャは、好きなだけの数のムービーからサウンドトラックを取得できます。)一度複数のムービーオーディオトラックをMSPシグナルとして取得してしまえば、それらをミックスしたりすることも思いのままです。

・パッチの一番下にある dac~ オブジェクトに接続された toggle ボックスをクリックして、dac~ をスタートさせて下さい。もう1つの jit.pwindow に映像が現れ、spigot~ に接続された meter~ オブジェクトにシグナルレベルが表示されるのがわかると思います。dac~ に接続された gain~ スライダを上げると、その時点でMSPオーディオドライバとして選択しているデバイスからサウンドが聞こえ始めるはずです。MSPでコンピュータのオーディオシステムの設定を行う方法についての情報は、MSPマニュアルのオーディオ I/O の章を参照して下さい。


spigot~ からのオーディオシグナルの受信

rca.movファイルからのサウンドトラックは、MSPシグナルとして、spigot~ オブジェクトから2タップのディレイライン(パッチ内の tapin~ および tapout~ オブジェクトによって生成されます)へ送られます。ドライオーディオシグナル(訳注:直接送られるシグナル)は、接続されている red という名前の send~ オブジェクトへ送られます。2つのディレイタップは、それぞれ、green、blueと名付けられた send~ オブジェクトへ送られます。3つのオーディオシグナルは、名前を持つ receive~ オブジェクトによって出力され、パッチのいちばん下にある gain~ オブジェクトでいっしょにされているため、これらすべてを一度に聞くことができます。

tapout~ オブジェクトに接続された Delay times(green/blue)と表示いう表示のあるナンバーボックスを使って、ディレイタイムを調整して下さい。ディレイは最大1000ミリ秒( tapin~オブジェクトに割り当てられた最大ディレイタイム)まで調整可能です。

中身を探る(Poke~する)

チュートリアルパッチの上部にある右側の jit.pwindowオブジェクトは scope と名づけられた jit.matrix の出力を表示しています。この jit.matrix もまた、パッチの最上部にある metro オブジェクトから bang を受信しています。


scope という jit.matrix の出力

scope という Jitterマトリックスは、チュートリアルパッチの右側にある3つの jit.poke~ オブジェクトによって生成されます。この jit.poke~ オブジェクトはMSPオーディオシグナルをマトリックスのセルに書き込むものです。これらのセルは、jit.pwindow に表示される際、ムービーサウンドトラックのオシロスコープ画面を描画しますが、この画面ではドライシグナル(オリジナルのシグナル)と2つのディレイシグナルがそれぞれ赤、緑、青で表わされています。


3つの jit.poke~ オブジェクトは scope マトリックスに対して書き込みを行います

スクリーンの右側にある3つの良く似た領域では、jit.poke~ オブジェクトを使って、MSPシグナルデータを scope マトリックスに書き込んでいます。jit.poke~ オブジェクトは3つのアーギュメントを取ります。アーギュメントは、書き込む Jitter マトリックスの名前(name)、使用するインレットの数(dim)、そして数値を書き込む対象となるマトリックスのプレーン(plane)を示します。このパッチの3つの jit.poke オブジェクトはすべてマトリックス scope に対して書き込みを行います。scope は2次元マトリックスであるため、データを書き込む場所の指定のために2つのインレット(列のためのインレットと行のためのインレット)が必要になります。この3つのオブジェクトは、scope マトリックスのそれぞれ異なるプレーンに書き込みを行うという点が異なっています。

jit.poke オブジェクトの第1インレットは、マトリックスセルに書き込むための値を与えます。マトリックスセルは他の2つのインレットによって指定されますが、2つのインレットは、セルの場所を指定するためにシグナルを受け取ります。ここでは、scope マトリックスのカレントの位置(現在時点での場所)に定数1を書き込むために、sig~ オブジェクトを使っています。値1は、char データによるマトリックスに書き込まれる場合(このケースで行っていることです)、255として解釈されます。

この jit.poke~ オブジェクトの他の2つのインレットは、出力マトリックスの中のデータを書き込む位置を決定します(この「一組の座標値」はオブジェクトのための「書き込みポインタ」を定義します。これは、単に1次元を2次元に置き換えただけの、「レコードヘッドの位置」と考えることができます)。いちばん右のインレットは、名前を持った receive~ オブジェクトからオーディオシグナルを受信し、シグナルの振幅に対応した「書き込みポインタ」の垂直方向(dim 1)の座標値を設定します。パッチにある *~ +~ オブジェクトはオーディオシグナルの出力範囲である -1 〜 1(典型的なオーディオシグナルの範囲)を0 〜 239(ここでの出力マトリックスの縦の大きさ)にスケールします。

同期あるいは進行

jit.poke~ オブジェクトの中央のインレットは「同期」信号を受信します。これはオーディオシグナルのその時点での振幅を書き込むための、マトリックスの水平軸上の場所を指定します。このシグナルはムービーからのオーディオデータとは関係しません。これは、このパッチで仮想的に作られたオシロスコープの水平リフレッシュレートと考えることができます。同期信号はチュートリアルパッチの中ほどにある phasor~ オブジェクトによって生成されます。


ここでの jit.poke~ オブジェクトのための水平同期信号を生成します

この phasor~ オブジェクトは0から(ほとんど)1までのランプシグナル(訳注:徐々に増加するシグナル)を繰り返し生成します。その下の *~ は、ここでのマトリックスの幅(0〜319)に適した値を生成するために、このシグナルをスケールし直します。その後、シグナルは h_sync と名付けれられた send~ オブジェクトを経由して、jit.poke~ オブジェクトの中央インレットに接続された receive~ オブジェクトに送られます。 phasor~ の周波数(第1インレットに接続されたナンバーボックスによって指定されます)はこの jit.poke~ オブジェクトがマトリックスの左から右へスキャンする速さを決定します。

・Horizontal scan rate (Hz) と表示されたナンバーボックスの値を変えて、phasor~ の周波数をいろいろ変化させてみて下さい。高い周波数の場合、ムービーオーディオによって生成される波形をどの程度細かく見ることができるかに注目して下さい。速さを負の値に設定すると、マトリックスは逆方向(すなわち右から左)に書き込まれます。

生のオーディオシグナルと2つのディレイ出力は、scope マトリックスの眼に見える3つのプレーン(1、2、3、または、赤、緑、青)として視覚化されます。jit.poke オブジェクトによって書き込まれたセルが重なった場合には、出力マトリックスに様々な色の組合せが表示されます。

どのようにマトリックスが描かれるかがわかったところで、今度は、水平軸のスキャンが終わった時にマトリックスを自動的にクリアする方法を見ていく必要があります。パッチの関連した部分は以下のようになっています。


水平同期のリセット、およびマトリックスのクリアを検出します

change~ オブジェクトは、phasor~ オブジェクトによって生成されるランプシグナルが増加している時には1を出力します。phasor~ は増加が終わると即座に0に戻りますが、その瞬間にchange~ は-1の値を出力します。==~ オブジェクトは change~ が1を出力している間は1を出力しますが、この瞬間には0を出力します。phasor~ が再び増加を始めると ==~ オブジェクトは1を出力し、これが edge~ オブジェクト(直前のシグナルベクタの中での、0から非0の値への変化を検出します)から bang メッセージを出力させるトリガになります。bang reset という名前を持った receive オブジェクトに送られ、これが jit.matrix オブジェクトに clearメッセージを送るトリガになります。結果として scope マトリックスは phasor~ が増加を始めるたびに必ずクリアされることになります。

すべてを組合わせる

2つの Jitterマトリックス( jit.qt.movieオ ブジェクトからの映像と jit.poke~ オブジェクトによって描画されるオシロスコープ)は jit.op によって最終的なマトリックスに合成されます。


jit.op を使った2つのマトリックスの合成

jit.op に初期値として設定されている op アトリビュートは * になっています。結果として、合成されたものは2つのマトリックスを掛け合わせたものになります。scope マトリックスのほとんどのセルの値は0(黒)なので jit.poke~ オブジェクトが波形をトレースしている部分のセルおよびプレーンの所にだけムービーの映像が現われるのがわかると思います。

scope マトリックスを表示する jit.pwindow の右側の prepend オブジェクトに接続されているメッセージボックスをクリックして、jit.op オブジェクトの op アトリビュートを変えてみましょう。様々な数値演算によって2つのマトリックスの合成処理がどのように変化するかをよく見て下さい。

まとめ

jit.qt.movie オブジェクトの soc アトリビュートによって、サウンド出力コンポーネントの名前を定義することができます。spigot~ オブジェクトによってQuickTimeムービーのサウンドトラックをMSPシグナルとして取り出すことができます。これは spigot~ オブジェクトに、そのムービーを再生する jit.qt.moviesoc アトリビュートと同じアーギュメントを与えることによって可能になります。

jit.poke~ オブジェクトを使うと、名前を持った Jitter マトリックスにMSPシグナルを書き込むことができます。jit.poke~ オブジェクトはアーギュメントとして、書き込むマトリックスの名前(name)、セル座標を指定するためのインレットの数、そのマトリックスで書き込みを行う対象となるプレーン(plane)をとります。jit.poke~ の第1インレットは、マトリックスに書き込む値を受け取ります。それ以降のインレットは、データが書き込まれるマトリックスの位置を指定するためのMSPシグナルを受け取ります。