HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0723
きのよーbass.dll v2.4.1でのステレオ再生10解決


きのよー

リンク

2014/7/23(Wed) 15:16:46|NO.63034

とある事情でbass.dllを用いてサウンドを再生したいのですが、
bass.dll v2.4.1を使うとmp3が必ずモノラルになってしまいます。
wav音声はステレオになったのですが、モノラルに設定しているわけでもないしよくわかりません。
つい昨日リファレンスを読み始めてまだ全く理解できていませんが、StreamCreateFileでmp3を読み込んでいます。
Kpenさんのサイトにあったbass.dll 2.3.0.1だとステレオになるのですが、
2.4.1での設定方法がわかりません。誰か教えていただけないでしょうか。
よろしくお願いします。



この記事に返信する


Tetr@pod

リンク

2014/7/23(Wed) 16:29:23|NO.63035

bass24.zipを解凍するとmp3-freeディレクトリができるかと思います。
mp3-freeディレクトリ内のbass.dllを使用していますか?



きのよー

リンク

2014/7/23(Wed) 16:35:18|NO.63036

Tetr@podさん、返信ありがとうございます。

>>mp3-freeディレクトリ内のbass.dllを使用していますか?
mp3-free内のbass.dllを使ってみましたが、結果は変わらずmp3だけモノラルで流れてきます。
x64の中の物はDLLの呼び出しエラーになってしまい使えませんでした。



きのよー

リンク

2014/7/23(Wed) 16:47:00|NO.63038

bass関連のソースだけ抜き出しました。
Kpanさん(先ほどは間違えてしまいました申し訳ありません)のサイトにあったソースや、bass.hを参考にしています。


#include "system/library/mod_pngtomask.hsp" //PNG画像の透過情報を見るため。mod_binaryもそのまま使用しています。 #include "kernel32.as" #include "user32.as" #include "gdi32.as" #uselib "bass.dll" #func BASS_Init "BASS_Init" int, int, int ,int, int #cfunc BASS_GetVersion "BASS_GetVersion" #func BASS_GetCPU "BASS_GetCPU" #func BASS_Pause "BASS_Pause" #func BASS_Start "BASS_Start" #cfunc BASS_GetVolume "BASS_GetVolume" #func BASS_SetVolume "BASS_SetVolume" int #func BASS_Free "BASS_Free" #func BASS_SetConfig "BASS_SetConfig" sptr, int #func BASS_Apply3D "BASS_Apply3D" #cfunc BASS_StreamCreateFile "BASS_StreamCreateFile" int, sptr, int, int, int #func BASS_StreamFree "BASS_StreamFree" int #cfunc BASS_SampleLoad "BASS_SampleLoad" int, sptr, int, int, int, int #cfunc BASS_SampleGetChannel "BASS_SampleGetChannel" int, int #func BASS_SampleStop "BASS_SampleStop" int #func BASS_SampleFree "BASS_SampleFree" int #func BASS_ChannelPlay "BASS_ChannelPlay" int, int #func BASS_ChannelPause "BASS_ChannelPause" int #func BASS_ChannelStop "BASS_ChannelStop" int #func BASS_ChannelSetAttribute "BASS_ChannelSetAttribute" int, int, int, int #func BASS_ChannelGetLength "BASS_ChannelGetLength" int #func BASS_ChannelBytes2Seconds "BASS_ChannelBytes2Seconds" int, double #func BASS_ChannelIsActive "BASS_ChannelIsActive" int #include "system/library/bass.hsp" //bass.hの#defineだけを抜き出したものです。 exist "bass.dll" if strsize = -1 : dialog "bass.dllが見つかりません。", 1, "エラー" : end BASS_Init -1, 44100, 0, hwnd if stat != 1 : dialog "BASSの初期化に失敗しました。", 1, "エラー" : end onexit goto *allexit /* BASS_ver=BASS_GetVersion() dialog "BASS v"+peek(BASS_ver,3)+"."+peek(BASS_ver,2)+"."+peek(BASS_ver,1)+"."+peek(BASS_ver,0) */ buf=0 //読み込み時。sbufにファイルのアドレス、bufにオプションが指定してあります。また、読み込み毎にsndcntは1ずつ増えていきます。 sndlist(sndcnt) = BASS_StreamCreateFile (0, sbuf, 0, 0, buf) //再生時。bufにはsndlist(通し番号)すなわち登録時のIDが入っています。 buf=sndlist(sndcnt) BASS_ChannelPlay buf stop //便宜上 *allexit BASS_Free end




Tetr@pod

リンク

2014/7/23(Wed) 22:49:56|NO.63055

スイマセン。どうもこちらの環境に不具合があるのか、mp3はおろか
wavファイルまで再生できない状況です。

取り敢えずエンコードを変えた5つのステレオオーディオファイルを
アップロードしておきましたので、これらのファイルでステレオ再生
できるか確認してみてください。
http://fast-uploader.com/file/6961678818432/
パスワードはstereoです。
音声は左→右→両方の順に流れます。



きのよー

リンク

2014/7/23(Wed) 23:13:11|NO.63059

Tetr@podさん、また回答をありがとうございます。

