COUNTERSince June 16, 2000
STUDIO KAMADAJapanese to English by Excite
戻る | サイトマップ | ホーム
X680x0の内蔵音源を駆使した高品位ステレオPCM再生2002-10-01(Tue) 02:39

目次



はじめに

 X680x0の内蔵音源は、8チャンネルのFM音源(OPM…YM2151)と、15.625kHzまでのサンプリング周波数で再生できる1チャンネルのPCM音源(ADPCM…MSM6258V)で構成されています。PCMデータをステレオ再生する(左と右で別々のPCMデータを再生する)ためには最低でも2チャンネルのPCM音源が必要ですから、ハードウェアを追加しない限り、普通の方法ではPCMデータをステレオで再生することはできません。しかし、限られた内蔵音源を駆使してPCMデータをステレオ再生する試みは過去に幾つかありました。
 X680x0において広く公開されたPCMのステレオ再生プログラムとしては、古くはOh!X 1993年3月号の“(で)のショートプロぱーてぃ”のコーナーに掲載された秋山嗣晴氏によるPCMST.Sに遡ります。PCMST.Sによるステレオ再生の方法は、ステレオのPCMデータを細切れにしてADPCMで左右交互に出力し、左右の切り換えを高速に行うことでADPCMを疑似的にステレオ化するというものでした。私の知る限り、X68000の内蔵音源のみでPCMデータをステレオ再生する試みを広く発表されたプログラムとしてはPCMST.Sがおそらく初めてであり、私も当時その発想と実現力に感動を覚えつつOh!Xに掲載されていたプログラムをせっせと入力した覚えがあります。
 ただ、PCMST.Sの方法では実際に左右同時に(意図した)音が出るわけではなく、また、PCMデータを細切れにしているためにノイズが多いのが難点でした。なお、このプログラムはその後バージョンアップされて電脳倶楽部VOL.99(1996年8月号)にPCMST.XとWAVST.Xとして掲載されています。
 電脳倶楽部にPCMST.Xが掲載されたことがきっかけで、伊倉"DigitalJunkie"晴読氏が別のアプローチでPCMデータをステレオ再生するプログラムSTPLAY.Xを作り、電脳倶楽部VOL.100(1996年9月号)に掲載されました。STPLAY.Xは、右側の音をADPCMで、左側の音をFM音源で再生するという方法で、左右同時に15.625kHzでPCMを再生することができました。
 FM音源を4チャンネル使うことで1チャンネルのPCM音源をエミュレートできることは同氏の手によって電脳倶楽部VOL.78(1994年11月号)に掲載された“志村けんX”というプログラムで既に証明されており、STPLAY.Xはそれを応用したものでした。


今回の試み

 さて、私が激光電脳倶楽部VOL.6に向けて音に関係する記事を書くことになったとき、私は自分もPCMのステレオ再生を試みようと思いました。それも激光電脳倶楽部なのですから、CD2PCMT.Xなどを使うことで音楽CDから容易にデータを供給できる(勿論、個人的な使用の範囲でですが)サンプリング周波数が44.1kHzのステレオのPCMデータを直接再生できるプログラムを作りたくなりました。
 前述の通り、X680x0の内蔵ADPCM音源は最高で15.625kHzまでのサンプリング周波数にしか対応しておらず、ADPCMでこれよりも高い周波数でPCMデータ再生することは不可能です。しかし、STPLAY.Xで使われていたFM音源の処理能力にはまだ少し余裕があります。そこで、私は15.625kHzのADPCMの使用はさっさと諦めて、左右両方のチャンネルをFM音源で再生して再生周波数をADPCMよりも上げられないかと考えました。


