■ QEMUにOPL3-FM音源を追加する
QEMUとは、簡単にいえばPCエミュレータ。
この中でWindows2000とかWindows11まで動くし、KVMによってCPU仮想化支援され、
CPUパフォーマンスがネイティブ(マシン直インストール動作)に近い動作をしてくれる。
で、サウンドも古いOS用にSoundBlaster16をエミュレートできるのだが、
残念なことにそのSB16内のOPL3の部分は非対応になっている。
特にレガシーアプリケーション(Win95版ぷよぷよ通とか)を動かすのに重宝するし、
この音源は自分の命でもあるので、何としてでも追加せねば。
QEMUのFM音源周りについては、現状
- SoundBlaster16エミュレート機能はあり、virt-managerでも隠し対応してるが、OPL3は無い。
- AdLib(OPL2だけ積んだボード)のエミュレート機能はあるが、virt-managerとかでは設定不可。
- このOPL2部のエミュは古いソースなため、再現度がいまいち。
と、だいぶひどい状況。
元のパッケージのインストール
QEMUを簡単にGUIで動かせるパッケージを入れておく。入れるのは「virt-manager」。
これをインストール時にQEMUも入ってくるが、このQEMUをビルド時に上書きする。
インストール
apt install virt-manager
オリジナルに戻すとき
apt reinstall qemu-system-x86
ソースからのビルド環境の構築
まず、QEMUをいじるためには、ソースコードからビルドできる環境がないと何も始まらない。
ビルドに必要なパッケージのインストール
ビルドに必要なパッケージは、公式によれば
こう入れるらしい。
実際、Debianではこれでどうにかなる。
apt update
apt dist-upgrade -y
apt install --no-install-recommends -y \
bash \
bc \
bison \
bzip2 \
ca-certificates \
ccache \
findutils \
flex \
gcc \
git \
libc6-dev \
libfdt-dev \
libffi-dev \
libglib2.0-dev \
libpixman-1-dev \
locales \
make \
meson \
ninja-build \
pkgconf \
python3 \
python3-venv \
sed \
tar
apt build-dep qemu
要するに、最低限のパッケージを入れたら、
「apt build-dep qemu」で、qemuのビルドに必要なパッケージ一式をまるごと入れる感じ。
ビルド設定と実ビルド処理
ソースコードは、公式サイトで最新版をダウンロードできる。
(apt sourceとか使っても良いのだが、Debian公式のは古いし…。)
https://www.qemu.org/download/
ソースコードをダウンロード・展開したら、これをビルドする。
元のQEMUと互換性のある設定でconfigureし、ビルドし、それを上書きインストールする。
$ ./configure --prefix=/usr --localstatedir=/var --target-list=x86_64-softmmu --enable-spice --enable-usb-redir
$ make
$ sudo make install
その後、「qemu-system-x86_64 --version」で、ビルドしたソースと同じバージョンなら成功。
virt-manager上で仮想マシンが起動できれば尚成功。
ソースの変更
変更するのは、./hw/audio/内。sb16.cがSoundBlasterのエミュ部。
これに、OPL3の出力部を混ぜる。
ところで、このsb16.c、「PCMが鳴り終わったときに、他のサウンドも巻き添えで鳴らなくなる」という
致命的なバグを抱えてることが判明したので、これも修正。
FM音源を別出力で出そうとして、途中で切れると思ったら、どーりで。
変更したソースのライセンスは、もちろんGPL2継承です。
OPL3対応版sb16.c(フェイク版)
sb16_opl3fake.c
既存のOPL2エミュを2つ並べて、レジスタを細工することでOPL3に見立てた、
「OPL3フェイク版」です。
これをsb16.cに名前変更して上書きすると適用されます。
OPL2で作ったフェイクなので、OPL3独自要素の「4オペ出力」「ステレオ」がありません。
これで、Windows2000でもFMシンセが使えるようになります。
そして、既存のOPL2のエミュの再現度が、今となってはあんまり良くないことが分かります。
OPL3対応版sb16.c(本物版)
sb16_opl3.tar.gz
DOSBox-XのOPL3エミュ部を、cpp→cにしたりなど、sb16.cに取り込みやすいように移植したものです。
(ライセンスはどっちもGPL2)
そのymf262.cにymf262.h、変更したsb16.c、ビルド対象に追加するmeson.buildが入ってます。
これを./hw/audio/内に持ってきて、追加・上書きして下さい。
変更点は以下の通り。
- OPL3対応!!!!
- FM音源のミキサー音量変更対応。(PCM・マスターは非対応)
- PCM再生終了後、他のサウンドデバイスまで鳴らなくなる不具合の修正。
認知の問題点は以下の通り。
- 従来どおり、録音は非対応。録音を使うとフリーズします。
- sb16は、FM音源以外のミキサーは非対応です。
でも、実用的に使えるレベルにはなっています。
これで、Windows95版ぷよぷよ通とかも本来の音で遊べるのではないかと。
MIDIの再生がぎこちない問題の解決
MIDIを再生すると、なんか発音タイミングがぎこちない…。自分が作曲用に使うにあたっては実用に耐えない。
…って状態になったので調べると、デフォルトのサウンド処理周期設定が長すぎることが判明。
audioのtimerPeriodの値を短く設定すれば解決します。
virt-managerで作った仮想マシンのデフォルト設定では、この設定がなくデフォルト値を適用、
デフォルトの周期は「10000(us)」です。つまり100Hz。
様々なテンポで、32分音符とか駆使した曲とか再生させるにあたっては、荒すぎます。
というわけで、ここを「1000(us)」にして細かくします。1000Hzなら精度的にも処理速度的にもバランスが取れた値です。
で、PulseAudioでローカルネットワークを使った接続でサウンドを送ることで音質改善、
sb16はPCM録音ができないしパフォーマンスも悪いのでac97も追加、とかやって、
最終的にサウンド周りの設定はこうなりました。
<sound model="ac97"/>
<sound model="sb16"/>
<audio id="1" type="pulseaudio" timerPeriod="1000" serverName="127.0.0.1"/>
検証用MIDI自作曲を作ったので、ここに置いておきます。これで動作確認してました。
これがちゃんと模範解答どおりに再生できればOK。
曲自体のライセンスは、「偽の自作発言はダメだけど、非商用目的なら自由に使っていいよ」って感じで。
・
mus300.mid OFGM300: QEMU Timer Bullying(OPL3MIDI専用)
・
mus300.mp3 ↑の模範解答(YMF754+WinXPマシンで録音)
[前へ] [トップページへ]