TOP MAP UP

CRI ADX関連

 CRIの一連のファームウェア関連についての技術的情報について。
 これらについてはそれぞれに恐らくバージョンがありフォーマットも異なるのだと思うが、そもそもそのバージョンの区別がよくわからない為、解析した対象を書いておくのでバージョンの差異があるか無いかの判断の参考にして欲しい。




CRI AFS

 もともとはADX関連から派生してるのだと思われるファイルシステム。ADXもそうなのだが0x800byteのアライメント等、かなりCDを意識したフォーマットになっているのが印象深い。
addrsize内容
0x000x04'AFS',0x00
0x040x04AFS内のアイテム数
0x08+0x000x04アイテムのアドレス
(一番最初のアイテムのアドレスをFIAとする)
0x08+0x040x04アイテムのサイズ
0x08+0x?? 以下アイテム数程繰り返す
   
FIA-0x080x04アイテムテーブルのアドレス(以下ITAとする)
FIA-0x040x04アイテムテーブルの長さ
   
ITA+0x000x20アイテム名(アイテムの並び順はアドレス部分と同じ)
通常終端はNULLだが0x20を超えるファイル名は0x20で打ち切りになるので注意
ITA+0x200x10不明。なんか属性?
ITA+0x?? 以下アイテム数程繰り返す

 解析対象:PS2 頭文字D/PS2 Capcom Fighting Jam





CRI ADX

 まずはADXで基本となる数式について説明すると(参考資料はこちらadx.pdf
s0=( k0 x d x scale + k1 x s1 + k2 x s2 ) / k0ADX to WAV 変換式
s0結果として出力される現在のサンプル
s1現在より1前の現在のサンプル
s2現在より2前の現在のサンプル
k0係数 k0
k1係数 k1
k2係数 k2
scaleADXから与えられるデータ。2byte
dADXから与えられるデータ。4bit

 わかりやすいように式は変えてあるが、これはFIR(有限インパルス応答)フィルタという物がかかっており、その係数がk0/k1/k2である。このFIRフィルタは単純な数式の重ねあわせでかけられるのであるが、その効果というのは全てこの係数によって決定される(つまりこの係数の設定がFIRフィルタの設計に他ならない)であるのでADXにおいてこの係数というのは変更できない値となる(変えると元の波形を再現出来ない)
 ではこのADXのFIRフィルタがどういう特性を持っているかを解説すると(参考資料2ページ目のグラフ参照)0x8000から-0x8000までのサイン波を元データとして与えた時に、このFIRフィルタによってかかる変化(ds値)がこれになる。与えられる波形が通常の波形であれば(極端な矩形波やナイキスト周波数に近い波形等で無い物)値がある程度コヒーレンスな性質を持つように見える。
 この変化されたds値を元に、scale値を算出するわけであるが、実際のADXエンコーダにおいてどのように算定されるかはわからないが、今回はdsの絶対値の最大値に対して、dの表現範囲(符号付なので)3bitに収まるように7で割り、これをscaleとしている。そしてそのscaleを元に、dを算出する(参考資料3ページ目のグラフがdの値)
 そして検算としてそれらの値を元にADXデコードを行い誤差を見てみると(参考資料4ページ目のグラフ)特に大きな誤差はない事が見て取れる(実際のデコードの演算精度と同じ精度で計算している)なお、これらグラフは1loop目の1,2tap目において事前の値が無い為に、変動の激しい値となっているので、説明の為に2loop目の値を使っている

 次にファイルフォーマット
addrsize内容
0x000x040x80000000 | p
p-2=シグネチャのアドレス+2
p+4=サウンドデータのアドレス-4
0x070x011=mono : 2=stereo
0x080x04サンプリングレート
0x0c0x04総サンプル数
0x120x01ADX ver(未確定)
0x1c0x04ADX ver==3 : loop start のサンプル位置
0x240x04ADX ver==3 : loop end のサンプル位置
0x280x04ADX ver==4 : loop start のサンプル位置
0x300x04ADX ver==4 : loop end のサンプル位置
p-20x06(c)CRI
p+40x?? ADX ver==3 : p+4のアドレス自体が 0x0024の時はループ無し。それ以外は有り
ADX ver==4 : p+4のアドレス自体が 0x0800の時はループ無し。それ以外は有り

 注意点としては、p-2のシグネチャ確認で、ファイルフォーマットの確認を行いたい所だが、そもそもpが有効な値かは保証されないのと、参照先のアドレスがOS的にvalidな物か判別出来ないので(まぁ読み込んだバッファのアドレスと、読み込んだ長さを比較すれば判定出来ない事もないが)判定方法を少し考える必要がある。
 なおADX ver4はXBOX OutRun2で確認している。PS2関連はVer3だと思う。





CRI ROFS

 次期AFSといった位置付けなのだろうか?複数ファイルを管理するという観点ではAFSと同じだがフォーマットをCDと同じ(ISO9660)にしていると言う所がミソ。
 その為、ROFSファイルの先頭から0x1800byte削除して、Daemon Toolでマウント可能。そのままROFS内のアイテムを取得できる。
 確認対象:XBOX OutRun2
 参考リンク:CRI ROFS