2006年09月01日

MODE SENSE

MODE SENSE コマンドは、MODE SELECT コマンドと対になっています。 すなわち、MODE SENSE コマンドではドライブの各種のパラメーターを取得し、 MODE SELECT コマンドでそれらを設定します。

MODE SENSE コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x5A
1予約
2PCPage Code
3予約
4予約
5予約
6予約
7
(MSB)
パラメータ長さ
(LSB)
8
9予約
10予約
11予約


PC は Page Control の略で、以下の値をとります。

PC意味
00B現在値
01B変更可能な値
10B初期値
11B保存する値


MODE SENSE と、MODE SELECT で用いる Page Code は多数あり、 それだけドライブを細かく設定できます。 ただ、私が使っているのは少数なので、ここではそれだけ説明していきます。

Page Code 内容
0x01 読き込み/書き込みエラー処理設定
0x05 書き込みパラメータ設定
0x2A ドライブの性能
posted by 七癖 at 17:38| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月30日

READ CD MSF

読み取る位置をLBAで指定する READ CD コマンドのかわりに、 位置を時間で指定する READ CD MSF を使うことも出来ます。

READ CD MSF コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xB9
1予約セクタの形式予約Zero
2予約
3読み取り開始時間 (分)
4読み取り開始時間 (秒)
5読み取り開始時間 (フレーム=1/75秒)
6読み取り終了時間 (分)
7読み取り終了時間 (秒)
8読み取り終了時間 (フレーム=1/75秒)
9SYNCheader codesUser dataEDC & ECC C2 Error予約
10予約Sub-channel
11Control


読み取り開始時間から読み取り終了時間の1フレーム前までを読み取ります。 1セクタだけ読み取る場合には、終了時間に開始時間より1大きい値を入れます。

他のパラメータの設定の仕方や、帰ってくるデータのフォーマットは、前回までの READ CD と同じです。
posted by 七癖 at 09:30| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月28日

READ CD その3

READ CD コマンドの CDB で指定するサブチャネルの読み取り方法で、 受け取る形式を説明します。

000B の"読まない"は、大丈夫ですよね。

001B の"RAW形式"では、前に説明した96バイトの形式で帰ってきます。

010B の"Qサブチャネルデータ"では、以下のようにQチャネルのデータが 変換され読みやすくなった形式で取得できます。

BYTE\bit 7 6 5 4 3 2 1 0
0CtrlADR
1トラック番号
2インデックス
3分 (曲内の経過時間)
4秒 (曲内の経過時間)
5フレーム (=1/75秒) (曲内の経過時間)
6Zero (=0)
7分 (CD全体の経過時間)
8秒 (CD全体の経過時間)
9フレーム (=1/75秒) (CD全体の経過時間)
10
(MSB)
CRC もしくは 0
(LSB)
11
120x00 (pad)
130x00 (pad)
140x00 (pad)
15P0


オプションですが、15バイト目にその位置のPチャネルの値が入ります。
posted by 七癖 at 10:30| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月26日

READ CD その2

READ CD コマンドでは読み取る内容によって、1セクタあたりに必要なバイト数が違ってきます。
メインデータに必要なバイト数は、以下のようになります。

