エピ30 マージンビットを確認しましょう。
***
マージンビットを確認しましょう。
マージンビットとはEFM変換された 14 ビットの後に付ける3ビットのことです。同期信号とサブコードの S0 と S1 の後にも付けます。
マージンビットは、チャネルビットの1と1の間の0の個数が適度になるように、つまりピットとランドが3T〜11Tになるような3ビットを入れます。
それから可能ならピットとランドがバランスできる方を選びます。
***
エピ27で見つけたフレームを再掲します。サブコードが 0x00 の場合です。
100000000001000000000010 010 ... 同期信号
01001000100000 000 ______________ ___ ... サブコード
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 100 ... 音楽データ(12 バイト分)
00100000010010 000 00100000010010 010
00100000010010 000 00100000010010 010 ... 訂正符号(4バイト分)
01001000100000 000 01001000100000 100
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000
01001000100000 100 01001000100000 000 ... 音楽データ(12 バイト分)
00100000010010 000 00100000010010 000
00100000010010 000 00100000010010 000 ... 訂正符号(4バイト分)
同期信号の 24T の後に3ビット、サブコードの 14T の後にも3ビット、それから音楽データと訂正符号の 14T の後にも、もれなく3ビットが付いています。
これらがマージンビットです。
無音状態で音楽データが 0x00 の場合のことをエピ26で考えてみたときには(面倒だったので)マージンビットは000と仮定しましたが、実際には100と010も入るのですね。001は無い。
フレームの前半の音楽データでは000と100が交互に入り、訂正符号では000と010が交互に入るというパターンですが、後半では100が2連続したり、000が連続したり等の違いがあります。どうなっているのか見ただけでは分からないですね。
チャネルビットが 01001000100000(0x00)や 00100000010010(0xFF)のとき、マージンビットは、0x00 の前の001と 0xFF の後の100が禁止されるだけで、000や010などの値は選択可能です。
複数の値が選択できる場合にマージンビットを決めるのは、ピットとランドのバランス(カウンタの値)なのです。
ならば、カウントしてみましょう。
*
同期信号の後にサブコードの 0x00 が続く場合、選択可能なマージンビットは000と010なので、カウンタの初期値は0でランド開始として(これを 0L と表します)、
100000000001000000000010 000 01001000100000
11111111111___________11 111 1___1111______ = 0L +2 +3 -4 = 1L ★
100000000001000000000010 010 01001000100000
11111111111___________11 1__ _111____111111 = 0L +2 -1 +4 = 5P
カウンタが大きくなる010が選択される? アレ? アレ?
...。その次に 0x00 が続く場合、カウンタは5でピット開始(5P)なら、
000 01001000100000
111 1___1111______ = 5P +3 -4 = 4L ★
100 01001000100000
___ _111____111111 = 5P -3 +4 = 6P
010 01001000100000
1__ _111____111111 = 5P -1 +4 = 8P
なので000が選ばれる。
もしもカウンタが1でランド開始(1L)だと、
000 01001000100000
___ _111____111111 = 1L -3 +4 = 2P
100 01001000100000
111 1___1111______ = 1L +3 -4 = 0L ★
010 01001000100000
_11 1___1111______ = 1L +1 -4 = -2L
なので、100になる。...、むむっ、分かりました!
次に 0x00 が続く場合、マージンビットによって、
nL --> n+1P (000), n-1L (100), n-3L (010)
nP --> n-1L (000), n+1P (100), n+3P (010)
と変化する。ここから、
+3L --> 0L (010)
-3P --> 0P (010)
-3L --> -2P (000)
+3P --> +2L (000)
+2L --> +1L (100) or -1L (010)
-2P --> -1P (100) or +1P (010)
-2L --> -1P (000)
+2P --> -1P (000)
+1L --> 0L (100)
-1P --> 0P (100)
-1L --> 0P (000)
+1P --> 0L (000)
0L --> +1P (000) or -1L (100)
0P --> -1L (000) or +1P (100)
という状態遷移が導ける。つまり、0x00 が続くとカウンタは減少し続けて、最後は0と±1とをループする。
*
だったら、0L のとき000を選んで +1P になり、また000を選ぶと 0L に戻るので、マージンビットは000だけで良さそうだけど。
0L --> +1P --> 0L --> +1P --> 0L ...
実データでは、0L のときは100を選んで -1L に、次は000を選んで +0P に。それから100を選んで +1P、000を選んで 0L に戻るという遷移をしています。
0L --> -1L --> 0P --> +1P --> 0L ...
マージンビットは(カウンタの絶対値が同じ場合)000以外を優先するのね。
*
実は、CD-ROM規格にはマージンビットの選択ルールの解説があって、
> If two combinations give the same, lowest DSV,
> a combination with a transition shall be chosen.
ですって。ちゃんと明記されていた(DSV はカウンタのことです)。
*
同期信号は 0L 開始と仮定しましたが、0x00 のマージンビットの状況から逆算すると -4L だったようです。リードインの終わりで -4L になっているのでしょうか。
開始が -4L の場合、
100000000001000000000010 000 01001000100000
11111111111___________11 111 1___1111______ = -4L +2 +3 -4 = -3L
100000000001000000000010 010 01001000100000
11111111111___________11 1__ _111____111111 = -4L +2 -1 +4 = +1P ★
となり、正しく010が選択されることになります。その後は(+1P ですから)000と100が交互に選ばれる。
*
ピットとランドをカウントした図を作ってみました。
横軸は時間で 1〜588 です。単位は[T]です。縦軸がカウンタの値です。カウントはピットで+1、ランドで−1です。
青色(1〜24)は同期信号で、緑色(28〜43)はサブコード、赤色は音声データ、紫色(?)は訂正符号です。丸印は各データの終わりです。
音声データの前半は、0L --> -1L --> 0P --> +1P --> 0L と遷移していますね。
後半は訂正符号の影響で -1P からの開始になり、0xFF と 0x00 の間には100と001は選べないので、000と010とを比べて010が選ばれます。その後は000、100、100と選ばれて、
-1P --> +2P --> +1L --> 0L --> -1L
となり、その後は前半と同じパターンになる。ナルホド。
フレームの最後 T=588 では -4L になります。フレームの開始と同じになるのは偶然でしょうけど。いい感じ。
*
さて、0x00 以外のサブコードの場合も調べましょう。
S0 : 00100000000001 = +8P
S1 : 00000000010010 = -8L
00 : 01001000100000 = +4P
40 : 01001000100100 = -2L
サブコード S0 では +8P、S1 では -8L とカウンタが大きく変動します。0x40 は -2L と小さいです。
いずれにしても同期信号の後、サブコードによって4つに分岐して、音楽データのマージンビットによってカウンタが0に近づいて、どこかで合流するのでしょう。
図にしましょう。横軸は時間で 1〜95 までです。縦軸はカウンタの値です。
サブコードの終わり(T=41)で S0 は +5L、0x40 は +3P、0x00 は +1P です。それと S1 は -9L です。S0, 0x40, 0x00 は値が近いですが、S0 の後には000か001しか選択できないので、S0 の合流はしばらく後です。
まず、T=59 から 0x00 と 0x40 が合流します。そのときのマージンビットは100(-1L)と010(-3L)です。T=75 では 0L-1L = -1L, +2L-3L = -1L と同じになります。
それから、T=93 から S1 が合流。S0 が合流するのは T=347 でした(図にはありませんが)。
*
最後までの図、欲しい?
*
カウンタの最大と最小を調べてみます。
無音状態だと最大は 11 で、最小は -14 です。先の図で分かりますね。
エピ17で乱数生成したデータなら ±55 程でしたが、本当の音楽が入っている部分ではどうでしょうか?
このデータでは -21〜21 でした。他のデータだと、大きいと ±30 程まで振れることがある感じ。
音楽データを恣意的に選んでカウンタを目一杯アップすると +80 くらいは上昇して、訂正符号のマージンビットではそれを吸収できそうにないことから、カウンタのオーバーフローは可能そうですね。データ作成してCD-Rを焼いてみて観察したら良いかな。今後の課題ですね。
*
マージンビットにはついてはこんな感じで。
***
間違いの指摘とか疑問とか、ご意見・ご感想とかありましたら、どうぞ感想欄に!
***
2025.6.3 推敲。
2025.6.4 微推敲。




