PSGによるPCM再生の問題
PSG(AY-3-8910)では、音量レジスタを高速に操作することによって任意の音声波形の再生をすることができます。PCM相当のことができるわけですね。
この辺はPSGPCMやSSGPCMといった技術が確立しているので、細かい説明は省きます。 Wikipediaなどには「PSGで高音質のPCMを再生したものはほとんど皆無」とあります。確かにそうなのですが、不可能ではないのです。それにはPSGの性質を理解する必要があります。
PCM再生の音質は標本化周波数(サンプリング周波数)と量子化ビット数により決まります。 大雑把に言うと、PSGでは、標本化周波数は1秒間に音量レジスタを変化させる回数、 量子化ビット数は音量レジスタのとりうる値です。
ここで、PSG(AY-3-8910)の音量レジスタは0~15の4ビットの値をとります。
そのため、PSGでPCMを再生するときに"4ビットPCM"といったりすることがありますが、 実はこれは通常のPCMでいうビット数の考え方からすると誤りです。 というのは、PSGにおける音量レジスタの値と音量の関係はリニアではなく、 対数値であるためです。
nを音量レジスタの値とすると、出力yは以下の式で表せます。
y = 2^-((15-n)/2) | (if n > 0) | |
y = 0 | (if n == 0) |
そのため、特に大音量域での解像度が極端に低くなります。
上図で、横軸は音量レジスタに与える値で、縦軸は音量です。
もしデータが上位半分以上の音量域をメインとして構成されていた場合、0, 0.5, 約0.7, 1の4つの値しか取れず、実質2ビットになってしまうわけです。 これが、「PSGではまともなPCM再生はできない」と言われてしまう所以です。
ミキシングによる高音質化
ところで、PSGには3つのチャネルがあります。発音時はこの3チャネルを合わせるわけですが、この合わせ方とは3つのアナログ信号出力を単に合成するだけです。
このため、この仕様をうまく使うと、粒度の荒い大音領域と細かい小音領域を2つのチャネルで再生し、合成することによってビットの低さを補えるのです。
たとえば、0.5(n=13)と約0.03(n=5)の2チャネルを合わせて約0.53を出力したりすることができる、というわけです。
この方法を3チャネルで使うことにより、計608種類の異なる音量を発生させることができます。これは9ビット強に相当します(以前3チャネルで12ビット相当と他サイトで書いていましたが、厳密には誤りで、およそ9ビットが正しいようです)。
ただ、先ほども説明したように、出力は対数値なので、リニアに9ビットの出力値を得られるというわけではありません。また、3チャネルの音量レジスタを順番に操作するため、時差が発生してしまいます。その辺はエンコード時に上手に計算してあげる必要があります。
これ、MSX用にViterbiアルゴリズムと内挿処理を使って高音質なエンコードをした人がいて、PC-6001でも応用ができます。それが私がやってみた実験です。
実のところ、もとのMSX版の完成度が高いため、私がわざわざやったことは大したことはないのです。 まぁ、PC-6001でここまでやった人はいないだろうということで。
この文章は、以下を大いに参考にさせていただきました。
http://map.tni.nl/articles/psg_sample.php
実機での再生結果
こんな感じです。音質そんなに悪くないでしょ?
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!