/**/

チュートリアル 20:
マトリックス単体のインポートとエクスポート

このチュートリアルでは、単体のマトリックスをJitterからディスクにエクスポートする方法を説明します。QuickTimeの静止画フォーマット、テキストやASCIIフォーマット、そしてJitter独自の.jxf ファイルフォーマットなど、様々なオプションについて見ていきます。

1つ前のチュートリアルで、マトリックスのシーケンスをQuickTimeムービーとして保存する方法を学びました。同じ方法を使って、単体のマトリックスを保存することができます。Jitter が扱うデータは連続したイメージだけでなく、非常に多くの情報を記述することができるため、個々のマトリックスをエクスポートする場合に、いくつかの追加のオプションが必要になるということはうなずけると思います。

jit.matrix オブジェクトからのインポートとエクスポート

jit.matrix オブジェクトは単一のマトリックスのインポートやエクスポートを行う際に、QuickTime ムービー と Jitterバイナリ(.jxf)という 2 つの形式を使用することができます。どちらのフォーマットでも単一のマトリックスをインポート、およびエクスポートすることができます。ここでは、両方のフォーマットに関して説明を行いますが、まず始めにムービーのフォーマットについて説明します。

QuickTime によるエクスポートとインポート

QuickTimeムービーのフォーマットは、この前のチュートリアル「QuickTimeムービーのレコーディング」で学んだフォーマットとまったく同じものです。このケースで唯一異なる点は、エクスポートされたムービーが1フレームの長さしか持たないということです。ムービーの長さに関わらず、ムービー中の1フレームをインポートすることもできます。jit.matrix オブジェクトから単体のマトリックスをインポート、エクスポートする場合には、importmovie メッセージ、exportmovieメッセージを使用します。exportmovie メッセージは、 jit.qt.record オブジェクトの write メッセージと同じフォーマットを使用しているため便利です。

実際は、jit.matrix オブジェクトに exportmovie メッセージを送ると、jit.matrix オブジェクトは内部に jit.qt.record オブジェクトのインスタンスを作ります。そして、その内部のインスタンスに対し、write メッセージと共に exportmovie メッセージで指定したアーギュメントを送ります。このことによって、これまでの考え方を変える必要はありませんが、ちょっと素敵なことです。

・Jitter Tutorialフォルダ内の20jImportExport.patというチュートリアルパッチを開いて下さい。


jit.matrix オブジェクトと importmovie、exportmovie メッセージ

read と書かれたメッセージボックスをクリックして jit.qt.movieオブジェクトにムービーを読み込んで下さい。ここでは1枚のフレームだけを扱いたいため、このパッチに metro オブジェクトはありません。また、 jit.qt.movie@autostart 0 という新しいアトリビュートが設定されていることに気がつくと思います。このアトリビュートを設定すると、読み込んだムービーは自動的にスタートしません。frame $1, bang と書かれたメッセージボックスの上のナンバーボックスを使って、読み込まれたムービーからエクスポートしたいフレームを選択することができます。

・色がすべておかしくなっているのはなぜでしょう? ここでは、jit.matrix オブジェクトのplanemapアトリビュートを使って、入力されたムービーのプレーンを 0 1 2 3(アルファ、赤、緑、青)から 0 3 2 1(アルファ、青、赤、緑)にマップ(割り当て)し直しているためです。このような変更を加えた理由は後で説明します。

exportmovie myframe.mov 30.jpeg と書かれたメッセージボックスをクリックして、フレームを QuickTime ムービーとしてエクスポートして下さい。jit.qt.record の場合と同じように、フレームレートとcodec(30.とjpeg)を設定しています。また、同様にファイル名myframe.mov も指定しています。exportmovie メッセージはフレームのエクスポートが完了すると自動的にファイルを閉じます。

・エクスポートした単独のフレームを読み込むためには、importmovie メッセージを使います。直前にエクスポートしたフレームが実際に読み込まれたということを確実にしたいため、まず、jit.matrix オブジェクトの内容をクリアします。clear,bangと書かれたメッセージボックスをクリックして下さい。このメッセージによってマトリックスはクリアされ、それが jit.pwindow に出力されるため、jit.pwindow は 真っ黒く表示されるはずです。

