mieki256's diary



2024/01/27() [n年前の日記]

#1 [basic] FreeBASICでwavやoggを鳴らせるFBSoundライブラリを試用

FreeBASICで、wav、mp3、ogg等を鳴らせる FBSound というライブラリがあると知った。

_jayrm/fbsound: A free sound library primarily for games and demos written by D.J. Peters.
_fbsound 1.2 Windows/Linux (sid wav mp3 ogg mod it xm s3m) - freebasic.net
_fbsound 1.1 (dynamic) Windows/Linux 32 and 64-bit (wav mp3 ogg mod it xm s3m) - freebasic.net
_fbsound 1.0 Win/Lin 32/64-bit (wav mp3 ogg mod it xm s3m) - freebasic.net
_Load Sound in Memory (FBSound 1.2) - freebasic.net

以前はライセンスが不明で敬遠されてた気配があるけど、今現在はドキュメント上で、ライセンスについてちゃんと書いてあるように見える。

Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit で試用してみることにした。複数のwavを同時に鳴らせたらいいのだけど、さて。

インストール :

fbsound-1.2.zip を入手して解凍。
  • inc/ にヘッダーファイル .bi が入っている。
  • test/ に動作に必要な .dll ファイル群が入っている。

inc/ の中身は以下。
fbs3d.bi
fbsound_dynamic.bi
fbsound_oop.bi

