表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
38/45

エピ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 推敲。


評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