・次に importmovie,bang と書かれたメッセージボックスをクリックして下さい。ファイルダイアログボックスが表示されるので、myframe.mov の場所を探して読み込んで下さい。チュートリアルパッチと同じフォルダ内に保存されているはずです。その場所にファイルが見つからない場合は、ファインダーの検索...を使用してディスクドライブからファイルのある場所を探して下さい。先ほどエクスポートしたフレームが jit.pwindow に再び表示されるはずです。importmovie メッセージは、最初のオプションのアーギュメントでファイル名指定することができます。

・おそらく、2つ目の importmovie メッセージが何のためにあるのか疑問に思うのではないでしょうか。複数のフレームを持ったムービーから jit.matrix へフレームをインポートする場合、インポートしたいフレームのタイム値を指定しないと、オブジェクトはムービーの最初のフレームをインポートするメッセージであるとみなします。この例ではタイム値として600を指定していますが、これは標準的なQuickTimeムービーの場合、先頭から1秒の場所になります。チュートリアル4を思い出して下さい。ほとんどのQuickTimeムービーは600というタイムスケールを使用していますが、これは1秒間に600のタイムユニットを持つことを意味するものです。

importmovie 600, bang と書かれたメッセージボックスをクリックして、他のQuickTimeムービーを読み込んでみて下さい。jit.pwindow は読み込んだムービーの先頭から1秒のフレームを表示しているはずです。このとき、読み込んだフレームの色が変化していない事に気づくと思います。これは、マトリックスのデータが直接オブジェクトの中にインポートされるためです。jit.matrixplanemap アトリビュートは、インレットから入力されたマトリックスにのみ反映されるため、ここではプレーンの再マップは行われません。

Jitterバイナリによるエクスポートとインポート

Jitterには単体のマトリックスをエクスポートするために、.jxfと呼ばれる独自のバイナリフォーマットがあります。JitterのバイナリフォーマットはQuickTimeフォーマットよりもシンプルに使うことができます。また、QuickTimeフォーマットでは何らかのcodec が必要なためデータの劣化が生じますが、.jxf では、codec によるデータの損失なしにデータを格納することができます。さらにQuickTimeフォーマットが、4つのプレーンを持ったchar型のマトリックス(イメージ)にのみ対応するのに対し、.jxfフォーマットはあらゆるデータ型、ディメンション数、プレーン数のマトリックスにすべて対応しています。


jit.matrix オブジェクトで.jxfフォーマットを使用する

上のパッチではJitterバイナリフォーマットを使用しています。write メッセージと read メッセージを使用すると、このファイルフォーマットが選択されます。この例のパッチは先の例と非常によく似ていますが、いくつかの重要な違いがあります。

  • write メッセージは、出力ファイル名を指定するアーギュメント1つだけを取ります。.jxf フォーマットは常に非圧縮の単体マトリックスのデータであるため、これ以上のアーギュメントは必要ありません。

  • read メッセージは時間に関するアーギュメントを必要としません(.jxfのファイルは単体のマトリックスデータだけを持つためです)。read メッセージは、importmovie メッセージと同じように、オプションのアーギュメントによって読み込むファイル名を指定することができます。

  • read メッセージと write メッセージを jit.matrix オブジェクトに送った場合、jit.matrix オブジェクトは右アウトレットから確認のメッセージを出力します。このパッチでは jit.matrix の右アウトレットに print オブジェクトが接続されているため、Maxウィンドウでそれらのメッセージを見ることができます。

このセクションで説明されている方法は、両方とも、 jit.matrixset オブジェクトでも同様に利用することができ、同じように動作します。

jit.qt.movie オブジェクトからのインポートとエクスポート

jit.qt.movie オブジェクトを使用して、ムービーのフレームを、ムービーではなくQuickTime の静止画としてエクスポートするためには、2つの方法があります。第1の方法では単一のフレームをイメージファイルとしてエクスポートします。第2の方法ではムービー全てを、イメージシーケンスと呼ばれる、連続したイメージファイルとしてエクスポートします。

Jitterで生成したイメージをページレイアウトに使用する場合や、Photoshop あるいは GraphicConverter などの 他のグラフィック用ソフトと組み合わせて使用する場合には、この方法が望ましいでしょう。

