/**/

チュートリアル 1:
QuickTime ムービーの再生

このチュートリアル1では、Jitterを使って実行できるタスク(仕事)の中で、最もシンプルで便利なものの1つである、「QuickTime ムービーのウィンドウでの再生」について説明します。

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

このパッチには jit.qt.moviejit.window という2つのJitterオブジェクトがあります。
jit.window オブジェクトはコンピュータの画面に自動的にウィンドウを表示します。jit.qt.movieオブジェクトは、作成済みのQuicktimeムービーを開いて、再生を始めます。

read countdown.mov と書かれたメッセージボックスをクリックして下さい。すると jit.qt.movie オブジェクトはcountdowon.movというQuickTimeムービーファイルを開き、読み込みを開始します。


readメッセージはQuickTimeムービーファイルをオープンします

デフォルトでは、jit.qt.movie オブジェクトは、ムービーを開くとすぐに再生を始めます。(jit.qt.movie オブジェクトがファイルを開く前に autostart 0というメッセージを送ると、この動作を変更することもできますが、この段階ではデフォルトのままにしておくのがよいでしょう)しかし、 jit.qt.movie オブジェクトがムービーを再生しているといっても、まだムービーはムービーウィンドウに表示されていないことに注意して下さい。 これはいったいなぜでしょうか。

Jitterの1つ1つのオブジェクトは、ある決められたタスク(仕事)だけを行います。このタスクは非常に単純であったり、複雑であったりします。通常、私たちが考える「QuickTimeムービーを再生する」という動作は、Jitterでは、次の2つのタスクに分けて実行されます。

  1. ハードディスクにあるファイルからムービーデータの各々のフレームをRAMに読み込む。
  2. RAMにあるデータを取り込み、スクリーン上にカラーピクセルとして表示する。

最初のタスクは jit.qt.movie オブジェクトによって行われ、2番目のものは jit.window オブジェクトによって行われます。しかし、jit.window オブジェクトが何を表示したらよいかを知るためには、これら2つのオブジェクトが通信する必要があります。

Jitterオブジェクト間の通信

jit.qt.movieオブジェクトの仕事は、「QuickTimeムービーを開いて、他のJitterオブジェクトが容易に使用することができるように、RAMの中に個々のフレームを順に読み込む」ことであるという説明をしましたが、この動作を行うために、jit.qt.movieオブジェクトはMaxアプリケーションに割り当てられたメモリの特定の一部分を必要とし、常にメモリのその場所を使用します。Jitterはその各々に名前をつけることで、それがRAMのどこにあるかという情報を追い続けることができます。(メモリの中の場所については、常にユーザが知っていなければならないわけではありませんが、Jitterオブジェクトが情報を見つけるためにはその場所がわかっている必要があります。)

重要な考え方:Jitterオブジェクトが相互に通信するために最も重要なものは、マトリックスにつけられた「名前」ーメモリの中のデータが格納されている場所ーです。(「マトリックス」という言葉の意味については、チュートリアルの次章で詳しく説明します)Jitterオブジェクトは、他のJitterオブジェクトだけが解釈できるメッセージを出力します。このメッセージは jit_matrix という語の後にスペースを1つ入れ、データが格納されている場所を示すマトリックスの名前を続けたものです。このメッセージは、Maxで普通に用いられるパッチコードによる方法で、Jitterオブジェクトから他のJitterオブジェクトへ伝えられます。(ただし、MSPオブジェクトのパッチコードが、他のMaxのパッチコードと異なる外観をしているように、Jitterオブジェクトのアウトレットから jit_matrix メッセージを伝えるパッチコードはユニークな外観をしています。)受信側のJitterオブジェクトがインレット(普通は左インレット)でメッセージを受け取ると、メモリ内の指定された場所からデータを取得し、データに何らかの加工をして、加工されたデータの名前を左アウトレットに連結された全てのJitterオブジェクトに送信します。このようにして、各々のオブジェクトは他のオブジェクトの動作を知る必要なしにタスクを実行することができ、メモリの中の指定された場所を見に行くことで、必要なデータを取得することができます。ほとんどのJitterオブジェクトは、他のJitterオブジェクトから「マトリックスを参照して、そのデータに何らかの処理を行う」ためのメッセージを受け取るまでは、実際には何もしません。

多くの場合、Jitterオブジェクトはそれ自身の持つマトリックスに固有な名前を生成します。また、オブジェクトに使用するマトリックスを指定することもできます(それが望ましい場合もあります)。マトリックスに明示的に名前を付けることによって、複数のオブジェクトに、同じメモリ空間を使用するよう指定することができます。このような例については、チュートリアルの後の方の章で説明します。

