PC-6001: October 2008アーカイブ

ファイルシステムのアクセス方法や、コマンドプロンプトからの引数の受け渡し方法などを書いておきました。

Sourceforgeで参照できるようにしてあります。

それと、普通のユーザーズガイドをこのサイトに出してませんでしたので、以下に置いておきます。

アダプタの販売はこちらで扱っていますのでよろしくお願いします。

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)


そのため、特に大音量域での解像度が極端に低くなります。

psg.PNG
上図で、横軸は音量レジスタに与える値で、縦軸は音量です。

もしデータが上位半分以上の音量域をメインとして構成されていた場合、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ビットの出力値を得られるというわけではありません。その辺はエンコード時に上手に計算してあげる必要があります。

これ、MSX用にViterbiアルゴリズムとinterpolationを使って高音質なエンコードをした人がいて、PC-6001でも応用ができます。それが私がやってみた実験です。

実のところ、もとのMSX版の完成度が高いため、私がわざわざやったことは大したことはないのです。 まぁ、PC-6001でここまでやった人はいないだろうということで。

この文章は、以下を大いに参考にさせていただきました。

http://map.tni.nl/articles/psg_sample.php

実機での再生結果
こんな感じです。音質そんなに悪くないでしょ?

さて、AVRを使ってSDカードリーダを作ろうと思っています。本体側からIn/Out 1命令で入出力ができれば、リアルタイムでの動画再生なども不可能ではありません。

とりあえず現状の回路図。

AVR_SD.PNGポイントは以下のようなところです。
  • SDカードは3.3V動作なので、回路全体を3.3V動作にしています。
  • ATmega8Lは内蔵クロックで8MHz動作させます。
  • ISPインタフェースを用意しておいて、プログラムの書き換えに備えます。
  • アドレス線は7432でプリデコードしておくことにより、AVRのI/Oを節約します。
AVRのI/Oポートが少しあまっているのですが、とりあえず未使用にしておきます。

先日秋葉原でEジスPenやらプリント基板キットやらを買い込んできたのですが、この回路図からレイアウトを起こすのが面倒でそのままになっています。きっと世の中には自動レイアウトツールもあるんでしょうね...。

続いて、ムービーエンコーダとプレーヤをリリースします。

それぞれ中にREADMEがありますので参考にしてください。

プレーヤですが、実はこのままでは再コンパイルできません。Hexameterをダウンロードし、適切にMakefileを設定しなおす必要があります。私の環境のままアーカイブにしてしまったためなのですが、直しているといつまでたってもアップロードできないので、とりあえずまずはこれで許してください。

Hexameter 2.1.2をリリースしました.

Sourcceforgeからダウンロードできます.

変わったのは、SDOS 1.1用のテンプレートを用意したことだけですのでたいして大きな変化ではないですが、もしSDカードアダプタをお持ちの方でSDカードをアクセスしたいという奇特な(?)方がいらっしゃればぜひご利用ください. また、SDOS開発時に作成したいろいろ有用なルーチンも用意してますので、良かったら使ってみてください. 戦士カートリッジ版、1M ROMアダプタ版双方で動作するはずです.

一昨日日本から戻ってきました. 時差ぼけで体の調子が悪いのですが、SDOS関連ファイルの公開に向けてファイルの整理を始めました.

Hexameter (SDCC用コンパイル環境)のテンプレートとしてSDOS 1.1用の環境を準備しているほか、ムービープレイヤーなどのソース/バイナリファイルを公開できるように整理しています. とりあえず、Hexameterの方はsourceforgeのCVSの更新は終わったのでダウンロード自身は可能ですが、簡単にダウンロードできるリリース用のアーカイブはまだ準備していません.

私はいったん「入って」しまうと夢中で作業して一気に終わらせてしまう方なのですが、気が乗らないときは途中でほっぽり出してなかなか進みません. よくないことは分かっているのですが...