jit.qt.movie オブジェクトは、ムービー以外のいくつかのフォーマットによって、QuickTime ムービーのインポートやエクスポートを行うことができます。しかし、ここでは、このチュートリアルの目的を考え、静止画のエクスポートだけを説明していきます。jit.qt.movie で利用できるインポートとエクスポートのオプションについて、より広範囲な内容を知りたい場合には、オブジェクトリファレンスの jit.qt.movie の項目、あるいはヘルプファイルを参照して下さい。

exportimage メッセージ

それでは、まず2つの方法の中でもより簡単な、jit.qt.movieオブジェクトに exportimage メッセージを送る方法から始めましょう。jit.qt.movie オブジェクトに exportimage を送ると、ムービーのその瞬間のフレームをイメージファイルとして保存することができます。この方法ではイメージの保存形式を、JPEG、PNG、TIFFなどを含むいくつかの標準的なグラフィックのフォーマットから選んで使用することができます。


jit.qt.movie オブジェクトへの exportimage メッセージ

・read と書かれたメッセージボックスをクリックしてQuickTimeムービーを読み込んで下さい。ナンバーボックスを使って、静止画としてエクスポートしたいフレームを選択して下さい。

ubumenu オブジェクトをクリックして下さい。このオブジェクトには利用できる静止画のフォーマットがリストとして含まれています。それらの中から1つを選ぶと、選択したファイルタイプ名をアーギュメントとする exportimage メッセージが(pakオブジェクトを経由して) jit.qt.movie オブジェクトに送られます。ファイルダイアログボックスが表示され、作成するイメージファイルのファイル名を入力することができるようになります。jit.qt.movie オブジェクトはイメージをエクスポートする際、自動的に適切な拡張子(.png、.jpg、tif. など)をファイル名に追加するため、入力するファイル名に拡張子を付ける必要はありません。Saveをクリックして次に進んで下さい。

・以上でエクスポートは完了です。エクスポートが正常に行われたかどうかを確認するために、Maxウィンドウを見てみましょう。jit.qt.movie オブジェクトは exportimage の処理が正常に完了すると右アウトレットから exportimage myfile 1というメッセージを出力します(myfile は入力したファイル名です)。exportimage の処理が正常に完了しなかった場合には、最後の数値が1以外のものになります。エクスポートされたイメージは、再度 Max で jit.qt.movie に読み込んで開くことも、ファインダに切り替えて好みのイメージ表示アプリケーションで開くことも可能です。

exportimage メッセージは、オプションで整数のアーギュメントを取ることができます。これはエクスポートダイアログボックスを開くかどうかの設定をするものです。exportimage 1 と書かれたメッセージボックスをクリックしてみて下さい。まず初めにファイル名を入力するように指示されます。その後、イメージファイルのエクスポートを行う前にダイアログボックスが表示され、ファイルタイプの変更や、そのファイルタイプによるエクスポートのオプションを設定することができます。

exportimage メッセージの完全なフォーマットは、exportimage [ファイル名] [ファイルタイプ] [ダイアログフラグ] です。全てのアーギュメントはオプションで、省略することができます。

ファイルタイプとダイアログフラグを省略すると、最後に指定したファイルタイプを使用してエクスポートが実行されます。一度もファイルをエクスポートしていない場合、PNGがデフォルトのファイルタイプになります。

jit.qt.movie オブジェクトからの一般的なエクスポート

jit.qt.movie を使って、ムービーファイルの全てをイメージシーケンス(各フレームごとの、静止画の連続)として保存することもできます。このプロセスはやや複雑なエクスポートのメカニズムを使用します。

QuickTimeでは、個々のムービーは潜在的にそれぞれが使用できるエクスポーターのセットを持つことができます。例えば、QuickTimeムービーの中のサウンドトラックを、CDオーディオや AIFFファイルとしてエクスポートしたい場合があるかもしれません。あるいは、Photo-JPEGビデオのトラックをDVストリームにエクスポートできる場合があるかもしれません。ごく少数のフォーマットにしかエクスポートできないムービーもあれば、いくつかのフォーマットにエクスポートできるムービーもあります。この潜在的に様々に変化するオプション環境に適応できるように、jit.qt.movieのエクスポートはできる限り柔軟であるように考えられています。そして、この柔軟性を理解するためにはもう少し説明が必要です。