読み取るデータBYTE 9 CD-DAMode 1Mode 2Mode 2 Form 1Mode 2 Form 2
User Data0x1023522048233620482328
User Data + EDC/ECC0x18(0x10)2336(0x10)2328(0x10)
Header0x20(0x10)4444
Header Only + EDC/ECC0x28(0x10)無効無効無効無効
Header + user data0x30(0x10)20522340無効無効
Header + User Data + EDC/ECC0x38(0x10)2340(0x30)無効無効
Sub Header Only0x40(0x10)0088
Sub Header Only + EDC/ECC0x48(0x10)無効無効無効無効
Sub Header + user data0x50(0x10)(0x10)(0x10)20562336
Sub Header + user data + EDC/ECC0x58(0x10)(0x18)(0x10)2336(0x50)
All Headers Only0x60(0x10)441212
All Headers Only + EDC/ECC0x68(0x10)無効無効無効無効
All Headers + user data0x70(0x10)(0x30)(0x30)20602340
All Headers + user data + EDC/ECC0x78(0x10)(0x38)(0x30)23402340
Sync + User Data0x90(0x10)無効無効無効無効
Sync + User Data + EDC/ECC0x98(0x10)無効無効無効無効
Sync + Header Only0xA0(0x10)16161616
Sync + Header Only + EDC/ECC0xA8(0x10)無効無効無効無効
Sync + Header User Data0xB0(0x10)20642352無効無効
Sync + Header User Data + EDC/ECC0xB8(0x10)2352(0xB0)無効無効
Sync + Sub Header Only0xC0(0x10)無効無効無効無効
Sync + Sub Header Only + EDC/ECC0xC8(0x10)無効無効無効無効
Sync + Sub Header + User Data0xD0(0x10)無効無効無効無効
Sync + Sub Header + User Data + EDC/ECC0xD8(0x10)無効無効無効無効
Sync + All Headers Only0xE0(0x10)16162424
Sync + All Headers Only + EDC/ECC0xE8(0x10)無効無効無効無効
Sync + All Headers + user data0xF0(0x10)2064235220722352
Sync + All Headers + user data + EDC/ECC0xF8(0x10)2352(0xF0)2352(0xF0)

ヘッダのみとか出来ますが、基本は User data のみの 0x10 か 全て読み取る 0xF8 でしょう。

これに、サブデータに必要な量 (0 or 16 or 96) を加えれたものが、 実際に必要な1セクタあたりのバイト数です。
posted by 七癖 at 09:15| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月24日

READ CD その1

CDでは、汎用の READ (10) コマンドではなく 専用の READ CD (または READ CD MSF) コマンドを使用することで、 CD に記録された内容を、メインデータだけでなく各モードのヘッダや訂正コード、サブチャネル の情報まで選択して入手できます。

READ CD コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0xBE
1予約セクタの形式予約Zero
2
(MSB)
読込開始 LBA アドレス
 
(LSB)
3
4
5
6
(MSB)
取得セクタ数
(LSB)
7
8
9SYNCheader codesUser dataEDC & ECC C2 Error予約
10予約Sub-channel
11Control


1バイト目の「セクタの形式」は、読み取るセクタのモードを示します。

セクタの形式内容
000B全て
001BCD-DA
010BMode 1
011BMode 2
100BMode 2 form 1
101BMode 2 form 2
110B予約
111B予約

ここで設定した形式と、実際に読み取るデータの形式が異なる場合、 SK=5, ASC=64, ASCQ=00, ILLEGAL MODE FOR THIS TRACK エラーが返ってきます。


9〜10バイト目で、読み取る情報の内容を指定します。 9バイト目がメインデータ、10バイト目がサブチャネルのデータです。 各ビットを1に設定すると、そのデータが読み取れます。 このうち C2 Error は使ったことがないので、割愛します。

Header Code読み込む内容
00B読み込まない
01B4バイトのヘッダのみ
10BMode2Form1,2のサブヘッダのみ
11Bヘッダ、サブヘッダの両方

Sub-channel読み込む内容バイト数
000B読み込まない0
001BRAW形式。生のP-Wサブチャネルデータ96
010BQサブチャネルデータ16
011B予約-
100BR-Wサブチャネルデータ
(使ったことがない)
??
posted by 七癖 at 10:11| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月18日

READ Full TOC Format=0010b

セッションの情報を含めた詳細な TOC を入手するには、READ TOC/PMA/ATIP コマンドの FORMAT に 0010B をセットします。

得られるデータは、4バイトのヘッダと、 1トラックが11バイトで表される連続したデータからなります。

ヘッダは、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
TOCデータ長
(LSB)
1
2開始セッション番号
3終了セッション番号