Jitterオブジェクトによって引き起こされるアクション

あるJitterオブジェクトが、他のオブジェクトに対して jit_matrix メッセージを送信するきっかけとなるものは何でしょうか?ほとんどのJitterオブジェクトは、outputmatrixメッセージ、または bang(この 2 つのメッセージは、たいていのJitterオブジェクトでは同じ働きをします)を受け取ったときに jit_matrix メッセージを送信します。また、他のタイミングとしては、オブジェクトがこれらのメッセージを受け取ってデータに何らかの加工をした場合があります。このとき、他のオブジェクトに対して、新しいデータを含んだマトリックスの名前を報せるために、jit_matrix メッセージを自動的に送信します。

言い換えると、オブジェクトは、jit_matrix メッセージを受け取ったとき、それに何らかの加工をした後、自分自身で jit_matrixメッセージを送信するのです。outputmatrix bang を受け取った場合には、何も行わずに jit_matrix を送信します。

そのため、このパッチ例では、jit.qt.movieオブジェクトはQuickTimeムービーを「再生」し続けていて常にビデオのカレントの(その時点での)フレームを格納していますが、jit.window オブジェクトは jit.qt.movieオブジェクトから jit_matrix メッセージを受信した場合にだけそれを表示します。そして、これは jit.qt.movie オブジェクトが bang(または outputmatrix )メッセージを受信した場合にだけ起こります。このとき、jit.window はムービーの中のたまたま再生されているビデオフレームを表示します(これはその時点で jit.qt.movie が格納しているフレームです)。

jit.window に望み通りの速さで表示を更新させ、ビデオの進行につれて表示させるためには、 jit.qt.movie オブジェクトに対して、その速さで bang メッセージを送り続ける必要があります。


ムービーは jit.qt.movie オブジェクトで再生されます。しかし、
フレームを見るためには、その都度 bangメッセージを送る必要があります

・「play」と表示された toggle オブジェクトをクリックしてmetro オブジェクトをスタートさせて下さい。これによって毎秒25回(40ミリ秒ごと)の速さで bang メッセ?ジが送信されます。これはこのビデオの全てのフレームを表示させるのにちょうど良い速さになります。 bang メッセージが送り続けられている間、ムービーウィンドウに表示されるムービーを見ることができます。


jit.windowはマトリックスの内容(このケースではQuickTimeムービーのフレーム)を表示します。

toggle をクリックして、metroオブジェクトを停止させて下さい。jit.window オブジェクトはムービーウィンドウの更新を停止するため、最後に表示されたフレームを静止画として見ることができます。ムービーはまだ「再生され続けて」います。jit.qt.movieオブジェクトは1フレームごとに、メモリを更新しつづけていますが、もはやメッセージを送信していないため、jit.windowはそれに気づくことができません。

・ムービーが以前として進行していることは、metro オブジェクトの真下にある button オブジェクトをクリックして確かめることができます。これは jit.qt.movie オブジェクトに、 jit.windowに対して jit_matrix メッセージを送るよう命令しますが、これによってムービーウィンドウはその時点のフレームに更新されます。これを何回か行うと、マウスをクリックしている間にムービーが進行しているのがわかります(ムービーは10秒のカウントダウンをするもので、ループで繰り返し再生されます)。

まとめて言うと、jit.qt.movie オブジェクトは、通常のムービーの速さでQuickTimeムービーのフレームを1つづつ次から次へ読み続けていています。そして、jit.qt.movie オブジェクトが bang メッセージを受信したとき、データ(ビデオの1フレーム)の場所を jit.window に送信します。そのため、bang メッセージを受信したときに jit.qt.movie が保持していたフレームが、jit.window に表示されるデータとなるのです。

オブジェクト内のアーギュメント

このチュートリアルパッチの jit.qt.movie オブジェクトは、2つのタイプイン・アーギュメント(あらかじめオブジェクトに書き込まれたアーギュメント)、320 240 を持っています。この値はオブジェクトがビデオの1フレームをメモリに保持するために使われる横と縦(幅と高さ)の大きさを指定し、これによってこの大きさのフレームを格納するのに十分なRAMを要求します。ですから、最も単純なケースでは、read メッセージで読もうとするムービーの大きさをタイプすることが理にかなっています。ここでは、(私たちがムービーを作ったので)たまたま、QuickTimeムービー「カウントダウン」の大きさが320×240であることがわかっています。