jit.qt.movie による一般化されたエクスポート

read garbage.mov と書かれたメッセージボックスをクリックしてファイルを読み込んで下さい。このムービーは1秒の長さしか持たないため、これを使用することにしました。必要であれば、ナンバーボックスを使ってムービーのフレームを操作することも可能です。

getexportlist と書かれたメッセージボックスをクリックして下さい。これにより、 jit.qt.movie は右アウトレットから exporterlist という語の後に続く形で使用可能なエクスポーターの項目を出力します。このパッチでは、項目のリストを分解してubumenu の選択リストとして入力し、容易にアクセスできるようにしています。

ubumenu をクリックしてリストを見てみましょう。私たちの環境では、リストの項目にはAIFF、BMP、FLC、HEURIS MPEG、その他いくつかの項目があります。おそらく、提供されているフォーマットのうちのいくつかは、すでに知っているものでしょう。この中からイメージシーケンス (Image Sequence) を選択して下さい。これにより、exporter $1 というメッセージボックスから、イメージシーケンスエクスポーターのインデックスナンバー(ubumenuの項目のインデックスナンバーと同じものです)が jit.qt.movieに送信されます。

重要な詳細:ムービーによって潜在的に持っているエクスポーターのセットが異なるため、同一のエクスポーターのセットを持ったムービーでも、各エクスポーターのインデックス番号は異なる場合があります。

export 1と書かれたメッセージボックスをクリックして下さい。ファイルダイアログボックスが表示され、ファイル名を入力するように指示されます。この後の操作では数個のファイルが作られます。シーケンスの保存のために、ここで新しいフォルダを作っておくことを推奨します。有効なファイル名を入力してSaveをクリックして下さい。

・特別なダイアログボックスが表示されるはずです。ここでは、先ほど選択したエクスポーターに対してオプションの設定を行なうことができます。イメージシーケンスのエクスポーターの場合、フレームレートやファイルタイプなどが設定できます( exportimage を使用した場合にも、同じファイルタイプのオブションが利用できた点に注意してください)。フレームレートのフィールドを空白のままにした場合、export 処理は、ムービーにもともと設定されているフレームレートを使ってイメージの生成を行ないます。

個々ののエクスポーターが独自のオプション設定を持っている場合もあります。このダイアログボックスは jit.qt.movie への export メッセージの後に1(これをオプションフラグと呼びます)を続けて送信した場合にのみ現れます。export メッセージではオプションフラグの前にファイル名の指定をすることもできます。

新しいエクスポーターを使う場合には、最初に1回だけ export 1メッセージを使う必要があります。同じエクスポーターを使用している間、jit.qt.movie オブジェクトは最初に設定したオプションを覚えていて、それを使用します。試しに exportメッセージボックスをクリックしてみて下さい。エクスポーターのオプション設定用のダイアログボックスは表示されず、前回設定したときと同じ内容のオプションでエクスポートが実行されます。

・しばらくの間、進行状況を示すダイアログボックスが表示されます。このダイアログボックスが消えると、エクスポート処理が成功したかどうかをMax ウィンドウで確認することができます。エクスポートが正常に終了すると、jit.qt.movieexport myfile 1というメッセージを右アウトレットから出力します(何か問題があった場合、この数値は1以外の値になります)。ファインダーに切り替えて、イメージシーケンスの保存用に選択したフォルダの中を見てみると、連続したファイル名を持つ数個のファイルがあることがわかるはずです。これでムービーをイメージシーケンスとしてエクスポートすることができました。いくつかファイルを開いてみて、それぞれが異なったフレームを表示していることを確認して下さい。

・Maxに戻って export fulldialog と書かれたメッセージボックスをクリックして下さい。 fulldialog というアーギュメントは export メッセージのもう一つのフラグです。これを jit.qt.movie オブジェクトに送信すると、QuickTimeの エクスポートの設定をすべて行なうことができるダイアログが開きます。ここではファイル名、エクスポーター、そしてエクスポーターのオプションまで一度に全ての設定を行なうことができます。