滅多にありませんが、書き込みと消去を繰り返した結果、 多くのセッションに分割されていたり、 スキップするデータが大量にある可能性を考慮すると、 ヘッダの「TOCデータ長」を元に能動的にメモリを確保した方が 無難だと思います。 なお、「TOCデータ長」にはそれ自体のバイト数 (2バイト) が含まれていないことに 注意してください。

各トラックの内容は、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0セッション番号
1ADRCTRL
2TNO
3POINT
4MIN
5SEC
6FRAME
7ZERO
8PMIN
9PSEC
10PFRAME

Ctrl4 or 64 or 64 or 64 or 6
ADR1111
TNO0x000x000x000x00
POINT0x01〜0x63
トラック番号
0xA00xA10xA2
AMINCD内の
位置
CD内の
位置
CD内の
位置
CD内の
位置
ASEC
AFRAMEフレーム
(=1/75秒)
フレーム
(=1/75秒)
フレーム
(=1/75秒)
フレーム
(=1/75秒)
ZERO0x000x000x000x00
PMINトラックの
開始時間
最初の
トラック番号
最後の
トラック番号
リードアウトの
開始時間
PSEC ディスク
タイプ
0x00
PFRAMEフレーム
(=1/75秒)
0x000x00 フレーム
(=1/75秒)

Ctrl4 or 64 or 6
ADR55
TNO0x000x00
POINT0xB00xC0
AMIN次の
セッションの
データの
開始位置
書込レーザー出力
ASEC 予約
AFRAMEフレーム
(=1/75秒)
予約
ZEROADR=0x05 の数 予約
PMINデータを
書込み可能な
最後の位置
最初の
リードインの
開始時間
PSEC
PFRAMEフレーム
(=1/75秒)
フレーム
(=1/75秒)

この他、スキップするデータを示すために POINT=0xB1, 0xB2〜0xB4, 0x01〜0x40, それと POINT=0xC1 が用意されていますが、割愛します。

値が BCD でないことを除けば、Qチャネルから直接読み取られた値と同じです。


DVD、HD-DVD、Blu-ray などのCD以外のメディアでは、このコマンドは定義されていません。 SK=5, ASC=24, ASCQ=00, ILLEGAL REQUEST/INVALID FIELD IN CDB エラーが出ます。
posted by 七癖 at 10:27| Comment(6) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月16日

READ TOC Format=0000b

一般的な TOC 情報を入手するには、READ TOC/PMA/ATIP コマンドの FORMAT に 0000B をセットします。

得られるデータは、4バイトのヘッダと、 1トラックが8バイトで表される連続したデータからなります。

BYTE内容
0 〜 3ヘッダ
4 〜 11トラック 1
12 〜 19トラック 2
4+8×(n-1) 〜 4+8×n-1トラック n
4+8×n 〜 4+8×(n+1)-1トラック 0xAA
(リードアウト)


ヘッダは、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0
(MSB)
TOCデータ長
(LSB)
1
2開始トラック番号
3終了トラック番号

ヘッダにTOCデータ長や開始トラック番号と終了トラック番号が書かれているので、 実際にデータを入手するときには、メモリを予め大きめ (100+1トラック分=812バイト) に 確保するか、ヘッダ部のみを入手し、必要な量を計算して確保してください。 なお、「TOCデータ長」にはそれ自体のバイト数 (2バイト) が含まれていないことに 注意してください。

各トラックの内容は、次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0予約
1ADRCTRL
2トラック番号
3予約
4
 
トラックの
開始時間
 
5
6
7

「トラック番号」が 0xAA のとき、リードアウトトラックを表します。 これがないと、最後のトラックの終了時間がわかりません。

「トラックの開始時間」は、コマンド送信時の「TIME」の 設定で、LBA か MSF になります。

LBA の場合、(MSBとLSBに注意)
BYTE\bit 7 6 5 4 3 2 1 0
4
(MSB)
トラックの
開始時間
(LSB)
5
6
7

MSF の場合
BYTE\bit 7 6 5 4 3 2 1 0
4 ZERO
5
6
7 フレーム (=1/75秒)