FM音源の処理速度の限界

 諦めついでにもう1つ。アセンブラでFM音源レジスタを直接叩いたことがある人ならば知っていることですが、FM音源レジスタの読み書きはFM音源アドレスポート($00E90001)とFM音源データポート($00E90003)という2つのポートをアクセスすることによって行います。ここで、それぞれのポートに書き込んだ後、FM音源データポートの書き込みビジーフラグ($00E90003のMSB)がクリアされるまで次の書き込みを行ってはいけないという決まりがあります。FM音源データポートへの書き込みの後ビジーフラグがクリアされるまでにかかる時間は、FM音源LSI(YM2151)の入力クロックの68クロック分です。YM2151には4MHzのクロックが入っていますから、FM音源データポートへの書き込みを繰り返す場合には少なくとも17μ秒以上間隔をあけて行わなければならないことになります。実際にこれよりも短い間隔でFM音源データポートに書き込もうとすると、書き込みに失敗して期待通りの音が出なくなります。
 音楽CDのサンプリング周波数は44.1kHzです。単純に割り算をすると、1周期あたり約22.6757μ秒しかありません。しかもステレオですから、1周期の間に2チャンネル分のデータを処理しなければなりません。
 FM音源データポートへの書き込みは1回あたり最低でも17μ秒以上かかり、2チャンネル更新するためにはTLを2つ更新するため少なくとも2回データポートに書き込まなければなりませんから、17*2=34>22.6757であり、実際に動かして確かめるまでもなく、FM音源のみでPCMデータをステレオで44.1kHzという周波数で再生することが不可能であることがわかります。
 仕方がないので、44.1kHzでのステレオ再生は諦めて、周波数を落としてステレオ再生することを考えましょう。


FM音源でPCMデータを再生する方法

 ここで説明する方法は伊倉"DigitalJunkie"晴読氏が“志村けんX”やSTPLAY.Xで使用した方法を私が改良したものです。


ステレオ化

 前述のように、FM音源でPCMを再生するためには4チャンネル必要です。FM音源には全部で8つのチャンネルがありますから、すべてのチャンネルを使えばFM音源のみでPCMをステレオ再生することができます。
 注意しなければならないのは、FM音源レジスタは2つ同時に更新できないということです。そのため、右側の変位を更新するタイミングと左側の変位を更新するタイミングが微妙にずれてしまいます。この問題を解決するには、PCMデータの周波数を変換するときに、左右の出力データのサンプリング位置をサンプリング間隔の半分だけずらしておかなければなりません。
 STPLAY.XではFM音源が担当する音が片側だけだったので、例えばCh1を使っている間はFM音源アドレスポートをCh1のTL($78)に固定してFM音源データポートだけを更新し続けることができました。しかし、ステレオ化する場合、Ch1のTL($78)とCh5のTL($7C)を交互に更新するためにFM音源アドレスポートも毎回更新しなければなりません。そのため、FM音源によるPCMのステレオ再生の負荷はモノラル再生の2倍以上になります。


サンプリング周波数の変換

 入力データのサンプリング周波数とFM音源でPCMを再生する際の出力時のサンプリング周波数は異なる場合が多いので、PCMデータのサンプリング周波数の変換が必要です。サンプリング周波数の変換は、PCMデータをOPMデータに変換する前に行います。すなわち、PCM→PCMのサンプリング周波数変換を行います。
 S44PLAY.Xでは、次の3通りのサンプリング変換方法を選べるようにしてみました。
  1. 間引き・伸張
  2. 直線補間
  3. 面積補間
  1. 間引き・伸張
     サンプリング間隔が短くなる場合は、データの伸張を行います。1データ毎にサンプリングのタイミングの誤差を蓄積し、誤差が1データ分に達したら最後データを重複して出力します。
     サンプリング間隔が長くなる場合は、余った入力データを捨てます。
     この方法は非常に簡単なのでリアルタイムに変換できますが、音質は良くありません。

  2. 直線補間
     入力されたPCMデータを直線で補間した上で、出力側のサンプリング間隔でサンプリングしなおします(図8)。

    図8 サンプリング周波数の変換(直線補間)

     この方法では1データあたり1回の乗算が必要なので、68000ではリアルタイムに変換できません。

  3. 面積補間
     面積補間という呼び方は筆者が勝手につけたものです。
     入力されたPCMデータを直線で補間した上で、出力側のサンプリング間隔で刻み、切り取られた各区間の平均の高さ(面積に比例する)を出力データとします。

    図9 サンプリング周波数の変換(面積補間)

     この方法では1データあたり2回以上の乗算が必要なので、リアルタイム変換ができるのは事実上68060のみです。しかし、今回採用した方法の中では最も音質が良いので、音質にこだわる場合はあらかじめこの方法で変換したデータのファイルを作っておくべきです。