技術的な詳細:fulldialog フラグを使用した場合、jit.qt.movie はこのダイアログの中でどのエクスポーターが選択されたかを認識できません。jit.qt.movie に現在のエクスポーターの設定を記憶させておきたい場合には exporter メッセージを使う必要があります。

jit.textfile オブジェクト

これまでの内容で十分ですか? まだあります。ここで少しイメージデータから離れてみましょう。

Jitter の マトリックスはテキストを含む全ての種類のデータを扱うことができます。 jit.textfile オブジェクトは、Jitter へのテキストファイルのインポート、Jitter からのテキストファイルのエクスポートを行なうための便利なインターフェイスを提供します。一度テキストファイルをインポートすれば、それをエディットしたり、他のオブジェクトに送信してさらに処理を加えたり、他の任意のマトリックスデータと共に表示したりすることができます。また、Jitterで作成したテキストファイルをエクスポートし、続きの作業を他のワードプロセッサで行なうことも可能です。このセクションでは jit.textfile オブジェクトのインポートやエクスポートに関する機能を簡単に見ていくことにします。

マトリックスとは?」という章で、Jitterのデータ型の1つであるcharが1文字分のサイズを持つデータであると書いてあったことを覚えているでしょう。特定の複雑な文字セット(日本語など)のように明らかな例外もありますが、ほとんどの言語では コンピュータの文字表現にchar 型のデータを使用します。数値と文字との対応は、一般にASCIIと呼ばれる、American Standard Code for Information Interchange によって標準化されています。

ASCIIコードに関して興味深いことの一つは、英語のアルファべットの中で基本的に使用される文字は、char 型のデータが利用できるデータ空間の半分以下しか占めていないということです(char型では256種類の値を表現できるのに対して、大文字が26文字、小文字が26文字、数字が10文字で、これらを合計してもたったの62文字です)。さらに、それらの基本的に使用される文字はchar型のデータ領域の前半(具体的には32から126の間)に収まっています。次のサンプルパッチではこの点を利用しています。


jit.textfile を使ったJitter上の文字列処理

このパッチはエンコードされたテキストメッセージを、Jitterマトリックスを使って送信しています。次に使い方を説明します。

・メッセージのエンコードから始めましょう。エンコードキーを選択して下さい。エンコードキーとは、メッセージをエンコードする(そして、後にデコードする)ために使用するパスワードです。encode key と表示された textedit オブジェクトの中にエンコードキーを入力して下さい。このパッチの一番上にある code textと表示された大きめの textedit オブジェクトの中に、エンコードしたいメッセージを入力して下さい。このサンプルパッチでは、メッセージには基本的な英語の文字だけを利用して、アクセント記号のついた文字も使用しないで下さい。

・make codeと表示された button を押して、テキストをエンコードしてみましょう。ボタンを押すと、2つの textedit オブジェクトの内容は、2つの jit.str.fromsymbol オブジェクトに送られます。この2つのオブジェクトはそれぞれの textedit オブジェクトの内容を、Maxのシンボルからマトリックスに変換します。2つのマトリックスは加算モードの jit.op オブジェクトで加えられ、新しくエンコードされたマトリックスが作られます。そしてそのマトリックスは jit.textfile オブジェクトに送られます。

2つのテキスト(そして、結果として2つのマトリックス)のサイズが違うことは問題にはなりません。Jitterは jit.op オブジェクトの右インレットに入力されたマトリックスのサイズを左インレットに入力されたマトリックスのサイズに自動的に合わせます。この際、必要に応じて右インレットのマトリックスのサイズは拡大縮小されます。このパッチに自分で jit.print オブジェクトをつけ加えて、それぞれのオブジェクトからの出力を見てみることができます。これを jit.op オブジェクトの出力と比較して、何が起こっているのかを確認して下さい。

jit.textfile オブジェクトをダブルクリックして下さい。このオブジェクトのテキストエディタウィンドウが開き、エンコードされたメッセージが表示されます。

・decord key と表示された textedit オブジェクトにエンコードキーを入力し、read code と表示された button をクリックして、先ほどのエンコードが成功しているかどうか確認して下さい。code text に書いたオリジナルのテキストがパッチの最も下にある textedit オブジェクトに表示されると思います。このプロセスについてもう少し見ていきます。

