音楽CDには、音声データだけを入れたときに余る隙間がある。1980年代に、そこへ歌詞や簡単な絵を詰め込む規格が作られた。CD+G(CD+Graphics)という。カラオケ用のディスクで使われた、あの画面である。
この規格には、映像を流すという発想がそもそも入っていない。それでもCD+Gのディスクを集めているAdam Gashlin氏は、ここに「Bad Apple!!」の映像を流し込むことを思いついた。しかも歌詞つきで、実際のカラオケ機で再生できる形で。氏が自身のブログに残した技術メモが、制約と付き合った記録としてよくできている。

秒300コマンド、全画面を描くのに2.5秒
CD+Gの表示領域は、48×16のブロックで区切られている。1ブロックを書き換えるには最低1コマンド必要で、送れるコマンドは毎秒300個。単純に割り算すると、画面全体を一度描き直すのに2.5秒かかる。
歌詞が流れてくるだけなら、これで足りる。文字は画面の一部だけを書き換えれば済むからだ。しかし動画となると話が別で、1コマ2.5秒では毎秒0.4コマ。動画とは呼べない。
まず解像度を捨てる
最初の手は単純で、描く範囲を思い切り小さくする。11×4ブロック、ピクセルにして66×48。これだけまで削ると、白黒で毎秒6.8コマになった。まだ足りない。
次に効いたのが、変わった部分だけを描き直すやり方だ。Bad Apple!!の映像は白と黒のシルエットで、画面の多くは真っ黒な背景か、塗りつぶされた図形の内側で占められている。前のコマから色が変わったブロックだけを更新すれば、大半の作業は省ける。これで平均17FPS。前のコマの描画が早く終わったら次を前倒しで始める、という多少のばらつきを許すと20FPSまで上がった。
描いている途中が見えてしまう
ここで別の問題が出てくる。CD+Gのコマンドは送られた瞬間に画面へ反映される。つまり、次のコマを描いている過程がそのまま見えてしまう。しかも次々に更新し続けないと目標のフレームレートは出ないので、画面は常に描きかけの状態になる。ちらつきが止まらない。
普通のゲーム機やPCなら、裏で1コマ分を描き上げてから表に出す「ダブルバッファリング」を使う。ところがCD+Gが持っている画面用のメモリは1枚だけだ。
色の表を書き換えるという抜け道
そこで使われたのが、パレット(CLUT=カラールックアップテーブル)である。CD+Gは1ピクセルを4ビットで持ち、その値は色そのものではなく「16色の表の何番目か」を指す。表の中身は自由に書き換えられて、しかも16色ぶん全部をたった2コマンドで差し替えられる。1ブロック描くのに1コマンド必要な世界で、これは破格に安い。
ここから先が本題になる。2枚のモノクロ画像AとBを用意し、各ピクセルの色番号を「Aが黒でBも黒なら0、Aが黒でBが白なら1、Aが白でBが黒なら2、両方白なら3」と決めておく。すると、パレットの0〜3番の設定を変えるだけで、AだけがきちんとしたBad Apple!!の絵として見え、Bは背景と同じ色に潰れて存在しないことになる。逆の設定にすればBが見える。
画面のメモリは1枚のままなのに、事実上2枚ぶんが同居している。そしてAを表示したままBを描き替えれば、更新の過程は一切目に入らない。表示の切り替えは、パレットを差し替える1コマンドで終わる。この手法はビットプレーン抽出と呼ばれ、1982年の論文にすでに名前が出てくる古典的な技だ。

ちなみにこの発想は、同じ記事の中で歌詞の表示にも使われている。4行ぶんの文字をそれぞれ違う色番号で描いておき、パレット側で「いま白くしたい1行」以外を背景と同じ黒に設定する。表示を進めるときは、色の表を1コマンド書き換えるだけでいい。
速くはならない
ここが面白いところで、この工夫でフレームレートは上がらない。むしろ下がる。
2枚を交互に使うということは、それぞれのバッファが担当するのは1コマおきになる。時間的に離れたコマ同士は共通部分が少ないので、「変わったところだけ描く」の効きが悪くなるのだ。20FPSだったものが18.5FPSに落ちた。
さらにGashlin氏は、エミュレータ(Mega CD用のares)で試したところパレットの変更が即座に反映されない場合があり、描画の途中が見えてしまうことに気づいた。対策としてバッファを3枚に増やしている。1枚を描いている間、残り2枚のどちらが表示されていても完成した絵になるので、再生機側の実装のばらつきを吸収できる。代償として、コマ同士の間隔がさらに開いて平均17.3FPS。
最後に歌詞が乗る。歌詞は動画の描画で余ったコマンドの空きに少しずつ読み込ませ、足りないときは動画側から枠を奪う。この結果、平均16.3FPS。音声・トリプルバッファリングされた映像・歌詞の3つが同時に走った状態で、この数字である。
留意点
- ここに挙げたフレームレートは、いずれもGashlin氏が自作のデータで測った平均値。CD+Gの再生機は実装に幅があり、どの機械でも同じ見え方になるとは限らない。
- 変わったブロックだけをXORで書き換える方法は、「いま画面に何が出ているか」を送り手が正しく把握できている前提に立っている。コマンドが欠けたり、シークや一時停止で読み飛ばしが起きたりすると表示が崩れる。氏自身、この手法があまり使われてこなかった理由はここだろうと書いている。
- 歌詞の表示はカラオケ的な色変わりではなく、字幕に近い出し方になっている。
- CD+GにはCD+EG(CD Extended Graphics)という拡張があり、こちらは最初から2枚目のバッファを持っている。ただし対応ディスクはCD+G以上に少ない。
規格の隙間に残っていたもの
CD+Gは、CDオーディオの規格の一部として定義されている(国際規格IEC 60908では「TV-Graphics」と呼ばれる)。ロゴの表示すらないまま出回ったディスクも多く、どれだけ普及したのかは今となってははっきりしない。日本ではカラオケの印象が強いが、海外では歌詞やライナーノーツを入れる用途で細々と使われ、そのまま静かに消えていった。
毎秒300コマンドという制約は、30年以上前に「歌詞が出れば十分」という前提で引かれた線だ。その線の内側で、色の表を書き換えるという一点だけを頼りに映像を成立させた記録が残っている。実際に動いている様子と、より詳しい解説は元記事で見られる。パレット操作の裏側が見える「レインボー版」も公開されていて、こちらは何が起きているかが一目で分かる。


コメント