/**/

チュートリアル 23:
FireWireカメラのコントロール

このチュートリアルでは、jit.avc オブジェクトを使って、FireWireに対応したDVカメラやDVデッキの送信をJitterからコントロールする方法を紹介します。このオブジェクトは、JitterとDVデバイスの間で通信を行なうための、シンプルなインターフェイスを提供します。これにより、Maxのインターフェイスを使ってFireWireDVデバイスをコントロールしたり自動化したりすることができます。

AV/C(Audio Video Controlの省略形)はDVカメラなどの外部デバイスとコンピューターが通信するためのプロトコルの正式名称です。使用されている正確な仕様は、AV/C Tape Recorder /Player Subunitと呼ばれています。仕様書全体のコピーは以下のサイトで見つけることができます。
http://1394ta.org/Technology/Specifications/specifications.htm

仕様書では、使用可能な様々なタイプの送信コントロールを3つの大きなグループに分けています。

  1. WINDグループはメディアの再生を伴なわずに、メディアを順方向と逆方向へ進める場合に使用されます。WINDグループのコマンドには、停止、早送り、巻き戻しが含まれます。

  2. PLAYグループには、順方向や逆方向へ、様々な速度でメディアを再生するために使用するコマンドが含まれています。例えば、再生、停止、スロー再生、スロー逆再生が含まれます。

  3. RECORDグループはメディアに挿入データをする場合に使用されます。

これらの3つのグループは全て jit.avc オブジェクトに実装されています。さらに、 jit.avc オブジェクトは、 ハードウェアに対してどのようなコマンドでも送ることができる custom メッセージをサポートしています。custom メッセージでは、直接 jit.avc がサポートしていないメッセージであっても送ることが可能です。

このチュートリアルのサンプルパッチでは、DVカメラ、あるいはDVデッキがコンピュータのFireWireポートに接続され、電源がオンの状態になっていることを前提としています。

プラグアンドプレイ

jit.avc オブジェクトとハードウェアのコネクションを開いたり、閉じたりする場合には、これまでのチュートリアルで使用した jit.qt.grab オブジェクトや jit.qt.videoout オブジェクトと同様に、明確な指定が必要になります。しかし、jit.avc の場合には、一つのタイプのデバイスとしか通信しないため、ややシンプルなものになっています。

基本

・Jitter Tutorialフォルダから 23jFWCameraControl というチュートリアルパッチを開いて下さい。


jit.avcとその仲間たち

getdevice というメッセージボックスをクリックして下さい。これにより、jit.avcオブジェクトはコンピュータに接続されている使用可能なデバイスを探索します。デバイスを1つ発見すると、オブジェクトは device というにシンボル続く形で、デバイス名をアウトレットから送信します。私たちが Sony DVカメラを接続した場合、 jit.avcdevice Sony DV というメッセージを送信しました。

・このパッチでは、route オブジェクトとprepend オブジェクトを使用して、発見されたデバイス名を空白のメッセージボックスに表示させています。jit.avc オブジェクトが使用可能なデバイスを発見できない場合には、エラーメッセージがMaxウィンドウに表示されます。

エラーメッセージが表示された場合には、DV機器とコンピューターの間のケーブル接続のチェック、および、デバイスの電源が入っているかどうかのチェックを行なってみて下さい。

・open と書かれたメッセージボックスをクリックして下さい。これにより、jit.avcは見つかったデバイスとのコネクションを開きます。

技術的な注:jit.avcオブジェクトに open メッセージを送る際には、事前の設定を行なう必要はありません。 jit.qt.grabjit.qt.videoout などの複数の入出力を切り替えられるオブジェクトとは異なり、 jit.avc オブジェクトは1つの「デバイス」(DVコンポーネント)としか通信を行ないません。このコンポーネントは1台のハードウェアの使用をサポートします(これはMacOSの仕様です)。

PLAYグループとWINDグループ(VTRモード)

チュートリアルのこの部分では、はあなたがDVカセット(すでにデータがレコーディングされているもの)をデバイスに入れて、しかもデバイスがVTRモードになっていることを前提にしています。

