よもやもダンプ

音楽、サッカー、プログラムなどをだらだらと。

雑記#7

MAMEのYM2608(OPNA)音源部を取り出して鳴らそうとしてる。
前に探したときOPNA系のエミュレーションとしてはfmgenがあったけど、実際PSGの出力波形は0-maxのところが(-max)-maxになっていたのが気になったので別のものを探してみたところ、前に使ったVGMPlayの音源部にMAMEのコードが使われていたので調べてみた。
GitHubに上がってるMAMEのコードを見てみるとC++で書かれていて、継承が複雑に絡んでいて必要なものだけ取り出すのが大変で心が折れてしまった。
VGMPlayのほうはC++に書き換える前のCで書かれていて、既にVGMPlay用に音源部のみ抜き出した状態で扱いやすく、中身のコードもそれほど変わっている様子がなかったのでそちらを使った。

fmgenは関数の説明がしっかりと書いていたので実装しやすかったが、MAMEのほうは関数がずらずらと書かれているだけだったのでまず音を鳴らすまでが大変だった。
個人的にはMAMEの実際のチップと同じ順序で値を書き込むよりfmgenのように簡単にレジスタ操作できる方がよかったのでCのコードをラッピングする形でクラスを作った。CのコードをC++に直接移植する根性はなかった...

大体はまとまってきたけどまだリズム音源部は試していない。たしかMAMEはfmgenと違ってドラムデータを内部に保持しているはずだったのでそれも確認しておく。
FM音源部とPSG音源部の音量比をどうするか悩んだが、そもそも実際のチップがミキシングを外部で行なっているので音源ボードによって音量比が違っているし、どれが基準と決められないのでとりあえずそのままにしておいた。
MAME内部で波形サンプルを出力した時、サンプリングレートはチップのクロック数から算出される形式なので44.1kHzとは限らず、さらにFM音源部とPSG音源部でレートが違っているのでサンプリングレート変換する必要がある。
サンプリングレート変換については何も知らなかったので色々サイトを巡って調べた。
VGMPlayでは線形補間しているけど、調べてみるとこの方法では結構誤差が出るみたいなのでsinc補間というものを使おうと思う。