CDDBの取得がうまくいかない話

オンライン環境がないところでCDから音楽ファイルのコピーを行うと、データベースに接続できずにうまくCDにタイトルやアーティストの名前が書き込まれません。
後からでも一応できるのですが、WindowsMediaPlayerしか入ってない環境だと、既存のファイルに対してはデータを書き込めず(オプションで書き込めるようにできるが、特定のファイルのみ更新みたいなことができない)ので、困っていたので自分用のCDの音楽の情報をゲットするプログラムを作ろうとした。

作ろうとした。まだできてないし詰んでる。

まず、普通、TOCデータを用いて、DBにリクエストを送るのが一般的だろう。
しかし、tocファイルはない。CDをいちいち用意しておくのは面倒なので、曲の長さなどから推測できないか考えていた。

もちろんC#で書く。
TagLibというのを使えば.NET環境においても音楽ファイルのメタ情報を簡単にいじれるので採用した。

まず曲の長さを取得する。

var tagFile = TagLib.File.Create(file);
TimeSpan ts = tagFile.Properties.Duration;

曲の長さはファイルのものと一致していたのであっているはずだ。
多分。

検索して出てきた正しいCDの情報
(アルストロメリアの曲めちゃくちゃいい……)

ここにあると思うが、自分の環境にあるファイルでで計算すると、
00:04:47.2296900 150 21525
00:04:23.0806900 21675 19725
00:05:19.4126900 41400 23925
00:13:06.8306900 65325 58950

曲の開始位置がこんな感じになってしまう。
何故だろう。

計算式は単純に、
(int)timeSpan.TotalSeconds * 75
で処理している。
cddbにある曲の長さの情報とも一致するのだが、やはり空白の時間が考慮されているのだろうか。うまく一致できない。

(21690-150)/75で曲の長さを確かめてみようとしたが、割り切れない!!!!!
しかし、doubleのまま計算すると、正常な長さよりも長くなってしまったのでおそらく小数点以下が考慮されているとかそういう問題ではなさそう。
つまり、曲の長さ+aがあるということが分かった。

もしかしたらブロックごとに始まる位置を変えているのかもと思い、CDのブロック情報について調査したが、1/75秒で1セクタ(?)使うようなので、あまり意味がなかった。というか75はおそらくここからきているのかもしれないという情報は得られたが。

しかし、曲の長さを計算したやつとはCDDBに登録されている曲の情報をうまく一致できない。曲と曲の間は一般的に2秒話すものだと思っていたのだが間違いだったのか……。

ちなみにCDDBがうまくいったらCDDB2の環境でもやるつもりだったが、まだまだ先は長そう。
実装できるかはわからない……。

参考