
レーザー制御システム開発メモ②: ILDAファイル概要
演出用レーザーの制御について、DMXでの照明制御に比べてまとまった情報が無かったため、自分用のメモも兼ねて記事を書いていこうと思います。
免責事項※
可能な限り正確な情報を掲載するよう努めていますが、必ずしも正確性を保証するものではありません。
掲載された内容によって生じた直接的、間接的な損害に対し、一切の責任を負いかねますので、ご了承ください。
こちらは前回の記事の続きになります。
前回の記事でレーザーの概要について書きましたが、レーザーで読み込めるファイル形式であるILDAファイルの詳細について書いていきます。
ILDAファイル
・.ild形式のファイルで稀に.ILDなどのファイルも存在するようです。
・ILDAファイルはビッグエンディアンのバイナリデータです。
そのため一部リトルエンディアンであるmacなどで読み込むコードを書く際にはバイトスワップする必要があります。
・ILDAファイルフォーマットにはfps情報が含まれません。
おそらく機材依存でfpsが決定し、1フレームに指定された点の数が表現できる上限(pps ÷ fps)を超えると1つのフレーム内で収まらず次のフレームに繰り越されるためfpsが下がる原因になります。
・色に関しては視覚的な線形の値で指定することができます。
例えば値=255と比較して値=127は見た目的に半分の明るさになります。
サンプルファイル
フリーの.ildサンプルが欲しい場合は以下からダウンロードすることができます。
その他レーザー機材に同梱のSDカードに含まれている場合があります。
https://lasergraffiti.weebly.com/rgb-laser-ild-animation-downloads.html
https://www.laser-interface.com/en/downloads/ilda-files/summary/7-ilda-files/32-test-pattern-ilda-file-grid
http://www.laserfx.com/Backstage.LaserFX.com/Archives/DownloadIndex.html
ファイルフォーマット概要
https://www.ilda.com/resources/StandardsDocs/ILDA_IDTF14_rev011.pdfの仕様書に詳細が書かれていますが
固定長のヘッダーと可変長の複数データからセクションが構成されています。
そのセクションの集まりからILDAファイルは構成されています。
ファイルの終わりは
・フォーマットコード(後述)が0, 1, 4, 5のいずれか
・データ数が0
のヘッダーになるよう決められています。
(この最後のヘッダーの後にはデータは続きません)
色
ILDAファイルの色表現の方法はTrue ColorとIndexed Colorの二種類あります。
True Colorの場合はRGBごとに0-255の値を指定して色を表現します。
Indexed Colorの場合はカラーパレットとして色と番号のセットを登録しておき、番号を指定して色を参照することができます。
(どこかの記事で、古い規格なのでTrue Color推奨というのを見た気がします。)
セクションの種類
セクションにはフレームセクションとカラーパレットセクションの二種類あります。
フレームセクションでは1フレーム内で表現したい位置や色が複数格納されており、これらが複数フレーム分あることでアニメーション表現ができるようになっています。
フレームセクションでもさらに以下の4種類があります。
・位置を3D座標で指定し、色はカラーパレット番号を指定する
・位置を2D座標で指定し、色はカラーパレット番号を指定する
・位置を3D座標で指定し、色をRGB値で指定する
・位置を2D座標で指定し、色をRGB値で指定する
カラーパレットセクションでは色番号とRGB値を指定します。このセクション以降のフレームセクションで参照することができます。
ヘッダー
・フォーマットコード
そのセクションがどのような情報を取り扱っているか定義されます。こちらは既に"セクションの種類"の項目で説明したものを指します。
・データ数
カラーパレットセクションの場合は0です。
フレームセクションの場合は表現したい点の数です。ここでの点とはppsで1秒間に複数表現できる位置や色のことです。(以降も同様に点と記載します)
・フレーム番号
フレームセクションでは0から総フレーム-1の範囲です。
データ
一つのセクション内ではヘッダーの後、1フレームで表現したい点の数だけデータが連続で続きます。そして次のフレームセクションもしくはカラーパレットセクションのヘッダーへと続きます。
・ステータスコード
各点にはステータスコードという1バイトの値があり、これにより以下のことを表します。
1. LastPoint: 1フレーム内の最後の点であるかどうか
2. Blanking: 表示させないかどうか。(線と線の間を移動させる時やフレームの開始/終了時に使用)
最上位ビットであるBit7でLastPoint, Bit6でBlankingが0もしくは1です。
(一つのフレーム内ではBlanking→{線→Blankingの繰り返し}→LastPointかつBlankingのという順番の複数データパターンが多いです。)
・フォーマット
ヘッダーのフォーマットコードによってデータの構成が変わります。
ですが以下の二つの点が変わるのみです。
1. 点の位置が3D座標指定か2D座標指定か
2. 点の色が番号指定かRGB指定か
以下、それぞれの場合の構成です。(RGB指定の場合、BGRの順になっているのでお気をつけください)
点の位置が3D座標指定 + 点の色が番号指定の場合
点の位置が2D座標指定 + 点の色が番号指定の場合
点の位置が3D座標指定 + 点の色がRGB指定の場合
点の位置が2D座標指定 + 点の色がRGB指定の場合
サンプルコード
openFrameworksで読み書き対応のaddonを作成しました。
現状、3D座標のみであったり色の部分の実装が完全ではないですが随時修正する予定です。
作成している途中に既に以下のaddonが存在していることを知りました。
こちらも"STILL WORK IN PROGRESS"(制作途中)となっています。