>取り敢えずエンコードを変えた5つのステレオオーディオファイルを
>アップロードしておきましたので、これらのファイルでステレオ再生
>できるか確認してみてください。
ダウンロードをして確認してみました。
通常のbass.dll、mp3-free版のどちらも試しましたが、両方ともmp3がすべてモノラル再生でした。
wavファイルはちゃんと、左→右→両方の順番に音声が再生されました。
>どうもこちらの環境に不具合があるのか
bass.dllを使ってもかなり環境に左右されてしまうということなのでしょうかね……?

また、oggファイルはステレオ再生されました。
パラメータをつけていないはずなのにループ再生されていたりしていて、とても挙動不審……。
おとなしくKpanさんのサンプルに付属していたbass.dll v2.3.0.1を使ったほうがいいのでしょうか?



Tetr@pod

リンク

2014/7/23(Wed) 23:36:06|NO.63060

別のパソコンを使って動作確認をしてみました。
確かにmp3のみモノラルになりますね。
ついでに、勝手にループ再生もしてくれちゃいました。

ただ、なぜかはわかりませんが
http://blog.ume108.mobi/?p=1942
のプログラムでは正常に再生されました。

ひとまず、特にこだわりがなければ古いバージョンの方を
使ったほうが良いか思います



K-s

リンク

2014/7/24(Thu) 13:04:18|NO.63072

bass 2.3 → 2.4 でいくつかの関数の引数や返り値が64bitになっているのでそのせいだと思います。
BASS_StreamCreateFile の 3,4番目の引数が QWORD(64bit) です。
HSPで登録するときに int を 2つ続けるか、double でいけると思います。

; bass 2.4 #uselib "bass.dll" #func BASS_Init "BASS_Init" int, int, int ,int, int #func BASS_Free "BASS_Free" #cfunc BASS_StreamCreateFile "BASS_StreamCreateFile" int, sptr, int,int, int,int, int ;#cfunc BASS_StreamCreateFile "BASS_StreamCreateFile" int, sptr, double, double, int #func BASS_StreamFree "BASS_StreamFree" int #func BASS_ChannelPlay "BASS_ChannelPlay" int, int BASS_Init -1, 44100, 0, hwnd, 0 objsize 160 chkbox "mono (mp1/2/3 only)", mn chkbox "loop", lp button gosub "Load", *load onexit goto *bye stop *load dialog "", 16 if (stat) { if (h) { BASS_StreamFree h } h = BASS_StreamCreateFile(0, refstr, 0,0, 0,0, mn*2 + lp*4) ; h = BASS_StreamCreateFile(0, refstr, 0, 0, mn*2 + lp*4) BASS_ChannelPlay h } return *bye BASS_Free end
ただHSPから64bitの引数に渡すときはうまく変換しないといけないかもしれません…



きのよー

リンク

2014/7/24(Thu) 23:13:08|NO.63081

Tetr@pod様、K-s様、ご回答有難うございます。

Tetr@pod様
>ひとまず、特にこだわりがなければ古いバージョンの方を
>使ったほうが良いか思います
そうですね。バージョンが違ってヘルプリファレンスがないのでできるだけ最新バージョンを使いたかったのですが
やむを得ない時にはしかたのないことですね。

K-s様
>bass 2.3 → 2.4 でいくつかの関数の引数や返り値が64bitになっているのでそのせいだと思います。
なるほど、bass 2.3の仕様を知らないのでよくわかりませんが、確かに2.4のリファレンスにはQWORDと書いてありました。
QWORDのところをint二連続にしたところ、mp3も正常にステレオ再生され、ループもなくなりました。

K-s様のご指摘通り、引数のビット数を直したところちゃんと動いたので、これから注意したいと思います。
皆様ご回答本当にありがとうございました。

ところで余談ですが、命令の引数は連続して投げられるんですね。
そうでないと、int,int でQWORDの代用はできませんよね……



check

リンク

2014/7/25(Fri) 00:47:03|NO.63083

>命令の引数は連続して投げられるんですね。
連続で投げられるというか、無理やり動かしているに過ぎない。
□を1バイト(8ビット)とすると、おそらく以下のようになっていると思われる。

intは4バイトなので、使用するメモリの領域は□□□□となる。
QWORDは8バイトなので必要なメモリの領域はintの2倍要するので□が8つ並ぶことになる。
int a, int bと引数に渡すと、おそらく□□□□(b)□□□□(a)となるはず(リトルエンディアンの場合)
つまり、上位4バイトがb、下位4バイトがaと渡されて1つの数字として扱われていると考えられる。



きのよー

リンク

2014/7/25(Fri) 22:28:18|NO.63098

check様
>int a, int bと引数に渡すと、おそらく□□□□(b)□□□□(a)となるはず(リトルエンディアンの場合)
リトルエンディアンとは……初めて聞きました。
なんと、逆向きになって渡されるのですね。全く知りませんでした。
とはいえ確かにメモリ上の別々の位置に各パラメータを分散して入れるわけがないのですから、
連続して確保すれば無理やりでも動作できるのですね。
解決してからも追加の情報を、どうもありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.