DVD、HD-DVD、Blu-ray では、このコマンドを実行しないで下さい。 ディスクの内容に関係なく一定の値が帰ってきます。 (MSFでは、255分59秒74フレームが最大ですが、 これを超える長さのDVDもあります。)


余談
「せんべえ焼き、もしくはコースターメーカー」では、 FORMAT=0010B (Full Toc) が失敗したときにこちらを実行します。 これは、Windows95 で試してみたときの名残です。 あと、過去のバージョンでは、 DVDにRead TOC/PMA/ATIPを使って間違っているものがあります。
posted by 七癖 at 07:11| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月14日

READ TOC/PMA/ATIP

CDに含まれる各トラックの開始時間などの情報を得るためには、 READ TOC/PMA/ATIP コマンドを使用します。

READ TOC/PMA/ATIP コマンドの CDB は次のとおりです。

BYTE\bit 7 6 5 4 3 2 1 0
0Operation Code = 0x43
1予約TIME予約
2予約Format
3予約
4予約
5開始トラック/セッション番号
6
(MSB)
データ長
(LSB)
7
8Control

TIME = 0 で、アドレスが LBA で、
TIME = 1 で、アドレスが MSF で表されます。

Format の値を変えることで、様々な種類の情報を入手できます。

Format入手内容開始トラック/セッション番号
0000BTOC開始トラック番号
0001BSession Info予約
0010BFull TOC開始セッション番号
0011BPMA予約
0100BATIP予約
0101BCD TEXT予約
0111B予約予約

このブログでは、私が使っている Format=0000B (TOC) と =0010B (Full TOC) を説明していく予定です。
posted by 七癖 at 08:41| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月12日

Q Sub-Channel LeadIn ADR=5

リードイントラックでの ADR = 5 は、マルチセッションディスクに存在し、セッションに関する情報を提供します。

Ctrl4 or 64 or 6
ADR55
TNO0x000x00
POINT0xB00xC0
AMIN
(BCD)
次の
セッションの
データの
開始位置
書込レーザー出力
ASEC
(BCD)
予約
AFRAMEフレーム
(=1/75秒)
(BCD)
予約
ZeroADR=0x05 の数 予約
PMIN
(BCD)
データを
書込み可能な
最後の位置

(BCD)
最初の
リードインの
開始時間
PSEC
(BCD)

(BCD)
PFRAMEフレーム
(=1/75秒)
(BCD)
フレーム
(=1/75秒)
(BCD)


この他、スキップするデータを示すために POINT=0xB1, 0xB2〜0xB4, 0x01〜0x40, それと POINT=0xC1 が用意されていますが、使ったことがないので割愛します。 CD-Rで追記をしたり、書き込んだデータを削除する場合に使うのだと思われます。

POINT=0xC0 は最初のリードインのみです。 よって、POINT=0xB0 の ZERO は、他の ADR=5 がない場合、最初のリードインで 0x02、 2セッション目以降のリードインでは 0x01 となります。 最後のセッションでは、POINT=0xB0 は省略できるため、ADR=5 自体がありません。


とりあえず、ここまででCDの説明を止めます。今後は、 これまでにざっと(かなりいいかげんに)説明してきた CDの情報を入手する Multimedia Commands を順次説明していく予定です。
posted by 七癖 at 14:22| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月10日

Q Sub-Channel LeadIn ADR=1

リードイントラックでの ADR=1 では、 TOC (Table of Contents、テーブル オブ コンテンツ) が書かれています。

BYTE\bit 7 6 5 4 3 2 1 0
0CtrlADR
1TNO
2POINT
3AMIN
4ASEC
5AFRAME
6Zero
7PMIN
8PSEC
9PFRAME
10
(MSB)
CRC P(x)=x16+x12+x5+x1
(LSB)
11



Ctrl4 or 64 or 64 or 64 or 6
ADR1111
TNO0x000x000x000x00
POINT0x01〜0x99
トラック番号
(BCD)
0xA00xA10xA2
AMIN
(BCD)
CD内の
位置