playstoppauserewindff というメッセージボックスを(1回に1つずつ)使って、FireWire機器がどのように動くか観察して下さい。機器のボタンを直接押した時と同じように反応するはずです。

ubumenu オブジェクトをクリックして、PLAYグループのメッセージの一部を含んだリストを見て下さい。これらのメッセージは play という言葉の後に、PLAYグループの具体的な動作名を表したシンボルを続けるという形で構成されています。p avc_play_commands サブパッチをダブルクリックして、ubumenu のそれぞれの項目に関する簡単な解説を見て下さい。使用できる全てのメッセージのリストはオブジェクトリファレンスの jit.avc オブジェクトの項目で見ることができます。ubumenuを使用していくつかのメッセージを jit.avc オブジェクトに送信して、その効果を確認して下さい。

・現在のテープの時刻を確認するために、gettime というメッセージボックスをクリックして下さい。gettime メッセージを受信すると、jit.avc オブジェクトは、現在の時刻を time というシンボルに4つの整数が続いたリストの形でアウトレットから送信します。このパッチでは、routeunpack オブジェクトを使用してそれらの整数の値をパッチの最下部のナンバーボックスに表示しています。ナンバーボックスの値はそれぞれ、時、分、秒、フレーム数を示しています。

closeと書かれたメッセージボックスをクリックして jit.avc オブジェクトとDVデバイスの間のコネクションを閉じて下さい。

お時間はありますか?

下のパッチは gettime メッセージを利用した例です。ここでは、接続されたDVデバイスがロードしているテープの最初の1分間を再生し、その後、巻き戻しをして、その動作を繰り返します。例えばこのようなパッチをビデオインスタレーションの自動化に使えるかもしれません。


jit.avc を用いたDV送信の自動化

・機材の中に入っているDVカセットが1分間以上レコーディングされている状態であることを確認して下さい。そうでないと、このパッチは正常に動作しません。このパッチにエラーチェックの機能を追加することは、やる気のある方には良い練習になると思います。

open と書かれたメッセージボックスをクリックして jit.avc オブジェクトとデバイスのコネクションを開いて下さい。

metroオブジェクトに接続されたtoggleをクリックして下さい。クリックすると2つのことが起こります。trigger オブジェクトがデバイスに rewind メッセージを送信し、metroがオンになって gettime メッセージが 100ミリ秒ごとに jit.avc に送信されます。

・このパッチではrouteオブジェクトを使って、jit.avc オブジェクトから返されたメッセージ(time [hour] [minute] [second][frame])を画面の上部にある unpack オブジェクトに送信しています。個々の時間の値はリストからそれぞれ整数の値に分割され、乗算、加算によって、現在の時刻が示しているフレーム数を求めています。

実際には私たちの計算したフレーム数はやや不正確です。DVではそのフレーム数は1秒間に30ではなく29.97になっています。単純にするために今回は切り上げた値を使用しました。この例題での使用にあたっては、このくらいの計算の精度でも十分です。

・次に、select オブジェクトを使用して、フレーム数が0、あるいは18122115かどうかをチェックしています。これはなぜでしょう?DV機器がタイムコードを見つけられないとき(最初までテープを巻き戻して停止したときなどに起こります)、DV機器は現在時刻のタイムコードとして、0 0 0 0 または 165 165 165 165 という値を返します。どちらの値が返されるかは、そのデバイスのモデルによって異なります。そして、(0 * 10800) + (0 * 1800) + (0 * 30) + 0 = 0か、(165 * 10800) + (165 * 1800) + (165 * 30) + 165 = 1812215 になるため、テープが完全に巻き戻されたことをチェックできるようにこれらの数値を使っています。フレーム数が 0 か 1812215 になった場合は、play というメッセージボックスに bang が送信され、再生がスタートします。

