SimutransというゲームではBGMがMIDIファイルになっており、そのBGMがならなくて困ったので解決策を探していたらLinuxでSDL_mixerを使っている際に共通する(と思われる)解決策で解決でき、また日本語情報が見つからなかったので共有します。
動作環境
上記の通り、今回は一つのゲームでしか試していません。そのうえで今回上手く動作した環境は以下です。
- OS: Arch Linux (Linux 5.5.4-arch1-1)
- SDL_mixer: libSDL_mixer-1.2.so.0.12.0
- サウンドフォント: FluidR3_GM.sf2
- Simutrans: Simutrans 121.0
また、PulseAudio環境下での話です。
確認点
TiMidity++またはFluidSynth
まずそもそも、LinuxでMIDIを再生するためにこれらのうちの少なくとも一方を入れる必要があります。今回の場合どちらも入っている状態で片方ずつ確認しましたが、それぞれ正常に動作したのでどちらでも良いと思われます。また、単に導入するだけでも駄目で、timidity -iA
やfluidsynth -a pulseaudio -m alsa_seq -o midi.autoconnect 1 [SOUND_FONT]
等でデーモン化させておく必要があります。個々のオプションは環境に合わせて調節してください。
サウンドフォント
OSにより異なると思いますが、少なくともArchLinuxではTiMidity++やFluidSynthを導入してもサウンドフォントは入らないため、別に入れる必要があります。導入したサウンドフォントはデーモン化する際にTiMidity++の場合は/etc/timidity++/timidity.conf
等、FluidSynthの場合は引数に指定してください。
SDL_SOUNDFONTS
SDL_mixerを使ったプログラムを実行する際に、上で設定したサウンドフォントのパスをSDL_SOUNDFONTS=/path/to/soundfont.sf2 ./program
のように指定してください。試していないですが、恐らく.bashrc
等で設定しても大丈夫だと思います。
ミュート
ここまでの作業で再生されるはずですが、もし再生されない場合は念の為ミュートになっていないか確認してください。今回の場合はここまでで上手く再生されました。
最後に
SDL_SOUNDFONTS
の情報が見つからずに嵌ってしまい、また見つかった際もFluidSynthをSDL_mixerと組み合わせる場合の情報として書いてあったので、探しづらかったです。なお、動作環境にも書きましたが、SDL2ではなくSDLでの話なのでSDL2では変わっている可能性があります。
情報元
- ArchWiki (英語版): https://wiki.archlinux.org/index.php/FluidSynth#SDL_Mixer