2024/01/25(木) [n年前の日記]
#2 [basic] FreeBASICとSDL2_mixerでoggを再生できるか試した
Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit でサウンドを鳴らしてみたい。できれば ogg (Ogg Vorbis)を再生したい。
Ogg Vorbis (正確には Vorbis) というのは非可逆圧縮の音声ファイル。mp3 みたいなもの。mp3 と違ってライセンスが緩く、ギャップレス再生もできるので、mp3 よりもゲーム制作に利用し易い。
_Vorbis - Wikipedia
方法についてググってみたら以下の解説記事に遭遇。
_Simplest code to play MP3 or OGG with SDL - freebasic.net
_Windows Ini File FreeBASIC
SDL2 と SDL2_mixer を利用すれば鳴らすことができるようだなと…。
ちなみに、FreeBASIC は、標準状態では beep を鳴らすことしかできないらしい。NEC PC-8001レベルだなあ…。
_FaqPgrtlib
Ogg Vorbis (正確には Vorbis) というのは非可逆圧縮の音声ファイル。mp3 みたいなもの。mp3 と違ってライセンスが緩く、ギャップレス再生もできるので、mp3 よりもゲーム制作に利用し易い。
_Vorbis - Wikipedia
方法についてググってみたら以下の解説記事に遭遇。
_Simplest code to play MP3 or OGG with SDL - freebasic.net
_Windows Ini File FreeBASIC
SDL2 と SDL2_mixer を利用すれば鳴らすことができるようだなと…。
ちなみに、FreeBASIC は、標準状態では beep を鳴らすことしかできないらしい。NEC PC-8001レベルだなあ…。
_FaqPgrtlib
◎ SDL2関連ファイルの入手 :
oggを再生するために、SDL2 と SDL2_mixer を FreeBASIC に導入しないといけない。
当初、SDL2-devel-2.29.2-mingw.zip と SDL2_mixer-devel-2.8.0-mingw.zip を入手して、中に入っていた .dll や .a を利用しようとしたのだけど、それでは正常動作してくれなかった。
FreeBASICインストールフォルダ/inc/SDL2/*.bi を眺めたところ、各ファイルの最初のあたりに、利用を想定している SDL2 のバージョンが書いてあることに気づいた。FreeBASIC 1.10.1 の時点では、それぞれ以下のバージョンが推奨されているらしい。
これらのバージョンを入手しないと…。以下からSDL2関連ファイルを入手する。
_SDL2 - Index of /release
_SDL2_image - Index of /projects/SDL_image/release
_SDL2_mixer - Index of /projects/SDL_mixer/release
_SDL2_net - Index of /projects/SDL_net/release
_SDL2_ttf - Index of /projects/SDL_ttf/release
入手するファイルは以下。ファイル名に mingw と記載されてるファイルを入手する。今回は SDL2 と SDL2_mixer を利用できればいいので他のファイルは要らんのだけど、ついでなので…。
解凍すると、中には i686-w64-mingw32/, x86_64-w64-mingw32/ が入っている。i686が32bit版、x86_64 が64bit版。
*.dll と *.a、どちらもプロジェクトフォルダにコピーしてしまってもいいし、あるいは、*.a を、FreeBASICインストールフォルダ/lib/win??/ にコピーしてしまってもいい。ただ、SDL2 を使っているプログラムを実行する際は、同じフォルダ内に SDL2関係の .dll が必要になる、と思う。たぶん。
今回必要になるDLLファイルは以下になる。
コンパイル時に必要になりそうな .a ファイルは以下。
当初、SDL2-devel-2.29.2-mingw.zip と SDL2_mixer-devel-2.8.0-mingw.zip を入手して、中に入っていた .dll や .a を利用しようとしたのだけど、それでは正常動作してくれなかった。
FreeBASICインストールフォルダ/inc/SDL2/*.bi を眺めたところ、各ファイルの最初のあたりに、利用を想定している SDL2 のバージョンが書いてあることに気づいた。FreeBASIC 1.10.1 の時点では、それぞれ以下のバージョンが推奨されているらしい。
SDL.bi : SDL2-2.0.14 SDL_image.bi : SDL2_image-2.0.5 SDL_Mixer.bi : SDL2_mixer-2.0.4 SDL_net.bi : SDL2_net-2.0.1 SDL_ttf.bi : SDL2_ttf-2.0.15 SDL2_gfx_framerate.bi : SDL2_gfx-1.0.4 SDL2_gfx_imageFilter.bi : SDL2_gfx-1.0.4 SDL2_gfx_primitives.bi : SDL2_gfx-1.0.4 SDL2_gfx_primitives_font.bi : SDL2_gfx-1.0.4 SDL2_gfx_rotozoom.bi : SDL2_gfx-1.0.4
これらのバージョンを入手しないと…。以下からSDL2関連ファイルを入手する。
_SDL2 - Index of /release
_SDL2_image - Index of /projects/SDL_image/release
_SDL2_mixer - Index of /projects/SDL_mixer/release
_SDL2_net - Index of /projects/SDL_net/release
_SDL2_ttf - Index of /projects/SDL_ttf/release
入手するファイルは以下。ファイル名に mingw と記載されてるファイルを入手する。今回は SDL2 と SDL2_mixer を利用できればいいので他のファイルは要らんのだけど、ついでなので…。
SDL2-devel-2.0.14-mingw.tar.gz SDL2_image-devel-2.0.5-mingw.tar.gz SDL2_mixer-devel-2.0.4-mingw.tar.gz SDL2_net-devel-2.0.1-mingw.tar.gz SDL2_ttf-devel-2.0.15-mingw.tar.gz
解凍すると、中には i686-w64-mingw32/, x86_64-w64-mingw32/ が入っている。i686が32bit版、x86_64 が64bit版。
- bin/*.dll が実行に必要なDLLファイル。
- lib/*.a が、コンパイル時に必要になるライブラリファイル。
*.dll と *.a、どちらもプロジェクトフォルダにコピーしてしまってもいいし、あるいは、*.a を、FreeBASICインストールフォルダ/lib/win??/ にコピーしてしまってもいい。ただ、SDL2 を使っているプログラムを実行する際は、同じフォルダ内に SDL2関係の .dll が必要になる、と思う。たぶん。
今回必要になるDLLファイルは以下になる。
# SDL2 SDL2.dll sdl2-config # SDL2_mixer libFLAC-8.dll libmodplug-1.dll libmpg123-0.dll libogg-0.dll libopus-0.dll libopusfile-0.dll libvorbis-0.dll libvorbisfile-3.dll SDL2_mixer.dll
コンパイル時に必要になりそうな .a ファイルは以下。
# SDL2 libSDL2.a libSDL2.dll.a libSDL2_test.a libSDL2main.a # SDL2_mixer libSDL2_mixer.a libSDL2_mixer.dll.a
◎ サンプルソース :
前述の解説記事からコピペして、サンプルソースを作成。
_ogg_play_sdl2.bas
今回は、bgm.ogg というファイルを読み込ませている。
_bgm.ogg
fbc ogg_play_sdl2.bas でコンパイル。ogg_play_sdl2.exe が生成された。
実行してみると以下のメッセージが表示される。
1, 2, 3, 4, Spaceキーで、oggを停止、再生、ポーズ、リジューム(ポーズ解除)、プログラムの終了ができた。
ということで、FreeBASIC + SDL2 + SDL2_mixer を使えば、ogg (Ogg Vorbis) が再生できると分かった。ゲームのBGMとして鳴らせそうではあるなと…。しかし、BGMはこれでなんとかなるとして、SE はどうすれば…? 複数のチャンネルで鳴らせないと話にならないよな…。
_ogg_play_sdl2.bas
' ogg play with SDL2 and SLD2_mixer ' request : SDL2 2.0.14, SDL2_mixer 2.0.4 #include "SDL2/SDL_mixer.bi" dim mymusic as Mix_Music ptr chdir exepath() Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096) ' Here your music file in *.mp3 or *.ogg mymusic = Mix_LoadMUS("bgm.ogg") Mix_VolumeMusic(128) ' 128 is the maximum volume ' 0 play once / -1 play infinit loop ' Mix_PlayMusic(mymusic, 0) print "Press 1 to stop music." print "Press 2 to play music." print "Press 3 to pause music." print "Press 4 to resume music." print "Press space key to exit program." Dim As Boolean running = True While running Dim As String k = inkey$ Select Case k Case "1": Mix_HaltMusic() Case "2": Mix_PlayMusic(mymusic, -1) Case "3": Mix_PauseMusic() Case "4": Mix_ResumeMusic() Case " ": running = False End Select sleep 200 Wend FINALIZATION: Mix_CloseAudio()
今回は、bgm.ogg というファイルを読み込ませている。
_bgm.ogg
fbc ogg_play_sdl2.bas でコンパイル。ogg_play_sdl2.exe が生成された。
実行してみると以下のメッセージが表示される。
> ogg_play_sdl2.exe Press 1 to stop music. Press 2 to play music. Press 3 to pause music. Press 4 to resume music. Press space key to exit program.
1, 2, 3, 4, Spaceキーで、oggを停止、再生、ポーズ、リジューム(ポーズ解除)、プログラムの終了ができた。
ということで、FreeBASIC + SDL2 + SDL2_mixer を使えば、ogg (Ogg Vorbis) が再生できると分かった。ゲームのBGMとして鳴らせそうではあるなと…。しかし、BGMはこれでなんとかなるとして、SE はどうすれば…? 複数のチャンネルで鳴らせないと話にならないよな…。
◎ 余談。SDL1.xについて :
FreeBASIC は、SDL (SDL 1.x) と SDL2 (2.x) を使えるようで、今回は SDL2 を使ったわけだけど。
先日、SDL (SDL 1.x) を利用できるか実験したときは、MSYS2 の mingw32/ 以下から *.a を持ってきて試してみたら動いてしまったわけで…。アレって、SDL 1.x のバージョンは合ってたのだろうか? 不安になってきたので調べてみた。
FreeBASICインストールフォルダ/inc/SDL/*.bi に記述されてる、SDL 1.x の推奨バージョンは以下になっていた。
MSYS2側のパッケージのバージョンは以下になっていた。(x:/msys64/var/cache/pacman/pkg/mingw-w64-i686-SDL*)
SDL_gfx 以外は、たまたまバージョンが一致していた模様。 *1 だからすんなり動いてしまったのかもしれないな…。
先日、SDL (SDL 1.x) を利用できるか実験したときは、MSYS2 の mingw32/ 以下から *.a を持ってきて試してみたら動いてしまったわけで…。アレって、SDL 1.x のバージョンは合ってたのだろうか? 不安になってきたので調べてみた。
FreeBASICインストールフォルダ/inc/SDL/*.bi に記述されてる、SDL 1.x の推奨バージョンは以下になっていた。
SDL.bi : SDL-1.2.15 SDL_image.bi : SDL_image-1.2.12 SDL_mixer.bi : SDL_mixer-1.2.12 SDL_net.bi : SDL_net-1.2.8 SDL_ttf.bi : SDL_ttf-2.0.11 SDL_gfx_framerate.bi : SDL_gfx-2.0.26 SDL_gfx_imageFilter.bi : SDL_gfx-2.0.26 SDL_gfx_primitives.bi : SDL_gfx-2.0.26 SDL_gfx_primitives_font.bi : SDL_gfx-2.0.26 SDL_gfx_rotozoom.bi : SDL_gfx-2.0.26
MSYS2側のパッケージのバージョンは以下になっていた。(x:/msys64/var/cache/pacman/pkg/mingw-w64-i686-SDL*)
mingw-w64-i686-SDL-1.2.15+r419+gef3a6c05-1-any.pkg.tar.zst mingw-w64-i686-SDL_image-1.2.12-8-any.pkg.tar.zst mingw-w64-i686-SDL_mixer-1.2.12-9-any.pkg.tar.zst mingw-w64-i686-SDL_net-1.2.8-3-any.pkg.tar.zst mingw-w64-i686-SDL_ttf-2.0.11-6-any.pkg.tar.zst mingw-w64-i686-SDL_gfx-2.0.27-1-any.pkg.tar.zst
SDL_gfx 以外は、たまたまバージョンが一致していた模様。 *1 だからすんなり動いてしまったのかもしれないな…。
*1: SDL 1.x の最終バージョンだろうから、一致するのは当たり前だろうか…。
[ ツッコむ ]
以上です。