実装

 060turboで作り始めたので、.S44ファイルをオンメモリで再生できるようにすることは比較的容易でした。060turboに大容量のSIMMを装着していれば、数分間の曲をオンメモリで再生することができました。
 プログラムの名前は、.S44ファイルを直接再生できるということで、S44PLAY.Xにしました。再生中はマシンのパワーをほとんど使ってしまうので他のことをする余裕がないことと、ディスクからデータを読み込みながら再生する機能があるため、他の音源ドライバのように常駐はしません。
 次に、ファイルから読み込みながらの再生ができるようにしました。普通に、バッファを2つ使って、一方を再生している間に他方にファイルを読み込んでおくという方法です。68030モードでも動くようになりました。ハードディスクやMOに置いてある.S44ファイルを延々と再生することができます。当然のことですが、フロッピーディスクではデータの供給が間に合いません。
 始めは音楽CDからCD2PCMT.Xを使って吸い出して作った.S44ファイルを使ってテストしていたのですが、いちいち.S44ファイルを作るのが面倒になり、数10MB単位のファイルを幾つも転がしておけないので、音楽CDの音声トラックを直接読み込みながらの再生を試みてみました。CD2PCMT.Xのソースを参考にしながら作ったのですが、初めはだいぶてこずりました。SCSIバスを何度もハングアップさせながら作っているうちに、ハングアップしても容易に復帰できるようにするための仕掛けのほうが強力になりました。X680x0がCDプレイヤーになっている様はなかなか壮観です。
 S44PLAY.Xの公開済みの最新版は激光電脳倶楽部Vol.7に収録されていますが、バグが取れていないので、月刊電脳倶楽部のほうで更新する予定です。★1


FMPファイル

 ステレオ再生時の片側のサンプリング周波数は最大でも25kHz程度までなので、低いサンプリング周波数でいかに綺麗に再生するかが重要になってきます。しかし、サンプリング周波数の変換を複雑にするとマシンのパワーが不足するのでリアルタイムでの変換ができなくなってしまいます。そこで、高品質な変換を行う場合は、サンプリング周波数の変換(およびPCMからTLへの変換)を済ませたデータを一旦ファイルとして出力しておくことにしました。再生時には変換済みのデータをファイルから読み込みながらただひたすらFM音源レジスタに垂れ流すだけにすることで、特にX68030の場合はFM音源LSI(YM2151)の応答速度ぎりぎりの高いサンプリング周波数で再生できるようになりました。
 リアルタイム変換で高品質なステレオPCM再生を行うには68060以上のパワーが必要です。しかし、データをあらかじめ変換しておけば68000でもディスクからデータを読み込みながらの再生が可能です。再生エンジンをゲームなどに実装するときは、あらかじめFMPフォーマットに変換済みのファイルを用意しておくことで、主題歌などを高品質のPCMで再生することが可能です。


困ったこと



おわりに

 S44PLAY.Xは、X680x0用のプログラムの中で最もFM音源を酷使するプログラムの1つと言えると思います。何しろ、FM音源LSI(YM2151)をこれ以上速く制御できないという速度で長時間アクセスし続けるのですから。
 PCM音源とは到底呼べないような音源を使ってPCMデータを再生するという発想は、パソコンがまだ8ビットだった時代からあったものです。古くからのOh!Xの読者ならば、あの「サンダーフォース!」の“声”が記憶に残っている人も少なくないのではないでしょうか。
 パソコンを特定のソフトを動かすためのプラットフォームとしてだけでなく、パソコンそのものをオモチャとして使う、しかも他の人が思い付かない、あるいは思い付いても誰もやらないような突拍子もない使い方をする、そんな楽しみ方をこれからも続けてゆきたいものです。


 この文章は、ソフトバンクのOh!X 1999年夏号に掲載されたものです(掲載時のタイトルは『内蔵音源を駆使した高品位ステレオPCM再生』であり、「X680x0の」という言葉はついていませんでした)。
 Webでの公開にあたり、Oh!Xに掲載済みの原稿を著者が自由に使用できることを確認済みです。
Copyright (C) 1999,2000 M.Kamada
★1 S44PLAY.Xの最新版はこちら…X68000ソフトウェアライブラリ(S44PLAY.X / FMPPLAY.X)
★2 S44PLAY.X v1.02のソースは25000行以上あります。

戻る | サイトマップ | ホーム
E-mail: m_kamada at nifty dot comMirrorCopyright (C) 1999-2004 M.Kamada All Rights Reserved.