(BCD)
CD内の
位置

(BCD)
CD内の
位置

(BCD)
CD内の
位置
ASEC
(BCD)

(BCD)

(BCD)

(BCD)
AFRAMEフレーム
(=1/75秒)
(BCD)
フレーム
(=1/75秒)
(BCD)
フレーム
(=1/75秒)
(BCD)
フレーム
(=1/75秒)
(BCD)
Zero0x000x000x000x00
PMIN
(BCD)
トラックの
開始時間
最初の
トラック番号
(BCD)
最後の
トラック番号
(BCD)

(BCD)
リードアウトの
開始時間
PSEC
(BCD)
ディスク
タイプ
0x00
(BCD)
PFRAMEフレーム
(=1/75秒)
(BCD)
0x000x00 フレーム
(=1/75秒)
(BCD)

POINT=0x01〜0x99では、POINTはBCDのトラック番号で、 PMIN、PSEC、PFRAMEでトラックの開始時間を表します。

POINT=0xA0 のディスクタイプは
00h - CD-DA or CD-ROM
10h - CD-I
20h - CD-ROM-XA
です。

POINT=0xA2 はリードアウトトラックに相当します。
posted by 七癖 at 09:55| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月08日

Q Sub-Channel LeadIn

リードイントラックのQチャネルには、 トラックやセッションの情報が入っており、 ADRが同じでも他のトラックのものと意味が異なります。

セッションが一つの普通のディスクでは、ADR=1 のみですが、 マルチセッションのディスクでは ADR=1 と ADR=5 があります。 ただし、最後のセッションのリードインでは、ADR=5 を省略できます。 ADR=2 (MCN) もあるらしいのですが、よく知りません。 (リードインは直接読めないので)

ADR=1 と =5 の両方があるときは、1と5が交互に置かれます。 また、一つの項目 (ADR=1 の場合、トラック毎に項目がある) は3回繰りかえされます。


ADRPOINTコメント
10x01同じ内容が
3回づつ
10x01
10x01
50xB0ADR=1 と =5 が
交互に置かれる
50xB0
50xB0
10x02 
10x02
10x02
50xC0 
50xC0
50xC0
10x03 
10x03
10x03
50xB0ADR=5が
繰り返される
50xB0
50xB0
10xA0 
10xA0
10xA0
50xC0 
50xC0
50xC0
10xA1 
10xA1
10xA1
50xB0 
50xB0
50xB0
10xA2 
10xA2
10xA2
50xC0 
50xC0
50xC0
10x01ADR=1が
繰り返される
10x01
10x01
リードイン領域が
終わるまで続く

これ、本当に合ってるのかなあ。
posted by 七癖 at 17:57| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月06日

Q Sub-Channel ADR=2,3

ADR = 2 と 3 はオプションで、存在しないディスクもあります。

ADR = 0x02 は、MCN (Media Catalog Number、メディアカタログ番号) で、 メディアの情報を表します。 これはディスク全体に共通で、大体100フレーム毎に1回記録されています。

BYTE\bit 7 6 5 4 3 2 1 0
0CtrlADR
1N01N02
2N03N04
3N05N06
4N07N08
5N09N10
6N11N12
7N13ZERO
8ZERO
9フレーム (=1/75秒) (CD全体の経過時間)(BCD)
10
(MSB)
CRC P(x)=x16+x12+x5+x1
(LSB)
11


N01 〜 N13 がメディアカタログ番号で、0〜9の値をとります。 これをASCIIコードに変換するには、それぞれに 0x30 を足してやります。



ADR = 0x03 は、ISRC (International Standard Recording Code、国際標準レコーディングコード) で、 楽曲の情報を表します。 これはオーディオトラックだけに存在し、 大体100フレーム毎に1回記録されており、MCNとは約50フレームずらして置かれているようです。

