報告B - 「同じ間隔でずれっぱなし」

「最初から最後までズレっぱなしなんですけど」
 という質問が来れば、まずは
「パッドのフラッシュの光とドラムの音はズレてますか?」
 と尋ねるのが、昔の DTXMania 掲示板での様式美でした。

 この回答には Yes と No の二つがありますが、残念ながらどちらも立派な音ズレです。

サウンドデバイスによる音ズレ

 もし回答が Yes(フラッシュの光とドラム音がずれてる)であれば、それは、DTXMania ではなくサウンドデバイスに起因する音ズレだと見ることができます。光るのがズレないんなら、プログラム的には遅れてないですやん。

 具体的には、サウンドデバイスをダイレクトに操作できる DirectSound でのサウンドの再生レイテンシ(遅延)が、当時は 50㎳ くらいありました。

 サウンドデバイスのハードウェアやドライバによって、レイテンシはそれぞれ異なります。中には、レイテンシが 100㎳ を超える(リアルタイムより音質を重視した)製品もありました。

 そんな状況でも、バリバリ(死語)のハードウェアアクセラレーションによってレイテンシが 0㎳ という恐ろしいサウンドカードも存在しました。名機・Sound Blaster です。16 声多重ミキシングも各種エフェクトもすべて実現した上での 0㎳ ですよ。

 しかし、サウンドドライバの頻繁なエラーで Windows ごと躊躇なくぶっ飛ばし続けたため Microsoft の怒りを買ってしまい(推測)、やがて Windows の大きな仕様変更を招くことになります。

自動再生音の位置調節機能(BGMAdjust)

 回答が No(フラッシュの光とドラム音はズレてないけど BGM とはズレてる)であれば、譜面を作った人の音ズレ度合いと、譜面を演奏している人の音ズレ度合いとが違っていることに起因する、と言えます。音ズレの原則です。

 DTXMania 066b(2007/10/15)以降では、BGM なども含めた「自動再生音」の位置を、演奏中にリアルタイムで調節できるBGMAdjust機能を搭載しました。

 演奏中に、SHIFT+↑/↓ で 10㎳ ずつ自動再生音の再生タイミングを(譜面に対して)前後に調整できます。調整した値は、システム情報の表示オプションを ON にしていればリアルタイムに数値で確認が可能であり、データベースにも記録され、次回以降の演奏で自動的に適用されます。

 初回のみとはいえ一曲ずつ合わせる必要があるので非常に手間がかかりますが、それ以降はもっとも手っ取り早い音ズレの解決法になりました。
 パソコンを買い替えたときは地獄でした

サウンドと描画が連動する弊害

「黎明」の章で述べましたが、DTXMania の VSync オプションを ON にしていると、(1 スレッドモデルでは)入力・サウンド・描画はすべてが約 16.6㎳ 間隔で処理されます。これはすなわち、最大で 16.6㎳ のズレが発生する可能性があることを意味しています。BGMAdjust オプションでほんの 10㎳ 程度を調整したところで、実はまだまだ誤差(ズレ)の範囲なのです。

 サウンドのズレは、ある程度は事前に予測(または設定)可能です。なので、DTXMania では、BGM などの自動再生チップについては、譜面の指定する時刻よりもズレの分だけ早めに再生を開始します。しかし、実際にはこの処理さえも 16.6ms 間隔で行なわれました。つまり、早めに再生したつもりでも、やっぱり最大で 16.6ms の音ズレ(遅延)が発生していたのです。

 しかも、この音ズレの量は、すべての BGM / AutoPlay チップで全部異なります。しかも、再生しなおすたびにすべてがランダムに変化します

 VSync を OFF にすると、このズレの範囲は小さくなります。
 しかしながら、これを OFF にすると、発熱やちらつき、ティアリングなどを引き起こすことになるということは「黎明」の章で述べたとおりです。

 このジレンマは、DTXmatixx 以降でだいたい軽減されました。

 が、

 サウンドのズレならばDTX譜面に反映されることはありませんが、この描画のズレの場合、「(一見ズレないように調整した)BGM チップの位置」という形で固定化されて明確に残ります。結果として、無印版や派生版の DTXMania で作られた DTX譜面を DTXmatixx 以降で演奏すると、BGMにぴったり合わせて演奏するほど Slow 判定が多発するというストレスフルな事態に陥ることとなりました。

「BGMチップの位置」という形で譜面に出力されてしまったこの音ズレをなくすには、この問題が軽減された (精度の上がった)DTXmatixx 以降をビュアーとして譜面を修正し直すしか手段がありません。

 音ズレが譜面製作者をも巻き込み始めました。

MP3固有の音ズレ

 mp3(MPEG-1 Audio Layer 3)は、人の耳に聞こえない領域の周波数成分を除去することで非常に高い圧縮率を誇っていたサウンドフォーマットです。登場直後は、うちの i386 パソコンで 3 分程度の曲を mp3 に変換するだけでも 40 分ほどかかっていたものですが、のちに、どんどん高速なアルゴリズムが開発されていきました。

 速度的にも容量的にも十分実用的な存在になったころ、DTXMania でも mp3 フォーマットのサウンドファイルに対応しました。

 これが罠でした。

 どうやら mp3 には、圧縮したデータを解凍(デコード)したとき先頭に無音領域ができるという性質があるようでした。mp3 の仕様そのものに、音ズレが仕込まれていたのです。いろいろ数少ない文献もあたってみたのですが、この無音領域について説明している資料は見当たりませんでした。

 これの何が問題かと言うと、この無音領域の長さが固定なのか可変なのかが判らなかったことです。

 当時の自分のパソコンで計測したところ、この無音領域の長さは常に約 24㎳ だという結論が出ました。が、それが他のサウンドデータでも、他の人のパソコンでも同じなのかという肝心なところがまったく分かりませんでした。

 程なくして、DTXMania 034(2002/04/06)にMP3再生遅延防止機能が実装されます。この機能により、mp3 をデコードしてサウンドデバイスに渡す際に、デコードにより生じた無音領域がすっ飛ばされるようになります。この機能は常に ON であり、設定で OFF にしたりすることはできません。強制です。(※現在ではこの機能は廃止されています。未だに音ゲーに mp3 を使う人は反省してください!

 その仕組みは実に泥臭いものです。プログラムに「いきなり立ち上がる波形」のmp3データを埋め込んでおき、DTXMania の起動時にこれをデコードしてみて、波形が立ち上がるまでにどれだけの時間が空くようになったかをデコード後のデータから直接測定する、というものでした。

 しかしこれが存外うまくいき、 これで mp3 が原因となる音ズレは解消されたと思ってました。

 その時は。
 

 その後どうなったかについては、「因果」の章で振り返りたいと思います。