mieki256's diary



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

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 の時点では、それぞれ以下のバージョンが推奨されているらしい。

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
' 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 の推奨バージョンは以下になっていた。
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 の最終バージョンだろうから、一致するのは当たり前だろうか…。

以上です。

過去ログ表示

Prev - 2024/01 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project