BYTE\bit 7 6 5 4 3 2 1 0
0CtrlADR
1I01(MSB) I02
2I02   (LSB)(MSB)   I03
3I03 (LSB)I04
4I05ZERO
5I06I07
6I08I09
7I10I11
8I12ZERO
9フレーム (=1/75秒) (CD全体の経過時間)(BCD)
10
(MSB)
CRC P(x)=x16+x12+x5+x1
(LSB)
11


I01 〜 I02 : 国名コード (6ビット)
I03 〜 I05 : 登録者コード (6ビット)
I06 〜 I07 : 記録年 (4ビット)
I08 〜 I12 : シリアルナンバー (4ビット)

これをASCIIコードに変換するには、それぞれに 0x30 を足してやります。


2006/09/21 修正
posted by 七癖 at 10:18| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年08月02日

Q Sub-Channel ADR=1

ADR = 1 の現在位置の情報は、最も多く用いられ、 CDプレーヤーの経過時間の表示などのために使われます。

BYTE\bit 7 6 5 4 3 2 1 0
0CtrlADR
1TNO (トラック番号) (BCD)
2Index (BCD)
3分 (曲内の経過時間)(BCD)
4秒 (曲内の経過時間)(BCD)
5フレーム (=1/75秒) (曲内の経過時間)(BCD)
6Zero (=0)
7分 (CD全体の経過時間)(BCD)
8秒 (CD全体の経過時間)(BCD)
9フレーム (=1/75秒) (CD全体の経過時間)(BCD)
10
(MSB)
CRC P(x)=x16+x12+x5+x1
(LSB)
11


TNO は、通常トラックの番号を表しますが、 リードアウトトラックでは 0xAA となります。

リードアウトトラックの Index は 0x01 です。

曲内の経過時間 は、Index 0 の終了時刻と Index 1 の開始時間を基点として計算します。 Index 1 以降では、そのまま曲内の経過時間を表し、単調に増加します。 Index 0 では、曲が開始されるまでの残り時間を表し、単調に減少します。

Index 0 1
MSF ・・・ 00:00:03 00:00:02 00:00:01 00:00:00 00:00:00 00:00:01 00:00:02 00:00:03 ・・・
posted by 七癖 at 09:26| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月31日

Q Sub-channel

Q チャネルには CD 全体に関する情報、
トラックに関する情報、
トラック内の現在位置に関する情報
などが書かれており、 リードインとオーディオ/データトラックとでは使い方が異なります。

読み出した直後、Q チャネルのデータは、96ビットの1列になっています。 それを、96/8 = 12 バイトのデータに変換します。

BYTE\bit 6
Q
0
(MSB)

Q0

(LSB)
・・・
7
8
(MSB)

Q1

(LSB)
・・・
15
・・・・・・
88
(MSB)

Q12

(LSB)
・・・
95


全てのQチャネルは、先頭の Ctrl/ADR と、9バイトのデータ、 2バイトのCRCに分けられます。

BYTE\bit 7 6 5 4 3 2 1 0
0CtrlADR
1データ
2
3
4
5
6
7
8
9
10
(MSB)
CRC P(x)=x16+x12+x5+x1
(LSB)
11


Ctrl (コントロール/制御フィールド) は、ビット毎に意味があります。

bitCtrl
70=2チャンネルオーディオ 1=4チャンネルオーディオ
60=音楽トラック 1=データトラック
5コピー 0=禁止 1=許可
4プリエンファシス 0=なし 1=50/15

Ctrl = 0100b で、データトラックになります。


ADR は、Qチャネルの内容を示します。

ADR音楽/データトラックリードイントラック
0x01現在位置の情報トラックの情報 (TOC)
0x02Media Catarog Number (MCN)MCN
0x03International Standard Recording Code (ISRC)なし
0x05なしセッションの情報


CRC は、Qチャネルの0〜9バイトの値で計算します。 その生成多項式は、P(x)=x16+x12+x5+x1です。


2006/09/19 修正

posted by 七癖 at 08:08| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月29日

P Sub-channel

