Hatena::ブログ(Diary)

極大コンパクト部分群

2009-10-17

普通のCD-Rドライブで普通のCD-Rに絵を描く

| 00:57

ブログを書く発端となった小ネタです。


だいぶ昔、YAMAHAが出してたドライブでCD-Rの記録面に絵を書くやつがあったじゃないですか。

http://www.yamaha.co.jp/product/computer/products/crwf1/crwf1.html


いまだと、レーベル面に絵が描けるやつもあるんですよね。

http://ja.wikipedia.org/wiki/LightScribe

http://ja.wikipedia.org/wiki/Labelflash


けど、どっちも専用ドライブが必要。

やってみたいけど、専用のドライブが必要。

そんなの買ってられるか!俺は普通のドライブでやるぞ!


っていう話。

#これを書き始めた時点でそこそこの成果は出てるんだけど、時系列で日記的に書くことにします。


さて、専用ドライブでは、直接レーザーを制御して、メディア上に渦状に点描することで絵を描いている、はず。

一方普通のドライブでも、CD-Rにデータを焼いたときにリング状に色むらが出ることがあるのは経験的に知ってた。

普通のドライブだとレーザーを制御することは出来ないけど、書き込むデータのレベルでうまいことやってやれば色むらを制御して絵がかけるんでは?

っていうのが根本のアイディア。



で、CDの基礎をちょっと勉強してみる。

ピット(へこみ)とランド(ピットでない部分)ででじたるに記録しているんだよねえというぐらいの知識はあったけど、調べたら結構思ってたのと違ってた。

まず一番下のレイヤーからたどっていくと…。

CDのピットとランドは、それがそのままそれぞれ1と0に対応しているのではなく、ピットとランドの境目が1、ピットorランドが続いてるうちは0という対応。

つまり、0xFFを書き続ければずっとピットになる(=CDRの色素が焼かれて色が変わる)というような単純な話ではない。

10000000000000... っていうビット列を書き込んでやれば、ずっとピット(orランド。どちらになるかはそれまでの文脈による)になる。

が、0x00を書き込んでやれば00000000というビット列が書き込まれるわけでもなく、1バイト256種類の値はEFM(Eight-to-Fourteen Modulation)変調という変調方式で14ビットのビット列に変換される。(EFM変調だと変調変調になっちゃうな)

これは冗長性のあるビット列で、1と1のあいだに0が2〜10個となるように定義されている。

さらに、1バイトが14ビットに変換された後、次の1バイトの前に3ビットの制御ビットが付加される。これはピットとランドの量が均衡するよう、000と001と010と100のどれかが選ばれる。




なぜこのような仕組みになっているかっていうと、レーザーでディスクを正確に読み取るためには、ピットがずっと続いたりランドばっかり続いたりすると色々と都合が悪いんですナ。

つまり、わたくしがやりたいのはピットとランドを自在に並べて色の偏りを作ることで絵を表現することなんだけど、そもそも使える256種の駒には0が最大でも10しか並んでないわけです。しかも相手は3ビットを使って均衡する方向にもっていこうとするので、10010000000000とかっていう14ビットを使ってピット3bitランド11bitとか並べようとしてもあっさり反転されてピットとランドの量が同じになってしまうわけです。

余計なことしてくれおって!

ただ制御ビットも含めて、0が0〜1個のみ・11個以上並ぶことは許されないので、こっちの2手次第ではその2手間で相手が出せる手を4→1種とかに限定させることもできる。ミニマックス法かよ。

しかしさらに、誤り訂正のためにCIRCとかいうパリティが付加されている。これはユーザデータ24バイトに対して8バイト。もちろんユーザデータに応じて生成されるので、中身を把握しようとしたらパリティ計算方法をシミュレートできにゃならない。

あと同期信号とか諸々の固定の値なんかも付加されて、24バイトのデータは最終的に588ビットになる。この時点で1と0の有り様を把握してランドとピットの量をコントロールできていれば、色ムラを出せるはず。はずなんだけど…パリティとか果てしなくめんどくさい。


続く。

トラックバック - http://d.hatena.ne.jp/hemoglo/20091017/1255795074