チュートリアル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.qtu.moiveオブジェクトはrca.movというQuickTimeムービーを読込みます。


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


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

このjit.qt.movieオブジェクトでは、オブジェクトボックス内にdimアトリビュート(320×240セル)に続いて2つのアトリビュートが設定されています。loopアトリビュートに値2が設定されていることから、 jit.qt.objectはムービーを「回文」のようにループします。いったんムービーが最後まで再生されると、最初へ戻って再生する(デフォルトの動作: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~オブジェクトに接続されたトグルボックスをクリックして、dac~をスタートさせて下さい。残りのjit.pwindowに映像が現れ、spigot~に接続されたmeter~オブジェクトにシグナルレベルが表示されるのがわかると思います。dac~に接続されたgain~スライダを上げると、その時点でMSPオーディオドライバとして選択しているデバイスからサウンドが聞こえだすはずです。MSPでコンピュータのオーディオシステムの設定を行う方法についての情報は、MSPマニュアルのAudio 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アトリビュートによって、Sound Output Component(サウンド出力コンポーネント)の名前を定義することができます。spigot~オブジェクトによってQuickTimeムービーのサウンドトラックをMSPシグナルとして取り出すことができます。これはspigot~オブジェクトに、そのムービーを再生するjit.qt.movieのsocアトリビュートと同じアーギュメントを与えることで可能になります。
jit.poke~オブジェクトを使うと、名前を持ったJitterマトリクスにMSPシグナルを書き込むことができます。jit.poke~オブジェクトはアーギュメントとして、書き込むマトリクスの名前(name)、セル座標を指定するためのインレットの数、そのマトリクスで書き込みを行う対象となるプレーン(plane)をとります。jit.poke~の第1インレットは、マトリクスに書き込む値を受け取ります。それ以降のインレットは、データが書き込まれるマトリクスの位置を指定するためのMSPシグナルを受け取ります。