読み込もうとするムービーの大きさより小さい値をアーギュメントとして指定した場合、jit.qt.movie オブジェクトは十分なメモリ領域を要求できないため、ムービーの各フレームのピクセルの一部分を無視しなければならなくなります。逆に、読み込むみムービーの大きさより大きい値をアーギュメントとして書き込んだ場合、ムービーの各フレームのピクセル数が割り当てられたメモリ領域を満たすのに十分ではないので、 jit.qt.movieはデータを均一に分散させようとし、余分なメモリを複製されたデータで満たします。

jit.windowオブジェクトは5つのタイプイン・アーギュメント、Movie 5 41 325 281 を持っています。最初のアーギュメントは jit.window が表示するデータのマトリックスに与えられる名前になります。この名前はムービーウィンドウのタイトルバーにも示されます。名前はどのような単語でも構いません。また、全体が「スマートシングルクォート」文字(スマートシングルクォートとは、option +]、shift+option+]をタイプすることで入力できる‘ と ’という文字を指します)で囲まれていれば、複数の単語によるものでも可能です。次の2つのアーギュメントはムービーウィンドウの表示領域の左上隅のスクリーン座標 x,y を示し、最後の 2 つのアーギュメントは表示領域の右下隅のスクリーン座標 x,y を表しています。(この 4 つの数値に対する別の考え方は、これらを「左」「上」「右」「下」を表す座標として覚えておく方法です。)ここでは、次のような理由でこれらの数値を選びました。

a) これらは320X240ピクセルの表示領域を表していますが、この大きさは表示しようとするムービーのサイズに等しいものです。

b) MacOSによって既定であるウィンドウボーダー、タイトルバー、メニューバーを考慮すると、ウィンドウ全体が、使用可能なデスクトップ領域のちょうど左上隅に配置されます。(jit.windowborder 0 メッセージを送ることで、ウィンドウボーダーとタイトルバーを非表示にすることが可能ですが、いまのところデフォルトのボーダーのままのほうがよいでしょう。)

metro のアーギュメントとして40を指定し、毎秒25回の bang メッセージが送信されるようにました。このQuickTimeムービーは、実際にちょうど24フレーム/秒のフレームレートを持っているため、この metrojit.window がすべてのフレームを得ることができるのに十分な頻度で jit.qt.movie オブジェクトを確実にトリガし、全てのフレームを見ることができるようにします。

jit.qt.movieオブジェクトは、実際には bang だけでなく、他の多くの(ここで説明しようとするにはあまりに多すぎるくらいの)メッセージを理解します。パッチャーウィンドウの右上隅にもう1つのメッセージの例を加えておきました。これは、単に jit.qt.movie オブジェクトが持つQuickTimeムービーの進行を、metro オブジェクトが送信する bang メッセージの速さとは独立してコントロールすることができることを示すためのものです。この time の後に数値を続けたメッセージは、jit.qt.movie オブジェクトの再生位置を、直ちにムービーの指定された時間位置へジャンプさせます。

・Restartというラベルのある button オブジェクトをクリックして下さい。これは、jit.qt.movietime 0 というメッセージを送り、QuickTimeムービーの最初にジャンプさせます。同時に、toggle1を送ってmetroオブジェクトをスタートさせ、ムービーの表示を開始します。

まとめ

QuictTimeムービーを再生するためには、jit.qt.movieオブジェクトを使ってファイルをオープンし、ビデオの連続したフレームをRAMに読み込み、jit.windowオブジェクトを使って別のウィンドウにムービーを表示させます。 タイプイン・アーギュメントを使って、ムービーの大きさ、スクリーン上での表示領域の正確な座標を指定します。

Jitterオブジェクトはマトリックスの名前(情報が格納されているメモリ内の場所)を互いにやりとりすることによって、特定のビデオフレームについての情報を伝えます。Jitterオブジェクトがマトリックスの名前を受け取ると、その場所にあるデータを使って指定されたタスクを実行し、加工されたデータの名前を他のJitterオブジェクトへ送ります。ほとんど全てのJitterオブジェクトは、bang(または、outputmatrix)メッセージを受信した場合に、名前を(jit_matrixメッセージの中で)出力します。したがって、ビデオの連続したフレームを見るためには、jit.window オブジェクトへ接続された jit.qt.movie オブジェクトに対して、必要な速さで bang メッセージを送る必要があります。


メッセージのトレースと個々のオブジェクトの役割