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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1116
きのよーBASS_FX.dllでエフェクトをつけたいのですが…6未解決


きのよー

リンク

2014/11/16(Sun) 16:15:06|NO.66050

毎度毎度失礼します。
前回はHSPでBASS.dllを呼び出し再生するときに
mp3だけモノラル再生になってしまう問題を質問しました。
そのときは引数が64bitになっていることを考慮してint,intで代用しましたが…

今度はBASS_FX.dllを使ってエフェクトをつけようとした時にエラーが出てきました。
現在はリバーブ(エコー)をつけようと思っています。
そこで、BASS_FXで定義されているリバーブ用の構造体を見た結果、

typedef struct { float fDryMix; float fWetMix; float fFeedback; float fDelay; BOOL bStereo; int lChannel; } BASS_BFX_ECHO4;
となっています。
HSPでは実数型はdoubleしか扱えないので、次のようにしてやってみたのですが

buf=param(1) buf2=BASS_ChannelSetFX(buf,BASS_BFX_ECHO4,0) buf_a(0)=(tofloat(0.999)<<16)|(tofloat(0.999) buf_a(1)=(tofloat(0.7)<<16)|(tofloat(0.5)) buf_a(2)=-1 BASS_FXSetParameters buf2,buf_a ※exint(s1,p1)はs1で記述された文字列を数値式に見立てて演算、p1が1なら実数それ以外なら整数で返す関数 ※param(x)はコンマで区切られたパラメータのような文字列データ、param(1)はhStreamそのまま、param(2〜5)まではそれぞれ数値データが入ってます ※tofloat(x)はhttp://sprocket.babyblue.jp/html/hsp_koneta3.htmを参照のこと
としたとき、
BASS_FXSetParameters buf2,buf_a
を実行した時点でシステムエラーが発生します。
これを
BASS_FXSetParameters buf,buf_a
に変えると、FXのハンドルでは無いためエラーになるのですが
HSPのエラーにはならず、その命令が実行されず処理が続行されます。
…となると問題はbuf_aの構造体になると思うのですが、
1ビットだけ余分なBOOLとか
tofloatでやっつけた実数値とかいろいろ問題がありそうです…。
どのように解決したら良いのでしょう?
もしくは、これはできないのでしょうか…?
ご教授のほどよろしくお願いします。



この記事に返信する


きのよー

リンク

2014/11/16(Sun) 16:16:02|NO.66051

書き直したら不必要な物を消し忘れてました。
exintとparamは関係ないです、無視してください…。



Flat

リンク

2014/11/16(Sun) 16:50:58|NO.66052

float、BOOL、intは全て32bitなので
HSPならdim buf_a,6で各要素に代入すればできるかと。

buf_a = tofloat(0.999), tofloat(0.999), tofloat(0.7), tofloat(0.5), 1, 1
的な感じで。



きのよー

リンク

2014/11/16(Sun) 23:10:10|NO.66072

>>Flat様
ご回答有難うございます。
質問して暫くしてからfloat型が32bitだということを思い出しました…;
また、BOOL型がHSPでは32bitであることも、失念していました。ありがとうございます。

また、システムエラーが起こる原因については、第二パラメータの種類がsptrになっていたためで、
回避にはvarを用いたことでシステムエラーになりませんでした。
…しかしリバーブがつきません。どうしたらよいでしょうか…。
引き続き、ご教授をお願いしたいと思います。



Flat

リンク

2014/11/16(Sun) 23:36:32|NO.66073

bStereoやlChannelの指定は合っていますか?
(残念ながらこれ以上は当方では確認できません。)



Flat

リンク

2014/11/16(Sun) 23:39:59|NO.66074

返り値やエラーコード(BASS_ErrorGetCodeで取得)も確認すると良いかもしれません。



K-s

リンク

2014/11/22(Sat) 12:33:28|NO.66132

環境にも依るかもしれませんが、自分のPCでは↓のスクリプトでエフェクトが効きました。

#module ;http://sprocket.babyblue.jp/html/hsp_koneta3.htm #defcfunc d2f double d t = d return ((d<0)<<31) | (lpeek(t,4)-0x38000000<<3) * (d!0) | (lpeek(t)>>29&7) #global #uselib "bass.dll" #cfunc BASS_GetVersion "BASS_GetVersion" #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 #func BASS_StreamFree "BASS_StreamFree" int #func BASS_ChannelPlay "BASS_ChannelPlay" int, int #func BASS_FXSetParameters "BASS_FXSetParameters" int, var #cfunc BASS_ChannelSetFX "BASS_ChannelSetFX" int, int, int #uselib "bass_fx.dll" #cfunc BASS_FX_GetVersion "BASS_FX_GetVersion" if (BASS_GetVersion()>>16 != $204) : dialog "bass.dll 2.4 が必要です" : end if (BASS_FX_GetVersion()>>16 != $204) : dialog "bass_fx.dll 2.4 が必要です" : end BASS_Init -1, 44100, 0, hwnd, 0 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, 4) ; loop fx = BASS_ChannelSetFX(h, $10000 + 20, 0) ; BASS_FX_BFX_ECHO4 mes "fx handle: " + fx dim ech, 6 ech = d2f(0.999), d2f(0.999), d2f(0.7), d2f(0.5), 0, -1 BASS_FXSetParameters fx, ech mes "set param: " + stat BASS_ChannelPlay h } return *bye BASS_Free end
関数や定数の定義が合っているか、BASS_FX_GetVersion が初めに実行されているか辺りも見てみてください。
(最初 $10000 + 20 を $10020 と間違えてた…)



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