CD-DA の保存
本を電子書籍にして手放してしまうのとおなじように,音楽 CD もファイルにして手放したい。しかも本をカラー 300 dpi/白黒 600 dpi でスキャンするのとおなじように,CD もできるかぎり元のデータを復元できるようにしたい。
つまり,データをそのまま 16 bit ステレオ 44.1 kHz で取り出すのはもちろん,トラック間のギャップだとかもふくめて複製できる情報はすべて複製したい。そのデータを CD に焼いてまたリッピングしたらまったくおなじデータが取り出せるくらい。
CD-ROM の中身を完全に複製するときに,中身のファイルをコピーするのではファイルシステムより低レベルの情報が残らないので,そうではなくイメージファイルをつくるように。
でも CD ってリッピングしたデータだけ残して実物を手放すのって合法なんだっけ。まあリッピング済みの CD をダンボール箱か何かにつめて押入れにしまっておくだけでも,部屋のスペースが空くのでうれしい。CD を探す手間も減るし。
最初は CD-ROM のように ISO イメージをつくろうと思い,いろんなソフトウェアを試してみたが,ISO イメージをつくれるものがない。[イメージを作成]みたいなのを実行しても 音声データらしき 762 MB のファイルと cue シートなるものができる。調べてみると CD-DA は ISO イメージにはできないようだ。そうなのか。
CD-DA の複製をつくるときは,全トラックをひとつなぎにした音声ファイルと,トラック情報を記録したファイルにすることしかできないようだ。なぜだろう。納得が行かない。CD-DA のデータ構造はよく知らないが,どんなデータをどんなふうに記録するにしてもディスクにシーケンシャルに記録するしかないわけで,それをデータ構造を無視して頭からおしりまでひとつながりに読み取ったものをひとつのファイルにすることがなぜできないんだろう。それが ISO イメージというフォーマットにはならないにしても。
まあとにかく CD-DA からは単一の音声ファイルとトラック情報を取り出すことしかできない。で,Windows では後者は cue シートなるものにするのが主流みたい。でもおれの使っている Winamp では cue シートをサポートするにはプラグインが必要。それに Mac に乗り換える予定なんだけど,Mac では cue シートをサポートするソフトウェアはあまりないみたい。
1 トラックずつリッピングしたほうが扱いやすいんだけど,それだとトラック間のギャップだとかトラックの開始位置だとかの情報がたぶん消えてしまう。隠しトラックも消えてしまうか,残るとしても隠しトラックであるという情報は消えてしまうはず。1 トラックずつバラバラにして,さらにトラック情報も記録しても,あるトラックの末尾と次のトラックの開始が離れているとか重なっているとかいうときにデータが消えるとか重複するとかズレるとかめんどうなことになりそう(ただし調べられた範囲では,トラック情報に記録されているのはインデックスの開始位置だけで,長さや終了位置は記録されていないようなので,そんなことにはならないのかな)。
おれが気にする隠しトラックは,全トラックの演奏が終わってから無音がずっとつづいたあとに曲が入っているやつみたいなのじゃなくて,どこかのトラックの先頭に入っていて演奏時間が負数で表示されるようなトリッキーなやつ(って CD プレイヤーの実装によるかも)。
そういえば最近隠しトラックの入った CD を見ないな。CD を PC で Winamp で聴くようになってからだろうか。もしかして Winamp が隠しトラックをサポートしていないだけ? と思って調べてみたけど答えがなかなか見つからない。サポートしているのかな。
まあとにかく,全トラックをひとつなぎにした音声ファイルと cue シートで残しておくのがいちばん安心だろう。cue シートも中身はテキストなので,「やっぱり 1 トラックずつバラバラにしたい」などほかの形式に変換したくなっても対応できるし。ただし,この形式で隠しトラックの情報がきちんと残せるかは確認しておきたいが。
CD-DA をひとつなぎの音声ファイル+cue シートにできるソフトウェアはいろいろあるけど,やはりドライブの読み取りオフセットを修正できる EAC がいいだろう。
で,99 トラックある CD を EAC 0.95b4 で複製してみた。[プリトラックギャップ検出中]で全トラックを処理するのにえらく待たされた。トラックが少なければもっとマシなのかな。全体の所要時間は 52 分 33 秒。WAV と cue がひとつずつできた。
さて,この WAV+cue が元の CD の複製であるといえるかを確認するために,この WAV から 1 トラックを切り出した音声データと,CD から 1 トラックずつリッピングした音声データとがバイナリ一致するかどうかを試してみたいと思う。
WAV からの切り出しは何かのアプリケーションを使うのではなく手動でやることにする。これでうまくいくことを確認しておけば,どんな環境でも切り出しが実行できることになるし,アプリケーションを使って何か問題があっても,その切りわけができる。
今回はトラック 5 を切り出すことにする。cue を見るとこうなっている:
(snip)
TRACK 05 AUDIO
TITLE "Track05"
PERFORMER "不明なアーティスト"
INDEX 00 05:10:00
INDEX 01 05:10:10
TRACK 06 AUDIO
TITLE "Track06"
PERFORMER "不明なアーティスト"
INDEX 00 06:13:34
INDEX 01 06:13:42
(snip)
「INDEX 00」はプリギャップを記録しているらしい。ああ,隠しトラックって「INDEX 00」と「INDEX 01」のあいだを広げて,そこに入れているのかな。
EAC 以外にも ImgBurn と CD Manipulator でも CD の複製をつくってみたけど,それらの cue シートは「INDEX 00」がなくて「INDEX 01」は EAC とおなじ値だった。まあトラック 5 が欲しければ「TRACK 05」の「INDEX 01」から「TRACK 06」の「INDEX 01」まで切り出せばいいんだろう(ギャップを除きたければ「TRACK 06」の「INDEX 00」までかな)。
切り出すのは SoX を使う。trim コマンド。第 1 引数が切り出し開始位置,第 2 引数が切り出す長さ。単位は時分秒(秒は小数にできる)かサンプル数。バイト単位で厳密に切り出すにはサンプル数がいいだろう。
cue の INDEX の値は「分:秒:セクタ」。CD-DA はセクタ単位で記録され,1 セクタは 2352 バイト(エラー訂正用のデータを除いた実データで)。75 セクタで 1 秒。ということは 1 秒のバイト数は 2352×75=176400 バイト。CD-DA の音声は 16 bit ステレオだから,176400/4=44100 サンプル。たしかに 44.1 kHz になった。関係ないけど CD-DA のトラックの位置ってサンプル単位じゃなくてセクタ単位の粗い指定しかできないんだなあ。
SoX の trim のサンプル数っていうのは左右 2 バイトずつを合わせた 4 バイトで 1 サンプルってことでいいのかな。とすると 1 セクタは 2352/4=588 サンプル。
ということで cue シートの TRACK 05 の INDEX 01 の開始位置「05:10:10」(5 分 10 秒 10 セクタ)はサンプル数でいうと 13676880 サンプル:
$ echo $((((5*60+10)*75+10)*588))
13676880
同様にして TRACK 06 の INDEX 01 も計算。06:13:42 は 16473996 サンプル。したがって TRACK 05 の長さは 16473996-13676880=2797116 サンプル。
これでやっと SoX を使って切り出せる。te1.wav から te1-05.wav を切り出す:
$ sox te1.wav te1-05.wav trim 13676880s 2797116s
手元の SoX は 14.3.1 だが,最新の 14.3.2 では切り出す長さではなく終了位置を「=」を使って指定することもできるらしい:
$ sox te1.wav te1-05.wav trim 13676880s =16473996s
で,これで切り出した WAV が EAC で CD からトラック 5 だけをリッピングした WAV とめでたくバイナリ一致した。聴きくらべてもちがいがわからない(そりゃそうだ)。
ということで,この形式で CD-DA から取り出せる情報はすべて取り出せているようなので,とりあえず CD-DA の保存はこれで行くことにする。隠しトラックのある CD は要確認だが。あと CD EXTRA も。
::2011-12-14
update : 2011/12/14 (Wed) 16:05:19