チュートリアル20

単一マトリックスのインポートとエクスポート


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

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

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

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

QuickTimeのエクスポートとインポート

QuickTimeムービーのフォーマットは、一つ前のチュートリアル「QuickTimeムービーを記録する」で学んだフォーマットと同じ物です。この場合、唯一の違いはエクスポートされた出力ムービーが1フレームの長さしか持たないという事です。ムービーの長さに関わらず、ムービー中の1フレームをインポートする事が出来ます。jit.matrixオブジェクトでインポートとエクスポートをする時にはimportmovieメッセージ、exportmovieメッセージを使用します。exportmovieメッセージを使うと、writeメッセージを jit.qt.recordオブジェクトに送った際に使用されるフォーマットで、簡単にエクスポートする事が出来ます。

実際は、jit.matrixオブジェクトにexportmovieメッセージを送ると、jit.matrixオブジェクトは内部にjit.qt.recordオブジェクトのインスタンスを作ります。そしてexportmovieメッセージの設定をwriteメッセージを使ってその内部のインスタンスに送ります。この事で今説明していることに関しての考え方を変える必要はありませんが、これはちょっと素敵な事です。

・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メッセージはフレームのエクスポートが完了すると自動的にファイルを閉じます(つまり jit.qt.recordオブジェクトで使用したようなstopメッセージ等は必要ありません)。

・今エクスポートした1枚のフレームを読み込むにはimportmovieメッセージを使います。本当にたった今エクスポートしたフレームをインポートしている事が確実に分かる様にするため、まず始めにjit.matrixオブジェクトの内容をクリアしましょう。それではclear,bangと書かれたメッセージボックスをクリックしてください。このメッセージを送ることでマトリックスはクリアされます。その際にマトリックスがjit.matrixから出力されるので、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.matrixのplanemapアトリビュートによる設定項目は、そのインレットから入力されたマトリックスにのみ反映されるので、この場合プレーンの順序の変換は行われないのです。

Jitterバイナリーのエクスポートとインポート

Jitterでは単一のマトリックスをエクスポートするのに、.jxfと呼ばれる独自のバイナリフォーマットを使う事が出来ます。JitterのバイナリフォーマットはQuickTimeフォーマットよりもシンプルに使うことができます。また、QuickTimeフォーマットで使用される様々なcodecによるデータの劣化が全くありません。さらにQuickTimeフォーマットが、4つのプレーン、データタイプcharのマトリックス(イメージ)にしか対応していないのに対し、.jxfフォーマットはあらゆるデータタイプ、ディメンジョン数、プレーン数のマトリクスに対応しています。


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

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

・writeメッセージのアーギュメントが出力するファイル名のみになっています。.jxfフォーマットは常に非圧縮の単一マトリックスのデータなので、これ以上のアーギュメントは必要ないのです。

・readメッセージは時間に関するアーギュメントを必要としません(.jxfのファイルは単一のマトリックスのデータしか持たないからです)。importmovieメッセージの様に、readメッセージはそのアーギュメントとして読み込むファイルのファイル名を指定することが出来ます。

・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オブジェクトをクリックしてください。このオブジェクトには使用できる静止画のフォーマットがリストとして入っています。それらの中から一つを選ぶと、jit.qt.movieオブジェクトに、選択したファイルタイプ名をアーギュメントにしたexportimageメッセージが送られます(pakオブジェクトを経由します)。ファイルダイアログが表示されるので、これから作成するファイル名を入力することが出来ます。jit.movieオブジェクトはイメージをエクスポートする際、自動的に適切な拡張子をファイル名に付け加えるので、入力するファイル名には拡張子を付ける必要はありません。Saveをクリックして次に進みましょう。

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

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

exportimageメッセージに全てのオプションアーギュメントをつけると、exportimage[file name] [file type] [dialog flag]となります。全てのアーギュメントはオプションで、省略してもかまいません。
file typeとdialog flagを省略すると、エクスポートは最後に指定したファイルタイプを使用して実行されます。まだファイルをエクスポートしていない時は標準でファイルタイプが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の上をクリックしてリストを見てみましょう。(訳注:ここでは、リストが文字化けているかもしれません。その場合は一度パッチをエディットモードにしてからubumenuを選択し、Fontメニューから日本語のフォント(Osakaなど)を選んでください。)私たちの環境では、リストの項目にはAIFF、BMP、FLC、HEURIS、MPEGやその他にもいくつかのものがあります。選択できるリストのうちのいくつかはおそらく知っている名前でしょう。ここからイメージシーケンスを選択してみてください。ubumenuの項目のインデックス番号は、exporter $1メッセージボックスを経て、イメージシーケンスのエクスポーター番号を jit.qt.movieに伝えます(ubumenuの項目のインデックス番号と、jit.qt.movieの中のエクスポーター番号は同じになります)。

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