jit.avc オブジェクトは、 デバイスの正確な送信状態を16進数の値で取得できる gettrasport という高度なメッセージもサポートしています。上記のような場合、これを使用することもできました。しかし、ここでの目的のためには、上記の方法で十分であり、いくぶんわかりやすいと思います。gettransport に関するより詳しい情報は、オブジェクトリファレンス、あるいはヘルプファイルの jit.avc オブジェクトの項を参照して下さい。

・フレーム数が0か1812215になっていない場合には、巻き戻しか再生が行われています。ここで、約1分、もしくは1800フレーム(60秒 * 30フレーム)後にきちんと再生が止まるかどうかを確認をしましょう。まず、> 1800オブジェクトを使用し、フレーム数が1800より大きいかどうかをテストしています。このオブジェクトが 1 を送信すると、sel 1オブジェクトが rewind というメッセージボックスに bang を送信します。そして再び全てのプロセスを繰り返します。ここでの処理は以上のようなものです。

・確認できたら toggle をオフにして下さい。これによって metro もオフになります。そして、最後の rewind メッセージをDVデバイスに送り、最初の状態に戻すために巻き戻しを行なって処理を終えます。close メッセージボックスをクリックして jit.avc オブジェクトとデバイスのコネクションを閉じて下さい。

FireWireデバイスの中には time というメッセージをサポートしているものがあります。これを使うと、デバイスにロードされているテープを指定したフレーム位置に移動させます(位置の指定は、上記のものと同様な、4つの整数によるフォーマットで行います)。一般的に、DVカメラはこのメッセージをサポートしていません。jit.avc オブジェクトのヘルプパッチにある、Maxで自動テープ送り機能を構築する例を参照して下さい。

RECORDグループ

DV デバイスがDVカメラの場合、VTRモードとカメラモードという2つの操作モードがあります。VTRモードでは、テープの再生とカメラを使用しない(ライン入力からの)録画ができます。カメラモードはカメラを使用した録画をする場合に使います。VTRモードでは全てのPLAYグループとWINDグループのコマンド、さらにRECORDグループのコマンドを使用することができます。カメラモードでは、RECORDグループのコマンドだけが使用できます(レコーディングの最中に巻き戻しはできないでしょう)。チュートリアルのこの部分では両方のモードを使用することができますす。

RECORDグループには recordrecpause という2つの主要なメッセージがあります。record メッセージは録画を開始し、recpause メッセージは録画を一時停止させます。


jit.avc オブジェクトを使ったコマ落とし録画

jit.avcオブジェクトを使ってコマ落とし録画を行なうためには、この小さくシンプルなパッチの内容で十分です。このパッチでは、30秒毎に1秒間録画をするようになっています。それでは見ていきましょう。

open と書かれたメッセージボックスをクリックして jit.avc と使用しているDVデバイスのコネクションを開始して下さい。

・実際に試す前に、このパッチで具体的に何をしているのかを見てみます。1秒ごとに metroオブジェクトから counter オブジェクトに対して bang メッセージが送信されます。counter 0 を出力すると、sel 0 オブジェクトは まず record メッセージに対して、その次に delay オブジェクトに対して bang メッセージを送信します。指定されたディレイ時間の後、(ここでは1000msです)recpause メッセージが jit.avc オブジェクトに送信されます。2つのナンバーボックスを使ってcounter オブジェクトとdelay オブジェクトが持っている値を変更することができます。

・DVデバイスで正常に入力(組み込まれているカメラからの入力、あるいはライン入力)が行なわれていることを確認して下さい。確認したら、metro オブジェクトに接続された toggle をオンにして、数分間DVデバイスに注目して下さい。非常に簡単にコマ落とし映像が作れます!

・終了したら toggle をオフにし、close というメッセージボックスをクリックして jit.avc とDVデバイスのコネクションを閉じて下さい。

まとめ

jit.avc オブジェクトは、DVカメラやDVデッキのようなFireWireDVデバイスを、Maxのインターフェースからコントロールしたり自動化したりするための機能を提供します。このオブジェクトはWIND、PLAY、RECORDグループのコマンドを全て使用することができます。