2/1 SMAF 表示系の解析 赤 E0 1110 0000 青 03 0000 0011 緑 1C 0001 1100 GB 1F 0001 1111 [rrrg ggbb] (液晶パネルの特性で青が強く出るせいか?) R: 0 36 73 109 146 182 219 255 G: 0 36 73 109 146 182 219 255 B: 0 85 170 255 Gsqチャンク Gsq* * = 0〜FF はレイヤナンバー。小さいほど奥 コマンド+ [00 00 00 00] Gsq0{ Gdbp Chunk ID Size Time command 色 EOS Gsq0 背景色の設定: 47 73 71 00 00 00 00 08 00 20 01 FF 00 00 00 00 Gsq* } ------------------------ Gsq0 背景色設定 ------------------------ Gsq1 ビットマップやpngファイルを画像参照する cordi 00 [40] 11 81 2C [F0] 00 00 [07] 06 00 00 00 F0 00 00 80 02 10 F9 81 2C 00 00 00 00 00 00 [40] 0D 81 2C [F0] 00 00 [06] 06 00 00 00 FA 00 00 81 2C 00 00 00 00 00 -------------------------------- Gsq2 本処理 -------------------------------- T e x t | Auxility 00 [40] 0B 81 2C [FA] 04 24 [01] 04 [54 45 58 54] 32 [40] 15 80 7A [FA] 00 40 [01] 04 [54 45 58 54] [83] 08 03 FF 80 48 18 00 00 28 32 [40] 0B 80 48 [FA] 7F 5F [01] 04 [54 45 58 54] 80 48 00 = NOP [01]はText表示 08 Size 03 BannarType FF BackGroundColor 80 48 Window Span 18 Effective Span 00 InitialPosition 00 BannerTravel 28 BannerTime 00 00 00 00 --------------------- 00 40 0A 81 2C FA 00 00 [04] 03 20 18 CD 00 40 0A 81 2C FA 0F 09 [04] 03 23 1A 37 00 40 0A 81 2C FA 56 10 [04] 03 41 09 6A 00 40 0F 81 2C FA 00 3A [01] 08 83 5E 83 43 83 67 83 8B 00 40 1B 81 2C FA 00 54 [01] 0A 83 81 83 62 83 5A 81 5B 83 57 83 08 03 FF 80 48 3C 00 00 28 00 40 11 81 2C FA 7F 6C [01] 0A 83 81 83 62 83 5A 81 5B 83 57 81 2C 00 00 00 00 00 -------------------------------- cordi 指定 [1111 xx yy] 0x0 標準座標指定 0x1 対称座標指定 0x2 レイアウト指定 0x3 指定無し ----------------------------------------------------------------------- SMAF表示系の解析がだいぶできましたよっ! YAMAHAのSMAF Makerは扱えるオブジェクトの配列が限定されてるからだめですよね〜。 とはいえ、まだPNGなどの外部オブジェクトを取り込む方法はわかってませんが…(汗) とりあえず、文字を表示したり背景色や文字色を変えたりは出きるようになりました。 まず、チャンク構成です。 MMMD -+--CNTI | +--GTR | +--MTR* | +--CRC(2byte) んでもって、GTRチャンクは、基本的に複数のレイヤで構成されます。 番号が若いほど画面で見て奥のレイヤ。 GTR -+--ヘッダ情報(通常6バイト) | +--Gtsu セットアップ(時刻0の時点での) | +--Gsq0 背景色を設定する | +--Gsq1 画像とか格納 | +--Gsq2 色んな表示オブジェクトを指定。 | +--Gsq3,4,5... どんどん上の階層 Gtsuチャンクはサブチャンクを持ちますが、今のところわかっているのは Gdpdチャンクのみです。Gdpdチャンクの詳細はSMAF仕様書通りでした。 Gsqチャンクでは、デルタタイム+メッセージの連続でシーケンスデータを表現する(ここはMtsqと同じですね) EOSとして、0x00 0x00 0x00 NOPとして、0x00 を使用します。こっからはデルタタイム+メッセージを、[デルタタイム:メッセージ]という形式で記述しますね! 【Gsq0チャンク】 とりあえず [00:20 01 FF] [00:00 00 00] だけ記述すると、背景色は白になります。最後のやつがEOSですね。 20が、仕様書のBackDropColorになります。そのあとが、EventSizeで、その後がデータになります。 色指定は(rrrg ggbb)として8ビットで表現しますが、RGBのうちBだけなぜか2ビットしか利用できません。 恐らく携帯電話の液晶の性質(全体に青みがかかる)のせいだと思います。 赤 E0 = 1110 0000 青 03 = 0000 0011 緑 1C = 0001 1100 こんなかんじ。。。。 Gsq2チャンクはちょっと複雑ですね。メッセージの部分はさらに [Event+EventSize+LifeTime+Coordinates+Primary+Auxiliary]で構成。 ここでいうEventは汎用イベントのことで、今わかっているイベントは0x40しかありません。 Event size LifeTime Cordi Primary size text Auxiliary 00 [40] 0B 81 2C [FA] 04 24 [01] 04 [54 45 58 54] 32 [40] 16 80 7A [FA] 00 40 [01] 05 [54 45 58 54 55] [83] 08 03 FF 80 48 18 00 00 28 cordi 指定は、[1111 xx yy] 0x0 標準座標指定 0x1 対称座標指定 0x2 レイアウト指定 0x3 指定無し になります。その後の2バイトが実際の座標(位相)ですね。 Primaryは、0x01〜0x07でどういう処理を行うかを指定します。 ちょうど仕様書P80のとこです。0x01なら、後に続くテキストをsize分表示します。 Auxiliaryはその処理をさらに精密に設定します。 1つ目のイベントは単に4文字表示するだけですが、2つ目の方は表示したものにAuxiliaryで設定した 項目により動作をつけます。その説明はP87の通りでした。 もうこれだけでちゃんと表示されましたから、あとはNOPとLifetimeを楽曲のシーケンスデータと同期をとって 連続して再生されるようにするだけです。 00 40 13 8A 5C FA 00 56 01 08 83 5E 83 43 83 67 83 8B 80 02 32 01 00 40 20 8A 5C FA 04 74 01 0A 83 81 83 62 83 5A 81 5B 83 57 80 02 32 01 83 09 01 FF 80 48 3C 00 00 80 48 00 40 08 8A 5C FA 40 05 02 01 00 32 40 0D 8A 2A FA 40 05 02 01 01 85 03 32 32 00 8A 2A 00 00 00 00 00 ----------------------------------------------------------------------- 00 40 1D 82 74 FA 7F 7F 03 01 01 80 04 31 FF 32 01 87 05 07 32 82 10 32 84 06 00 01 FA 00 00 32 00 40 1D 82 74 FA 00 7F 03 01 02 80 04 31 FF 32 01 87 05 09 32 82 10 32 84 06 00 01 FA 7F 00 32 00 40 1D 82 74 FA 7F 00 03 01 03 80 04 31 FF 32 01 87 05 08 32 82 10 32 84 06 00 01 FA 00 7F 32 00 40 1D 82 74 FA 00 00 03 01 04 80 04 31 FF 32 01 87 05 0A 32 82 10 32 84 06 00 01 FA 7F 7F 32 82 74 00 00 00 00 00