チュートリアル 1

QuickTime movieの再生


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

・Jitter Tutorialフォルダにある01PlayAMovie.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.moiveオブジェクトがファイルをオープンする前に、にautostart0というメッセージを送るとこの動作を変更することもできますが、この段階ではデフォルトのままにしておくのがよいでしょう)しかし、 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_matirxメッセージを受け取ったとき、それに何らかの加工をした後、自分自身でjit_matrixメッセージを送信するのです。outputmatrixやbangを受け取った場合には、何も行わずにjit_matrixを送信します。
このパッチ例では、jit.gt.movieオブジェクトはQuickTimeムービーを「再生」し続けていて常にビデオのカレントの(その時点での)フレームを格納していますが、jit.windowオブジェクトはjit.qt.movieオブジェクトからjit_matrixメッセージを受信した時にだけそれを表示します。
そのため、これはjit.qt.movieオブジェクトがbang(またはoutputmatrix)メッセージを受信した時にだけ起こります。この時、jit.windowはムービーの中のたまたま再生されているビデオフレームを表示します(これはその時点でjit.qt.movieが格納しているフレームです)。
jit.windowに望み通りの速さで表示を更新させ、ビデオの進行につれて表示させるためには、 jt.qt.movieオブジェクトに対して、その速さでbangメッセージを送り続ける必要があります。

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

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


jit.windowはmatrixの内容−このケースではQuickTimeムービーのフレーム−を表示します。

・トグルをクリックして、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.windowにborder 0 メッセージを送ることで、ウィンドウボーダーとタイトルバーを非表示にすることが可能ですが、いまのところデフォルトのボーダーがよいでしょう。)

metroのアーギュメントとして、毎秒25回のbangメッセージが送りだされるように40を指定しました。
この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.movieにtime 0 というメッセージを送り、QuickTimeムービーの最初にジャンプさせます。同時に、toggleに1を送ってmetroオブジェクトをスタートさせ、ムービーの表示を開始します。


まとめ

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

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


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