再生ファイルのフォーマットをexFATの32MGクラスターに変更して、SDカードも128Gまで対応できるようにする過程で、幾つかの不具合に遭遇。既知のものもあれば未知のものも。データを読み出すトランスポートは三年前に作った基板で、44.1KHzから96KHzに上げるSSRCの掛け算器が少し古い。うちの再生ファイルはレコードからのリッピングが主なので、全然海苔していない。だからオーバーサンプリングしても、ISOでオーバーフローはしない。それでずっと掛け算器には、リミッターが入っていない。
今回、色々調べるついでにCDからリッピングしたのも再生したら、例によってと言うのかオーバーフローした。普通、掛け算器にはリミッターが入っているから、オーバーフローしてもクリップするだけなので、余程ひどくない限り聞いても分からない。時々、CDの時だけはオーバーサンプリングはダメという人がいて、よっぽど海苔なファイルを聞いているんだと思う。
うちの場合は、自分用なので意識的にリミッターは入れない。入れないと、プラスの最大値を超えるといきなりマイナスの最大値になるので、さすがに、あれっ?となる。原因がはっきりするように、入れない。単純に、レベルを3dBぐらい落としてしまえば問題は解決するから。
ところがレベルを落としたのに、再生するとブチッとなる所がある。PCに送ったデータは問題ないのに、スピーカーからはブチッ。色々調べると、どうもSPDIFを受けているクリエイティブのインターフェースが変。再生用のミキサーで3dBぐらい絞ると、ブチッは消える。飽和していないデータなのに、何故か再生用は更に絞らないとダメ。PCがらみでは、こんな不可解な現象は良くある。気が付かないだけで、変な事は相当にあるはず。
今までで最大のミステリーは、時間泥棒。レコードのリッピングを始めた時、最初はADCの出力をSPDIFにしてPCに送り、録音はPC側でしてた。ADC側で、SDカードでの書き込みが出来るようになる前の事。ADC側で、書き込みが出来るようになってからも、暫くは同じデータをPCにも送ってた。当然、両者は同じにならなければならない。元のデジタルデータは同じなので。
ところがPCは魑魅魍魎なので、ある時、両者のファイルサイズが少し違う事に気が付いた。PC側が少し短い。聞いて分かる程ではないけれど、60分送ると、数秒はずれてたかも。この場合は幸運にも両方のデジタルデータが残っているので、何処で抜けたかを解析するのは容易。こんな抜け方をしてた。
オレンジ色はリアルタイムのFFT結果で、薄い青は波形。レコードの場合でも20kHzぐらいで急激に高域が落ちる事が多くて、この場合も20kHz以上はかなり落ちている。ところが一瞬、突然にほぼ全帯域(96KHzサンプリングなので48kHz)のFFTになる。この時、青の信号の方を見ると、不自然な上がり方を両チャンネル共にしている。音楽成分ではなくて、一種のインパルスのような信号なので全帯域に広がっている。
原因を調べてみると、この時は夏で、SPDIFを受けているインターフェースと同じUSBコントローラーにつながっているHDDが、暑さで死にかけていた。リトライが異常に多くなって、どうもその間はコントローラーの資源を専有してしまい、SPDIFからのデータを取れなくてバッファがオーバーフローし、データが1パケット位飛ばされたみたい。
SPDIFはエラーチェック可能であるけれど、リアルタイムなので分かっても再送依頼は出来ない。PC側も、パケット内でのエラーであれば検知可能としても、まるごと飛んでしまうと多分検知不能。結果として、飛んだパケットの分だけ受けたファイルサイズが小さくなるという、不可解な現象が起きる。LANであれば、受けたパケット数を数えて、エラーの検知が可能かもだけど。
但し、これも程度問題なので、60分で数回起きる程度であれば、聞いても分からない。分かったのは、HDDがほとんど反応しなくなって、飛ばしの頻度が上がってから。そういうのがあるから、自分で使っている機械の場合は、エラーが起きた時にはすぐに分かる方向にこける方が良い。売り物であれば、可能な限り、そうはならない方向にするんだけど。これはたまたま原因が分かって、幸運。PCオーディオでは、知らずにそのままが大半。
でも96KHz/24bitみたいなファイルを再生するのは、意外と難しいみたい。CDプレーヤーだと、DVDディスクに書き込むか、付属のUSBドライバーを使ってCDプレーヤーをUSBDACにするか。その元のPCがちゃんとデータを読んでくれるかは、実際かなり怪しい。リアルタイムでなければ問題はないのだが、リアルタイムのデータが保障されるかは運次第。それでかなり大がかりなシステムを使ったりしてる。データを読むPCと、操作用のPCを分けるとかで。
更にマルチシステムにしたいとなると、難易度は相当に上がる。デジタルデータをアナログに戻さず、そのまま帯域分割してDACに入れたいのだが、それが出来るようなシステムは、自作しないと無理ではなかろうか。専用機を作れば簡単。SDカードから読んで、帯域分割(チャンネルディバイダー)してから送り出す。FPGAとARMマイコン、後は発振器程度で済む。トランスポートの部品はそれだけ。聞き流すような使い方はしないから、128Gが二枚挿せれば問題なし。
そう思ってたら、予想外の問題が発生。64Gまでは使えていたトランセンドのSDカートが128Gになったら、読めなくなった。予備にと思って最近買った64Gも、試してみたらダメ。同じ型番の1年ぐらい前のは、問題なく使えていたのに。良くある話ではあるが、愕然。Windowsからは、問題なく読み書きできる。やれやれな結果。
ある程度の予想はつく。無料公開のSDの仕様には、一部分に伏字があって、金($1000かな)払わないと中身を読めない。お恵み米の¥100000に少し足して、仕様を買うかとも考えたが、面白くない。どこかに隠れレジスタみたいなのがあるんだろう、とは推測できるのだが。後は、ハッキングだけだ。ハッキングで$1000稼ぐ。
方法はごく当たり前で、事の成否は運次第。たまたま分かりやすい所に秘密があれば分かるし、深く潜行していたら無理。丁半ばくちみたいなもの。壊しても良い¥1000ぐらいのSDカードリーダーを買ってきて、カードのイニシャライズの時に出しているコマンドを追いかければ、当りが出る可能性はある。2日ぐらい粘るが、これは失敗。思いの外、イニシャライズの期間が長くて、全てを追い切れなかった。
次は作戦変更して、実際の読み出しの時に、何処の番地をアクセスしているかを探る。ファイルの書かれているクラスターは分かるので、それが現物のカードでは何処になっているのかを調べる。今まで両者は一致していたのに、最近のカードでは何故かそれが違っているのよね。これは、あっさりと成功。拍子抜けするほどに。現物のアクセスには、少しばかりのオフセットがついていた。
どうしてそんなのをつけるのかは謎。検査の過程で、その方が便利なのかな、と思うぐらい。そのオフセットは、カード内のどこかのレジスタに書かれているはず。金出さないと開示されない仕様書に、その秘密は書いてあるのでしょう。64Gも128Gも同じオフセット。新しいのはそうなっている。SUNDISKは、違うオフセットがついているみたい。$1000払わずに済んで、ラッキー。
オフセットなしの64Gとありの64Gとは、多分違うメモリーを使っている。実際に使える容量が微妙に違う。これは珍しい話ではなくて、メーカーが違うと、同じ64Gでも実際の容量には差がある。同じメーカーでも、変わる事はある。古い方は59Gぐらいで、新しいのは58Gぐらい。使用メモリーのプロセスが変わったのかな。これはバッテリーのニセ仕様とは違って、フラッシュの本質的問題。東芝製でも同じ事。
フラッシュはある程度の不良が前提であるし、ウェアレベリングのために少し予備を取って置いたりもするから、64Gの全てが使える事はない。内部のマイコンのファームの出来にも依存する。沢山使えるようになっている方が、将来的に問題を起こさない可能性は高い。なので、オフセットのつかない古い型の方が、信頼度は高いと思う。128Gの方は、119Gぐらいまで使える。119G>58Gx2なので、多分128G買った方が賢い。
問題は、書き込みにかかる時間が2Gで約1分かかる。119G埋めるには、1時間程度で、許容範囲ではある。もしもfat32だと、運が良くてその倍。運が悪いと、もっとかかる。クラスターが小さいと、使用率が100%に近くなった時、一気に遅くなったりする。フォーマットした後に、消去などをしなければ大丈夫な事は多いけど、exFATで32Mのクラスターに勝るものはない。
その場合だと、ほぼ100%使ったとしても、2Gで約1分の書き込み時間。ここまで使い倒しても、問題はない。以前fat32で書き込んだ時、10分経っても終わらなかった事がある。原理的に常にその危険性はある。SDカードには、exFATが最適という話。