古いパソコン用のソフトを実機で遊ぶのも好きですが、エミュレータで遊ぶのも好きです。
P88SRをはじめ、PC-88のエミュレータはいくつかありますが、OPNAのソフトエミュレーションに対応しているエミュには一つ共通していることがあります。
それは「OPNA内蔵リズム音源の音は自分で用意しなければならない」ということです。
OPNAはチップに内蔵しているROMにリズム音のADPCMデータが格納されていて、それを再生してリズム音を鳴らしています。
エミュで使うリズム音ファイルを用意するにはOPNAが載ったボードや本体のアナログ音声出力を録音するのが最もお手軽ですが、このデジタルデータを直接取り込めば余分なノイズのないデータが得られます。
エミュが流行った当時、OPNAから直接リズム音のデジタルデータを吸い上げる同人ハードがあるという話を聞いたことがあったので探してみたんですが見つかりませんでした。
探しかたが悪いのか既に情報公開されていないのか。
見つからないものは仕方ありません。
やり方は思いつくので、自作することにしました。
○OPNAリズム音データ吸出し基板
前置きが長くなりましたが、これがOPNAからリズム音のデジタルデータを吸い出すための基板です。
○OPNAリズム音データ吸出し基板(部品実装後)
部品を実装するとこうなります。
が、載っているのは実質的にメモリだけです。
これだけでは何もできません。
OPNAから出力される音声信号はシリアルのデジタルデータになっています。
ファイルに保存するにはシリアル→パラレル変換が必要です。
これをCPLDで行います。
○CPLD基板
吸出し基板はリズム音のデジタルデータを抜き出したら用済みとなってしまうので、CPLDを再利用できるようにピッチ変換基板を使って吸出し基板と分離しました。
○ベース基板
吸出し基板に蓄積したデジタルデータを吸い上げてファイルに保存するのはPC-98で動くソフトで行います。
ですので吸出し基板をPC-98の拡張スロットに接続するための基板も用意しました。
元はNEC純正のDIOボードらしいです。
必要な信号のランドがカードエッジコネクタ部分にあれば何でもよかったのですが、これがオクで安く出品されていたので落札しました。
不要な部品はすべて撤去してあります。
最初からCバスボードとして作ればいいんじゃ?という疑問を持つ方もいらっしゃると思いますが、このサイズの基板を作ろうとするとめちゃくちゃ値段が高くなるんです(--;
海外の企業に依頼しているんですが、円安が進んだ昨今なるべく基板サイズを小さくして費用を抑えたいのです。
○MILコネクタ装着
抜き出し基板を接続&固定するためのコネクタを付けました。
○合体
すべて接続するとこうなります。
○PC-98本体装着後
PC-386GSに載せました。
OPNAのデジタル出力は86ボード上にあるYM3016の脚から横取りしています。
YM3016のデータシートを参考にCPLDの論理合成データと吸出しプログラムを作成しましたが、OPNAから出力されるデジタルデータ(16bit)が符号付きなのか符号なしなのかデータシートからはわかりませんでした。
とりあえず符号付きと仮定して組んだプログラムで吸い出してみると。
○吸い出したデータの波形(1st)
うん。符号なしデータを符号付きとして表示したときの波形ですね。
符号なしデータを符号付きデータに補正する処理をプログラムに追加して再チャレンジ。
○吸い出したデータの波形(2nd)
よし。
ちゃんとデジタルデータを吸い上げることができました。
これを6つあるリズム音源すべてに行なって、エミュ用の音源ファイルができました。
エミュにもっていったところちゃんとリズム音源が鳴るようになりました。
(使用しているエミュはcisc氏が開発しレッドナウ氏が改修したM88x6です)
○リズム音源再生確認中
リズム音源を鳴らしていることを視覚的に確認できるBASICプログラムを使っています。
◇◇◇
ちなみに吸い出したデジタルデータのサンプリング周波数は約55466Hzという中途半端な周波数になっています。
サンプリング周波数変換をすることなくそのままエミュレータにもっていきましたが、我が家の環境では特に音程が変わったりすることなく鳴っています。
特定のサンプリング周波数にしか対応していないサウンドカードだとおかしくなるかもしれません。
エミュ(M88)がサンプリングレート変換していることがマニュアルに明記されてました。
さらに設定画面を見てみると、エミュレーションするときのサンプリングレートの設定に55kHzという選択肢がありました。
また手持ちの部品の都合でメモリへのデータ蓄積時間は約2.4秒になっています。
リズム音の長さは吸い出してみないとわからないので2.4秒分すべてを吸い上げてファイルに保存しています。
実際に鳴っている時間はトップシンバルを除いてコンマ1秒程度、最も長いトップシンバルでもコンマ7秒弱だったので、残り2秒ほどのデータは無駄なのですが、エミュでは無駄にファイルが大きくても問題なく使えるようです。
吸い上げた後余分なデータを切り詰めて周波数変換するつもりだったのですが、手間が省けました。
◇◇◇
さて、ここまでは淡々と結果のみを書いてきましたが、この吸出し基板の作成には苦労しました。
6月の頭に設計を始めて、7月頭に基板を作成し、試行錯誤を繰り返して昨日ようやくデータを吸い出すことができました。
1. 吸い上げ基板(の内部レジスタ)のソフトリセット
2. デジタルデータのシリアル→パラレル変換と変換したデータのメモリ格納
3. メモリに格納したデータをI/Oポートを介してプログラムに出力
以上三つの機能をそれぞれのモードとしてプログラムからの指示に従って切り替えるようにCPLDを論理合成しているんですが、2.から3.への切り替えがうまくいかずここ数週間悩んでいました。
回避策をようやく見つけて、昨日データを吸い出すことができましたが、原因はわからずじまいです。
というか、デジタルデータを吸い出すという目的を達成したので原因究明する必要がなくなりました。
以下、個人的備忘録
基板設計データはYM2608ROMDUMP.LZH
CPLDの論理合成データも同梱(VHD,UCF,JED,XISEのみ)
吸出しプログラムはOPNADUMP。