test/*.dll は以下。
fbsound-32.dll
fbsound-64.dll
fbsound-ds-32.dll
fbsound-ds-64.dll
fbsound-mm-32.dll
fbsound-mm-64.dll

この .bi と .dll を、利用したいプロジェクトフォルダにコピーして、ソースの最初のほうに以下を書いておけば、FBSound が使えるようになる。
#include "fbsound_dynamic.bi"

あるいは、.bi ファイルを、FreeBASICインストールフォルダ/inc/ にコピーしておいてもいい。ただ、生成した .exe と同じ場所に .dll群も置いておかないと動作しない。

動作確認 :

test/ 以下にサンプルファイル群が入っているので、各 .bas について、fbc xxxx.bas と打ってコンパイルすれば動作確認できる。

ogg (or wav) を鳴らすサンプルを書いてみた。

_waveplay.bas
' wave play sample with FBSound

#include "fbsound_dynamic.bi"

chdir(exepath())

' FBSound initialize
If fbs_Init() = True Then
    Print "fbs_Init() success."
Else
    Print "Error : fbs_Init() failure"
    Print FBS_Get_PlugError()
    Beep
    sleep
    end 1
End If

dim as integer hWave1, hWave2, hWave3

#ifdef 0

' load wav file
Print "load wav file"
fbs_Load_WAVFile("1.wav", @hWave1)
fbs_Load_WAVFile("2.wav", @hWave2)
fbs_Load_WAVFile("3.wav", @hWave3)

#Else

' load ogg file
Print "load ogg file"
fbs_Load_OGGFile("1.ogg", @hWave1)
fbs_Load_OGGFile("2.ogg", @hWave2)
fbs_Load_OGGFile("3.ogg", @hWave3)

#endif

Print "Play : 1 - 3 key"
Print "Exit : ESC key"

Dim As Boolean running = True
Dim As String k

While running
    Dim As String k = inkey$
    Select Case k
    Case "1": fbs_Play_Wave(hWave1)
    Case "2": fbs_Play_Wave(hWave2)
    Case "3": fbs_Play_Wave(hWave3)
    Case Chr(27): running = False
    End Select
    
    sleep 100
Wend

Print "Exit."

fbc waveplay.bas と打ってコンパイル。waveplay.exe が生成される。

_1.ogg_2.ogg_3.ogg を同じフォルダに入れてから実行すれば、1, 2, 3キーを押すことで ogg を再生できる。

複数のoggを同時に再生することができているので、鳴らすだけでOK系のゲームSEなら使えそうかなと…。

modも鳴らせる :

.wav 以外に、.ogg、.mp3 も鳴らせるけれど、.mod, .xm, .s3m, .it 等、Amiga発祥のデモシーンで使われていた音楽ファイルフォーマットも利用できる。

_MOD (ファイルフォーマット) - Wikipedia

#2 [basic] FreeBASIC + FBWindowsSoundWav.basを試用

FreeBASIC でwav再生するためのライブラリについて調べてる。

以下の投稿ページの中で、Windows と Linux の両方でwav再生するための関数名を同じにしたライブラリが紹介されてた。

_Play Sound WAV (Windows [32-bit], [64-bit], Linux [32-bit], [64-bit]) - freebasic.net

再生の実処理は、Windows、もしくは Linuxに特化した機能を呼び出して実現してるらしい。関数名が同じになるだけでも便利そうだなと思えてきたので試用してみることにした。環境は Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit。

結論を先に書いておく。一応wavは鳴ったけど、ゲーム制作用には使えない印象。

インストール :

前述の掲示板から、ソースコードをコピペして、ローカルで .bi や .bas として保存する。
  • Linux の場合は、alsa.bi と FBLinuxSoundWav.bas をプロジェクトフォルダにコピー。
  • Windwos の場合は、FBWindowsSoundWav.bas をプロジェクトフォルダにコピー。

サンプルは以下。今回は 1.wav というファイルを読み込んで再生する。

_sample.bas
#include "FBWindowsSoundWav.bas"

Dim fb_Wav As FbWAV Ptr

LoadWav("1.wav", fb_Wav)
PlayWav(fb_Wav)

Do
    Var key = Inkey
    Select Case key
    Case "s" : StopWav(fb_Wav)
    Case "p" : PlayWav(fb_Wav)
    Case "q" : Exit Do
    Case " "
        PauseWAV(fb_Wav)
        Sleep(100)
    End Select

    Var sp = StatusPlay(fb_Wav)
    Sleep(100)

    Cls
    Select Case sp
    Case 1 : Print "Play"
    Case 0 : Print "Stop"
    Case 2 : Print "Pause"
    End Select

    Print "Length=" & GetLengthSeconds(fb_Wav) & " seconds"
    Print "s)top / p)lay / q)uit / SPACE : Pause"
Loop

FreeWav(fb_Wav)

fbc sample.bas でコンパイル。sample.exe を実行。pキーで再生。sキーで停止。qキーで終了。

たしかに wav が鳴ってくれたけれど…。前の再生がまだ終わってない状態で連続して鳴らすと、前の再生をブツ切りして、次の音が最初から再生されてしまう。同時に並行して鳴ってほしいのだけどなあ…。

また、ブツ切りされる際に、ノイズもブチブチと入りまくる。

ゲーム制作に使えるライブラリでは無さそうだなと…。

#3 [basic] FreeBASIC + FMODを試用

FreeBASIC から、FMOD (fmod.dll) なるサウンド用ライブラリを利用することができるらしい。

_FMOD
_FMOD - FreeBASIC Wiki Manual | FBWiki
_FreeBASIC Compiler / Feature Requests / #185 FMOD Ex headers for freebasic...
_TUTORIAL: Using FMOD for In-Game Music - Page 2 - freebasic.net

FMODは、商用利用時はライセンス料を払わないといけないサウンドライブラリ。ただ、フリーソフトに使う分には無料で利用しても良いことになっているらしい。あるいは、売り上げが一定額に満たない場合も無料で利用できる、と書いてあるように見えた。昔の Unity みたいな感じだろうか。 *1

気になったので、Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit で試用してみた。

インストール :

現行版のバイナリはユーザ登録しないと入手できないように見えたのだけど、おそらく昔の版なら、別の経路で入手できそう。例えば、以下のページから、UsingFMOD_A_Tutorial.zip もしくは、fmod_example_program.zip を入手する。中に fmod.dll も入ってる。

_TUTORIAL: Using FMOD for In-Game Music - Page 2 - freebasic.net
_QB Express: Issue #26

fmod_example_program.zip を解凍すると、サンプルファイル fmod_example.bas と fmod.dll が入ってる。ちなみに、ヘッダーファイル、fmod.bi は、FreeBASIC 1.10.1 に最初から入っている。

動作確認 :

fbc fmod_example.bas でコンパイル。

ただ、警告が結構出る。もしかすると fmod.dll のバージョンが合ってないのだろうか。しかし、FreeBASIC の fmod.bi には FMOD 3.75 と記述されていて、今回入手できた fmod.dll のバージョンも 3.7.5。バージョンは合ってそうな気がする…。FreeBASIC のバージョンアップに伴う仕様変更に、fmod.bi が追従していないだけだろうか? 随分古いライブラリのようだし。

さておき。一応、wav は鳴ってくれた。別々の音が同時に鳴っているようにも聞こえる。

しかし、一部の wav がループ再生されてしまう…。全ての wav がループ再生されるわけではなくて、特定のwavだけがループ再生になる。何故。ワンショット系のSEにするにはどうしたらいいのか…。

もしかして wav ファイルの中にループ再生するかしないかの情報を盛り込めることができて、たまたま何かの拍子に、その wav にだけ、その情報が入っちゃってるとか…?

ループ再生されてしまう wav を SoundEngine Free 5.23 で開いて、そのまま保存し直してみた。保存し直した wav を使ったらループ再生されない。どういうことだろう…。分からんなあ…。やはり wav にループ再生を指示する何かしらの情報を埋め込めるのだろうか…。

*1: 今の Unity はどういう価格体系になったのかよく知らないので、「昔の」と言っておきます…。

#4 [basic] FreeBASIC + BASSを試用

FreeBASIC から BASSなるサウンド用ライブラリを利用することができるらしい。

_Un4seen Developments - BASS
_Un4seen Developments - BASSMOD

BASSは、非営利目的の場合は無料で利用できる。商用利用の場合はライセンス料を払わないといけない。

たしかこのあたり、DXRuby を触ってた頃も、「作ったゲームを同人ソフトとして販売するだけでも一定額を払わないといけないのはどうなのか。そのゲームが売れるのか売れないのか、全然分からないのに」みたいな話があって敬遠されていた記憶が…。

でもまあ、フリーソフトを作る分には無料で利用できるので、一応試用。環境は Windows10 x64 22H2 + FreeBASIC 1.10.1 32bit。

インストール :

以下のファイルを入手。
bass24.zip
bassmod20.zip

後者は、modファイルを再生するために必要。wav や mp3 を鳴らすだけなら要らない、と思う。たぶん。

それぞれ解凍して、中に入っている .dll (bass.dll, BASSMOD.dll) をプロジェクトフォルダにコピーしておく。

ちなみに…。
  • bass24.zip : 32bit版と64bit版の dll が入っている。
  • bassmod20.zip : 32bit版の dll しか入ってない。

動作確認 :

FreeBASICインストールフォルダ/examples/sound/BASS/ の中にサンプルファイルがある。

demo.bas と small.bas はコンパイルできて、ogg と mo3(oggに対応させたmodらしい)は再生できた。

しかし、mod.bas がコンパイルできない。以下のエラーを出す。
> fbc mod.bas
mod.bas(15) error 58: Type mismatch, at parameter 2 of BASSMOD_MUSICLOAD() in 'If (BASSMOD_MusicLoad(FALSE, sound_file, 0, 0, BASS_MUSIC_LOOP) = False) Then'

色々調べてみたけれど、FreeBASICインストールフォルダ/inc/bassmod.bi の、以下の行を変更したら、コンパイルできるようになった。file のタイプを const zstring ptr に変更している。
declare function BASSMOD_MusicLoad(byval mem as BOOL, byval file as any ptr, byval offset as DWORD, byval length as DWORD, byval flags as DWORD) as BOOL

' ↓

declare function BASSMOD_MusicLoad(byval mem as BOOL, byval file as const zstring ptr, byval offset as DWORD, byval length as DWORD, byval flags as DWORD) as BOOL

しかし、コンパイルはできたものの、生成された mod.exe が、Windowsセキュリティから PUA:Win32/Keygen として警告されてしまう。mod.exe を、オンラインのウイルススキャンサイトに渡してスキャンしてみると問題無しと出てくるので、単に誤検出じゃないのかと思うけど…。

どうせ誤検出だろう、誤検出に違いないと信じて(?)、mod.exe を実行してみたところ、一応 mod が鳴ったことは鳴ったけれど…。ウイルス扱いされるのでは困るよなあ…。生成物を配布できないやん…。

いやまあ、BASSMOD は使わず、BASSだけ使う分には、そういう問題に遭遇しないのかもしれんけど。今の時代に、あえてゲームのBGMとしてmod/s3m/xm/itを鳴らしたい人も居ないだろうから、それほど実害は無さそうな気も…。BGMの類は、えてして ogg か mp3 にして用意することが多いだろうし…。

#5 [basic] FreeBASIC + PortAudioを試用してみたかった

FreeBASICから PortAudio なるサウンドライブラリを利用することができるという話も見かけたのでそのあたりを試してみた。環境は Windows10 x64 22H2 + FreBASIC 1.10.1 32bit。

結論を先に書くけど、PortAudio についての知識を持ってる人じゃないと使えない気配がした。

PortAudioをMinGWでビルド :

PortAudio を使うためには、ライブラリファイル *.a や、ランタイム(?) *.dll が必要になるのだろう。MinGW(gcc 6.3.0) を使ってビルドできないか試した。

_PortAudio - an Open-Source Cross-Platform Audio API
_Notes_about_building_PortAudio_with_MinGW ・ PortAudio/portaudio Wiki
_PortAudio: Building Portaudio for Windows with MinGW

FreeBASICに同梱されている portaudio.bi を眺めたところ、v19_20140130 を対象にしていた。同じバージョンを入手してビルドしたほうが良さそうだな…。

PortAudio のサイトから、pa_stable_v19_20140130.tgz を入手して解凍。

MinGW/MSYS が使える状態にして、portaudio/ の中に入って、bash を起動。configure を利用する関係で、bash上でしか作業できない。

以下を打ったところ、色々なファイルが生成された。
./configure
make

include/ にヘッダファイル、*.h がある。これはビルドする前から元々入っている。

lib/ 以下に、色々なファイルが生成された。更に、lib/.libs/ に以下のファイルが入っている。
libportaudio.dll.a
libportaudio.la
libportaudio-2.dll
  • *.a や *.la が、コンパイル時に必要になるライブラリファイル。
  • *.dll が、実行時に必要になるDLLファイル。

FreeBASICで使用 :

FreeBASIC 1.10.1 32bitで使えそうか試してみる。libportaudio.dll.a, libportaudio.la を、freeBASICインストールフォルダ/lib/win??/ にコピー。

加えて、libportaudio-2.dll をプロジェクトフォルダにコピーするのだけど、これだけでは動かなかった。libmingwex-0.dll とやらも必要になった。MinGWインストールフォルダ/bin/ から探して持ってくる。

ただ、サンプルファイルが皆無なので、使い方が全く分からない…。

別版バイナリを試用 :

FreeBASICの掲示板で、ビルド済みの別版 PortAudio バイナリを配布している事例を見かけた。

以下の投稿ページで、FreeBASIC用にビルドした PortAudio のバイナリが配布されている。FreeBASICの配布パッケージに入ってるものとは異なる、別の版らしい。

_libportaudio-2 dynamic windows linux 32/64-bit - freebasic.net

portaudio.zip を入手して解凍すると、以下のファイルが入っていた。
.
|-- lib
|   |-- lin32                   (Linux 32bit)
|   |   `-- libportaudio-2.so
|   |-- lin64                   (Linux 64bit)
|   |   `-- libportaudio-2.so
|   |-- win32                   (Windows 32bit)
|   |   `-- libportaudio-2.dll
|   `-- win64                   (Windows 64bit)
|       `-- libportaudio-2.dll
|-- enumerate.bas               (sample)
|-- pa_dynamic.bi               (FreeBASIC Header file)
`-- streamcallback.bas          (sample)

5 directories, 7 files

見た感じ、以下のようなファイルなのだろう。
  • Windows 32bit, 64bit用の libportaudio-2.dll
  • Linux 32bit, 64bit用の libportaudio-2.so
  • FreeBASIC用のヘッダーファイル pa_dynamic.bi
  • サンプルファイル enumerate.bas, streamcallback.bas

Wndows 32bit用の libportaudio-2.dll をサンプルファイルと同じ場所にコピーして、fbc streamcallback.bas でコンパイル。streamcallback.exe を実行したらサイン波が鳴ってくれた。

fbc enumerate.bas で enumerate.exe を生成して実行したところ、利用できるデバイスの一覧が表示された。
PortAudio V19-devel (built May 13 2016 04:39:45)

(0) input  Microsoft Sound Mapper - Input
(1) input  マイク (Realtek(R) Audio)
(2) input  ステレオ ミキサー (Realtek(R) A
(3) output Microsoft Sound Mapper - Output
(4) output スピーカー (Realtek(R) Audio)
(5) output Realtek Digital Output (Realtek

これってつまり、PortAudio を使って音を鳴らしたい時は、どれかしらのデバイスを明示的に指定しないと鳴らせないということになるのだろうか…? なんだか面倒臭いな…。

更に別の版を試用 :

上記の版とはまた別の版も見かけた。以下のやり取りの下のほうで、fbPortAudio.zip というファイルが配布されている。

_C/C++ Libraries - freebasic.net

fbPortAudio.zip を入手して解凍したら、*.a, *.dll, *.bi が入っていた。

以下のサンプルファイルをコンパイルしたら、情報を表示したり、サイン波が鳴った。
patest_devs.bas
patest_sine.bas
patest_version.bas

状況が混乱している気がする :

FreeBASIC + PortAudio は、状況的によく分からないことになっている気がする…。

公式の portaudio.bi とは別の版が複数あるようで、一応それらは、付属している .dll を一緒に利用する限り、それらしく動作する。

しかし、公式の portaudio.bi は、使い方が分からない。他の版のサンプルを流用してコンパイルしようとすると、各関数に与える変数のタイプが異なっているようで、エラーが出てコンパイルできない。

加えて、サンプルソースを見ても、実際に音を出すまでに細々とした各種設定をしないといけないようで、何をしているのかさっぱり分からない。

とにかく、公式版に同梱されている portaudio.bi を利用したサンプルが一切存在していない点が非常に困る…。自分でビルドした *.a や *.dll が、ちゃんとビルドできているのか、簡単な動作確認すらできない…。

この、PortAudio、自分の知識レベルではちょっと手に負えないライブラリのようだなと…。

以上、1 日分です。

過去ログ表示

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