P チャネルは各トラックの始点を示すために使われます。 P チャネルのビットは一つのサブチャネル内で96ビット全て共通で、当然、0 か 1 です。
リードイントラックのPチャネルのビットは、0 です。
リードアウトトラックでは、最初の2〜3秒の間は 0 で、 その後、2.00±0.04 Hzのレート及び50±5 %のデューティサイクルで、 交互に 1 及び 0 となるらしいです。 (リードアウトトラックは読み込めないので、確認できない)
他の音楽/データトラックでは、Index 0 全体および、Index 1 の最初の 1 フレームは P=1 です。 また、P=1 の区間は最小 2 秒なので、前のトラックの終わりの方に P=1 の領域がかぶさることがあります。他は全て 0 です。


Track LeadIn Track 1 Track 2 Track 3 LeadOut
Index Index 0 Index 0 Index 1 Index 0 Index 1 Index 1 Index 1
Sub P 0 1 0 1 0 1 0 1 0 0 or 1
posted by 七癖 at 01:07| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月27日

Sub Channel

サブチャネルのデータは、 MMCのRAW方式で読み出した直後(もしくは書き込む直前)次のように格納されています。

BYTE\bit 7 6 5 4 3 2 1 0
P Q R S T U V W
0P
channel
Q
channel
(MSB)            CD TEXT 0
1CD TEXT 0 (LSB)(MSB)    CD TEXT 1
2CD TEXT 1     (LSB)(MSB) CD TEXT 2
3CD TEXT 2            (LSB)
・・・・・・
95CD TEXT 71           (LSB)

R〜W チャネルには、取り敢えず CD TEXT の場合を挙げましたが、 他のデータの場合もあります。何も書かれていない事が一番多いです。

なお、「せんべえ焼き、もしくはコースターメーカー」の cdm+bin+sub 形式で作成される .sub ファイルでは、以下のように並び替えてありますので、注意してください。

BYTE\bit 7 6 5 4 3 2 1 0
0
・・・
11
P channel
12
・・・
23
Q channel
24
・・・
35
R channel
36
・・・
47
S channel
48
・・・
59
T channel
60
・・・
71
U channel
72
・・・
83
V channel
84
・・・
95
W channel

CloneCDでも、下のURLの報告をみる限りでは同様だと思います。
http://club.cdfreaks.com/showthread.php?t=49764
posted by 七癖 at 10:07| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月25日

Main Channel CD-ROM data Modes つづき

前回(2006/7/19)の続きです。

Sync は同期信号です。 Sync は全てのデータに共通で、 その12バイトは次の通りです。

00h FFh FFh FFh FFh FFh FFh FFh FFh FFh FFh 00h

ヘッダは4バイトで、各表の Sector MSF Address と Data mode を合わせた部分になります。

12 13 14 15
Minute
(BCD)
Second
(BCD)
Frame
(BCD)
Mode

時間は、リードインを除き、CD全体のデータの基点からの経過時間で、BCD形式で表されます。
Mode は、正確には、0〜1 ビットでデータモードを表します。 2〜7 ビットにも意味はあるのですが、割愛します。0を入れておけば多分問題ありません。

Mode2 の Form1と2 にあるサブヘッダは、16〜19バイトと20〜23バイトとで同じ内容が2回続きます。 (繰り返されていることを確認することで、Mode2と認識します。)

16
(20)
17
(21)
18
(22)
19
(23)
File number Channel number Sub-mode Config information

Sub-mode のビット5が0のときForm1、1のときForm2になります。

CRC (Cyclic Redundancy Check、巡回冗長検査) は誤りの検出に用いられます。
EDC (Error Detection Code、誤り検出符合) と紹介されている場合もありますが、 一般的なCRC?とは検査多項式が違なるためでしょう。 その検査多項式は、次のようになります。
P(x) = (x16 + x15 + x2 + 1)×(x16 + x2 + x + 1)

P parity と Q parity は、ECC (Error Correction Code、誤り訂正符合) です。 リードソロモン積符号 (RSPC) というらしいです。

