[TOP] / [PRG] / [PCB] / [FONT] / [ANDR] / [MEMO]
QEMUにOPL3-FM音源を追加する


QEMUとは、簡単にいえばPCエミュレータ。
この中でWindows2000とかWindows11まで動くし、KVMによってCPU仮想化支援され、 CPUパフォーマンスがネイティブ(マシン直インストール動作)に近い動作をしてくれる。
で、サウンドも古いOS用にSoundBlaster16をエミュレートできるのだが、 残念なことにそのSB16内のOPL3の部分は非対応になっている。
特にレガシーアプリケーション(Win95版ぷよぷよ通とか)を動かすのに重宝するし、 この音源は自分の命でもあるので、何としてでも追加せねば。

QEMUのFM音源周りについては、現状
と、だいぶひどい状況。
元のパッケージのインストール
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/内に持ってきて、追加・上書きして下さい。
変更点は以下の通り。 認知の問題点は以下の通り。 でも、実用的に使えるレベルにはなっています。
これで、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マシンで録音)

[前へ] [トップページへ]