・export 1と書かれたメッセージボックスをクリックしてください。ファイルダイアログボックスが表示され、ファイル名を入力するように指示されます。これから行う作業で数個のファイルが作られるのでここで新しいフォルダを作ることをお奨めします。適当なファイル名を入力してSaveをクリックしてください。

・別の特別なダイアログボックスが表示されるはずです。ここでは先ほど選択したエクスポーターに対して、オプション設定をする事ができます。イメージシーケンスのエクスポーターの場合は、フレームレートやファイルタイプ等の設定を行う事が出来ます(exportimageを使った時も同じファイルタイプの設定が出来た事を思い出してください)。フレームレート(表記はフレーム/秒)の所を空白にしたままにすると、エクスポートはもとのムービーのフレームレートを使って処理を行います。

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

新しいエクスポーターを使う時には、初めに一度だけexport 1メッセージを使う必要があるでしょう。同じエクスポーターを使用している間は、jit.qt.movieオブジェクトは一度設定したオプション設定を引き続き使用し続けます。試しにexportメッセージボックスをクリックしてみてください。エクスポーターのオプション設定のダイアログボックスは表示されることはなく、前回設定したのと同じ内容のオプション設定でエクスポートが行われるでしょう。代わりにexportsettingsとexportimagesettingsメッセージを使ってもエクスポーターのオプション設定を行う事が出来ます。これらのメッセージの場合には実際のエクスポートは行われません。


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

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

技術的な詳細:fulldialogフラグを使用すると、このダイアログで選択したエクスポーターの設定はそのとき限りの物になります。一度設定したエクスポーターの設定をその後も使用したい場合はexporterメッセージを使う必要があります。



jit.textfileオブジェクト

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

Jitterのマトリックスはテキストを含んだ全ての種類のデータを扱う事が出来ます。jit.textfileオブジェクトを使用することで、Jitterでテキストファイルを簡便にインポート/エクスポートすることが出来ます。一度テキストファイルを読み込んでしまえば、それをエディットして他のオブジェクトに送り、その後さらなる処理を加えたり、他のマトリックスデータと一緒に表示したりする事が出来ます。また、Jitterで作成したテキストをエクスポートして他のワードプロセッサで続きの作業をすることが出来ます。このセクションでは jit.textfileオブジェクトのインポート/エクスポートに関する機能を簡単に見ていきます。

What Is A Marix?の章で、Jitterのデータタイプの一つであるcharは1文字分のサイズのデータであると書いてあったのを覚えている人もいるでしょう。いくつかの複雑な文字セット(日本語のような)のように明らかな例外もありますが、ほとんどの言語ではcharタイプのデータはコンピュータの文字の記述に使用されます。数値番号と文字との対応はAmerican Standard Code for Information Interchange(一般にASCIIと呼ばれている)によって標準化されています。

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


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

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

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

・make codeと書かれたボタンを押して、テキストをエンコードしてみましょう。ボタンを押すと、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と書かれたボタンを押して、先ほどのエンコードが成功しているかどうか確認してみましょう。code textに書いたオリジナルのテキストがパッチの一番下のtexteditオブジェクトに表示されるでしょう。このプロセスについてもう少し見ていきます。

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

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

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

・MaxのTextオブジェクトと同様に、jit.textfileにlineメッセージを送ると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.matrix jit.matrixsetオブジェクトではJitterバイナリフォーマット(.jxf)も使う事が出来ます。これはJitterマトリックスを保存するのに特化した非圧縮のフォーマットです。jit.qt.movieオブジェクトにexportimageメッセージを送ることで、ムービーから1枚のフレームのイメージをエクスポートする事が出来ます。その際、いくつかのイメージフォーマットを選ぶ事が出来ます。そしてexportメッセージを jit.qt.movieに送ると映像の各フレームをイメージシーケンスとして保存する事が出来ます。

イメージだけでなく、Jitterマトリックスは、テキストデータのような他の形式のデータを扱うことも出来ます。jit.textfileオブジェクトを使用することでJitterマトリックスから簡単にテキストファイルをインポート/エクスポートする事が出来ます。jit.str.tosymboljit.str.fromsymbolオブジェクトを使うと、Maxのシンボルデータとストリングマトリックスのデータを変換することが出来ます。これらのオブジェクトはJitterのマトリックスデータを変換する一つの手段となります。