エピ31 サブコードの中身が気になります。
***
サブコードの中身が気になります。
マージンビットの確認をしていたらサブコードが出て来ました。サブコードの構成はエピ16で確認しましたが、実際のデータって見たいですよね。
*
セクタ(= 98 フレーム)の先頭のサブコードは S0 で、その次のサブコードは S1 です。その後は、0x00 か 0x40 でした、...エピ30で見たデータではね。ギャップ中(曲の前後の無音状態)なら 0x80 か 0xC0 だったのでしょう。
この 0x00 か 0x40(あるいは 0x80 か 0xC0)によって、1ビットの情報になり、98 - 2 = 96 フレーム分で 96/8 = 12 バイトになります。
本当は(?)サブコードの各ビットが P,Q,R,S,T,U,V,W となって各々に定義があるのですが、P がギャップ中か否かを示し、Q が経過時間などの情報を含むのみで、R,S,T,U,V,W は0のようです。
CDによっては、R,S,T,U,V,W も活用されているのでしょうが、それを表示できるCDプレーヤは現在では無いのかもね。
*
セクタの先頭を探してみると 32 個目のフレームで S0 が見つかりました。その後は 32 + 98 = 130 個目のフレームもセクタの先頭です。
セクタ毎にサブコードを出力して、12 バイトの情報を求めます。
- F25 - 32 - |01|01 01 00 00 51 00 00 02 51|AF 9F|
- F25 - 130 - |01|01 01 00 00 52 00 00 02 52|71 2E|
この 12 バイトは |CNT&ADR|DATA|CRC| という構成です。
*
CNT&ADR は1バイトで、民生用・音楽用・コピー禁止・プリエンファシスなし・現在位置の情報であることを示します。
コピー禁止ですけどフラグが立っているだけだから、...。
*
DATA は9バイトで、1曲目の#1、経過時間0分0秒51セクタ、絶対時間0分2秒51セクタです。
経過時間は曲毎の時間で、絶対時間はプログラムエリア全体の時間です。経過時間と絶対時間の2秒の差は、曲の前に2秒のギャップがあることを意味するのでしょう。
1曲目の 51/75 = 0.68 秒からの音楽データが 0x00 であることは、エピ4で確認したWAVファイルと一致しますね。
*
CRC は2バイトで、この 12 バイトの誤り検出用の巡回冗長符号です。
生成多項式は x^16 + x^12 + x^5 + 1 で、反転パリティですって。いわゆる CRC-16 で、計算結果を反転するのですね。多分。
巡回冗長符号は良く見かけるので説明の必要はないと思いますが、自分でチェックしたいから関数を用意しました。
def calc_crc16(d):
crc = 0
for i in d:
crc = (crc<<8) ^ i
for j in range(8):
if crc >= (0x800000>>j): crc = crc ^ (0x11021<<(7-j))
return crc ^ 0xFFFF
d = [0x01,0x01,0x01,0x00,0x00,0x51,0x00,0x00,0x02,0x51,0xAF,0x9F]
print calc_crc16(d)
> 0
と、0が出力されればエラー無しです。リードソロモン符号で積和が0ならエラー無しなのと似てますね。
なお、巡回冗長符号を求めたいときには、データの末尾を 0x00, 0x00 とすれば、
d = [0x01,0x01,0x01,0x00,0x00,0x51,0x00,0x00,0x02,0x51,0x00,0x00]
print "%04X"%calc_crc16(d)
> AF9F
と表示されるんですよ。
*
別のデータも見てみます。
- F20 - 86 - |01|01 01 00 01 57 00 00 03 57|74 4D|
- F20 - 184 - |01|01 01 00 01 58 00 00 03 58|E0 5B|
このデータは音楽が入っている部分で、誤り訂正するとWAVファイルの 1.750 秒からと一致しました。エピ29の話です。
サブコードによると、86 個目のフレームで0分1秒57セクタですから、データの先頭は 1 + 57/75 - 86/98/75 = 1.748 秒になります。少しずれてますね。0.002 秒ですが。
もう一つ見てみます。
- F21 - 77 - |01|01 01 00 01 60 00 00 03 60|59 C3|
- F21 - 175 - |01|01 01 00 01 61 00 00 03 61|E3 B3|
このデータはWAVファイルの 1.791 秒からと一致です。
経過時間0分1秒60セクタですから、1 + 60/75 - 77/98/75 = 1.789 秒。これも 0.002 秒差。
1フレームは 588T だから、588/4321800 = 0.000136 秒未満なら最初のフレームを検出するまでの時間かもだけど、違うな。要調査。
あれ? でもということはクロスインターリーブによる 108 フレーム遅延(108/98/75 = 0.014 秒)は経過時間に含まれているのかな?
サブコードの経過時間とは何を意味するのか確認しないとですね。
*
もう一つ。P=1 となるデータを捕まえました。
- F107 - 82 - |01|01 00 00 00 12 00 00 01 62|44 95|
- F107 - 180 - |01|01 00 00 00 11 00 00 01 63|BA 66|
このデータは1曲目の#0です。#0はギャップ中(無音状態)であることを意味します。音楽が始まると#1になります。
それから、経過時間がカウントダウンしています。絶対時間は0分1秒62セクタですから、音楽が始まる直前に、経過時間は0分0秒0セクタになるのでしょう。
*
サブコードが 0x80 になるデータを見たくて、データの捕捉を繰り返しました。このデータのマージンビットとか気になるよー
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2025.6.17 推敲。