write と書かれたメッセージボックスをクリックして、後で友人に秘密のメッセージを送るために、このメッセージをディスクに保存しておいてください(友人にはエンコードキーを伝えるのを忘れずに!)。ファイルダイアログボックスが開いたら、ファイル名を入力し、Save をクリックして、メッセージをテキストファイルに保存して下さい。write メッセージは、オプションでファイル名を指定するアーギュメントを取ることもできます。

・あなたにもここに秘密のメッセージがあります。read secret.txt と書かれたメッセージボックスをクリックして下さい。read メッセージを使用するとディスクからテキストファイルを読み込むことができます。このケースでは、オプションとしてアーギュメントを使い、ファイル名を指定しています。このアーギュメントがない場合には、ファイルダイアログボックスが開きます。このダイアログボックスで目的のテキストファイルを探し、そのファイル名を指定します。

jit.textfileオブジェクトを再びダブルクリックして、エディタウィンドウに新しくエンコードされたメッセージが表示されていることを確認して下さい。準備ができたら、エディタウィンドウを閉じて下さい。decord key と表示された textedit オブジェクトにデコードキーとしてJitterと入力し、read codeと書かれたボタンをクリックすると、このメッセージをデコードすることができます。メッセージは読めたでしょうか?

・Maxの Text オブジェクトと同様に、jit.textfilel ineメッセージを送ると1行だけを出力します。Jitterでは、行はストリングマトリックスとして出力されます。ストリングマトリックスとは、データ型として charを使用し、ディメンション数が1、プレーン数も1のマトリックスのことです。このマトリックスは最後に0をつけた文字列によって構成されます。これは jit.str.fromsymbol で生成され、jit.str.tosymbol が前提としているマトリックスのフォーマットです。ここでは line 0 メッセージを使って jit.textfile の内容の最初の行を出力させ、これを jit.op オブジェクトに送ってデコードしています。

・このデコーダは、単にエンコード処理を逆に行なっただけです。減算モードの jit.op オブジェクトを使って、エンコードされたメッセージのマトリックスからキーのマトリックスを減算することによって、オリジナルのテキストを求めています。デコードされたテキストを全て含んだマトリックスは、jit.str.tosymbol オブジェクトに送られ、textedit オブジェクトに表示できるように通常のMaxメッセージの形に再変換されています。

・このパッチを、アクセント記号のついた文字などの拡張ローマ字でも正しく動作するようにしたい場合、いくつかの修正を加えなければなりません。最後にこの解決策を考えてみるのも良いでしょう。

ヒント:jit.op オブジェクトの op アトリビュートに秘密があります。

まとめ

Jitterは、単体のマトリックスをディスクにインポート、エクスポートするために、いくつかの方法を提供します。 jit.matrix オブジェクトは単体のマトリックスを1枚のフレームのQuickTime ムービーとして保存することができます(jit.matrixset オブジェクトでも同じことができますが、この章では説明していません)。その際、jit.qt.record オブジェクトのwrite メッセージと同じパラメータを使用することができます。jit.matrixjit.matrixset オブジェクトは、itterバイナリフォーマット(.jxf)もサポートしています。これは Jitter マトリックスを保存するために特化された非圧縮のフォーマットです。jit.qt.movie オブジェクトの exportimage メッセージでは、いくつかのイメージフォーマットの中から任意のフォーマットを使用し、1つのフレームイメージとしてマトリックスをエクスポートすることができます。また、export メッセージを jit.qt.movie に送ると、映像のフレームをイメージシーケンスとして保存することができます。

Jitterマトリックスは、イメージだけでなく、テキストデータのような他の形式のデータを扱うこともできます。jit.textfile オブジェクトを使用することによって、Jitterマトリックスから簡単にテキストファイルをインポート、エクスポートすることができます。 jit.str.tosymbolj it.str.fromsymbol オブジェクトを使用すると、Maxのシンボルデータとストリングマトリックスのデータを変換することができます。これらのオブジェクトは Jitter のマトリックスデータフォーマットを変換したり、逆変換したりするための手段の1つを提供してくれます。