これらの検査訂正符号の詳しい内容は他の方に譲ります。 (勉強不足で申し訳ない。)
posted by 七癖 at 09:43| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月19日

Main Channel CD-ROM data Modes

CD-ROMの物理フォーマットには、以下の種類があります。

Mode 0 : 空のデータ用。
Content Sync Sector MSF Address
(BCD)
Data mode
= 0
User data
all 0
Length 12 3 1 2336
Offset 0〜 12〜 15 16〜


Mode 1 : 最も一般的な形式。
Content Sync Sector MSF Address
(BCD)
Data mode
= 1
User data CRC
0〜2063
Zero P parity Q parity
Length 12 3 1 2048 4 8 172 104
Offset 0〜 12〜 15 16〜 2064〜 2068〜 2076〜 2248〜


Mode 2 : 滅多に使われません。と思いきや使われていたりするので怖い。
Content Sync Sector MSF Address
(BCD)
Data mode
= 2
User data
Length 12 3 1 2336
Offset 0〜 12〜 15 16〜


Mode2 Form1 : 主に記録アプリケーションや Video CDで使われます。 あと、某コンシュマーゲーム機用CD-ROMでも用いられます。
Content Sync Sector MSF Address
(BCD)
Data mode
= 02
Sub header 1st Sub header 2nd User data CRC
16〜2071
P parity Q parity
Length 12 3 1 4 4 2048 4 172 104
Offset 0〜 12〜 15 16〜 20〜 24〜 2072〜 2076〜 2248〜


Mode2 Form2 : 主に Video CDで使われます。 あと、某コンシュマーゲーム機用CD-ROMでも用いられます。
Content Sync Sector MSF Address
(BCD)
Data mode
= 02
Sub header 1st Sub header 2nd User data CRC (option)
16〜2071
Length 12 3 1 4 4 2324 4
Offset 0〜 12〜 15 16〜 20〜 24〜 2348〜


posted by 七癖 at 19:17| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月17日

Main Channel CD-DA data

1セクタ2352バイトの CD-DA データは、 左チャンネル16ビットと右チャンネル16ビットとが交互に並んでいます。

left channel 0 low byte
left channel 0 high byte
right channel 0 low byte
right channel 0 high byte
left channel 1 low byte
left channel 1 high byte
right channel 1 low byte
right channel 1 high byte
・・・
left channel 587 low byte
left channel 587 high byte
right channel 587 low byte
right channel 587 high byte

音楽CDのサンプリング周波数は44100Hzであり、一つの音データはステレオで 16ビット×2=4バイト、1秒あたりのバイト数は、
4[BYTES]×44100[Hz=1/秒]=176400[bytes/秒]
よって、1フレームあたりのバイト数=2352[BYTES]から
176400[BYTES/秒]/2352[BYTES/frame]=75[frame/秒]
となり、1フレーム=1/75秒 となります。

posted by 七癖 at 17:15| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする

2006年07月15日

BCD (Binary Coded Decimal)

CD上に記録された分、秒、フレームは、1バイト=8ビットで一つの数 (0〜255 or -128〜127) を表すのではなく、上4ビットで10の位を、下4ビットで1の位を表します。この場合、0x09 + 0x01 = 0x10 (=16) となり、0x0aといった数は存在しないことになり、1バイトで表される量は 00〜99 となります。
このような表現方保を 2進化10進法 (BCD, Binary Coded Decimal) といいます。

こうして表示された量を使いやすいよう変換するには、次のようにします。

BYTE d; //通常のデータ
BYTE b; //BCDで表されたデータ

b = (d / 10) * 0x10 + (d % 10);
もしくは
b = (d / 10 * 16) | (d % 10);

d = (b >> 4) * 10 + (b & 0x0f);
もしくは
d = (b / 0x10) * 10 + (b % 0x10);

posted by 七癖 at 16:53| Comment(0) | TrackBack(0) | Multimedia Commands | このブログの読者になる | 更新情報をチェックする