動画の音が怖い件について

  • 投稿日:
  • 更新日:2015/03/08
  • by
  • カテゴリ:

以下の動画の音が怖い件について。

えーと、ちゃんとまとめて説明してないかと思うので。

まず、画像・音声とも完全同時にリアルタイム再生しています。 そのために、AVRを使い、SDカードから読み込むハード(拡張カートリッジ)を自作しています。 カートリッジは1本しか挿せず、RAMを拡張していないため、RAMは本体の16kBのみですが、グラフィック画面は1面しか使わないし、バッファリングをしていない完全ストリーミング再生なので問題ありません。

動画ファイルは、ffmpegと自作ツールを組み合わせて作りました。 画像は1つあたり6144bytes (256 x 192 / 8)、10fpsだとすると10倍で61440bytesとなります。 音声は20480Hz/4bitですが、処理を高速化するために1バイトの下位4ビットのみ使うので、そのまま1秒20480bytesとなります。

これをあわせると、61440 + 20480 = 81920 (80kB/sec)となります。 また、Video : Audio = 3 : 1となるので、3バイトの画像情報の次に1バイトのサンプルが続くようにファイルを作ります。 SDカードから読み取りつつ再生するのですが、SDカードの1セクタは512バイトです。

セクタの移動はAVR側で自動で行いますが、 AVRからREADコマンドで一回で読み取れるデータの最大値をセクタのデータ量と同じ512バイトにしてあるので、512バイトごとにREADコマンド を送っています。 この理由は、セクタ移動には時間がかかるため、Z80で連続読み込みをするのに最速であるini命令を使うとセクタをまたぐリードが間に合わなくなる可能性があるためです。

拡張カートリッジから読み取ったデータは描画またはサウンド再生に使います。 データの順番が決まっているので、3バイト分は描画、次の1バイトはサウンド、ということになります。

ここで、PC-6001最大の問題が発生します

VDG (Video Display Generator)が画面描画を行っている際には完全にCPUが停止する。 しかもそれをソフトウェア的に検知する手段がない

そのため、プログラムは時間的に等間隔で音声データをPSGに流し込んでいるつもりでも、VDGの都合で一方的にCPUを止められてしまうので、音声データの流し込みが等間隔ではなくなります。

1水平帰線の時間は63.5usで、そのうちCPUが動作できるのは4.9usです。 これとは別に、垂直帰線中はCPUがフルパワーで動作でき、その時間は2.03msです。

この辺の詳しいタイミングについてはBUSACK/BUSREQのタイミングDMA OFF時の挙動を詳しく調べてありますので、参考まで。

これらの事情で、CPUの動作にムラが出ます。 音声データの流し込み時間間隔がバラバラになってしまうのですね。

せめてCPUが止められてしまったことを何らかの手段で検知できれば対処のしようもあるのですが、本体内部のハードに手を入れるでもしない限り全く手段がありません

音声の再生はタイミングが命です。 いくらサンプルレートが高くとも、タイミングがバラバラでは正確な波形の再現は期待できません。 そのため、あのように怖い声になってしまうのです。

音声「のみ」を再生するのであれば、VDGからのCPU強奪要求を完全に停止できるので、クリアなサウンドを再生できます。 しかし、そうすると画面は全く見えません。

ここに画像と音声の同時再生の難しさがあります。