トップページ > 記事閲覧
wavファイルのループ情報
名前:BayLeaf 日時: 2017/10/10 04:35

いつもお世話になっております。 バージョンの更新状況で > 3.18d <機能追加・改良等の項目> > >  wavファイルの smplチャンクのループ情報に対応。 と書かれていたのでループ情報を入れたwavファイルで試したのですが、 ループ情報が反映されませんでした。 Windows限定というわけではないですよね? なお、ループ情報は「wavosaur」というフリーソフトを使用して取り入れました。 下記は要望なのですが、 1. ループ情報のサンプル数(Start - End)を取得する関数 ループ個所から再生(SetCurrentPositionSoundMem()と併用)することが簡単になるので是非ほしいです。 2. ループ情報の使用有無を取得する関数 ループ情報が含まれているかどうか(A)と、含まれていた場合に使用するか否か(B)を指定したいなと考えています。 Aはループ情報があるかどうかが分かればファイルごとの検査がしやすいです。 (Aは1.の関数の引数が-1で返って来た場合という処理で構いません) Bはサウンドテストで流れるフルバージョン用とメインで流れる短いバージョン用を1つのゲーム内で実装したいと思っているためです。 Bに関しては同じ曲のサウンドハンドルが複数個あるとメモリを多く使用してしまうので消費を少なくしたいという狙いがあります。 関数があれば自分でループ情報の検査ができるので、忙しいと思いますがよろしくお願いします。
メンテ

Page: 1 |

Re: wavファイルのループ情報 ( No.1 )
名前:管理人 日時:2017/10/11 01:29

> と書かれていたのでループ情報を入れたwavファイルで試したのですが、 > ループ情報が反映されませんでした。 > Windows限定というわけではないですよね? はい、Android でも機能するはずです ( ただ、本日は時間が無く最新バージョンでもループ情報付き wavファイルを正常に読み込むことができるかを  試せていません、すみません ) > なお、ループ情報は「wavosaur」というフリーソフトを使用して取り入れました。 私もこちらのサイトを参考に wavファイルにループポイントを設定しました <Tsumiki Tech Times  イントロ・アウトロ付き ループ効果音・BGMを設定する> http://tsumikiseisaku.com/blog/how-to-make-loop-sound/ よろしければループ情報の付け方が同じかご確認ください m(_ _;m > 1. ループ情報のサンプル数(Start - End)を取得する関数 > ループ個所から再生(SetCurrentPositionSoundMem()と併用)することが簡単になるので是非ほしいです。 リファレンスには載っていませんが、GetLoopAreaSamplePosSoundMem という関数で取得することができます // サウンドハンドルにループ範囲を取得する(サンプル単位) int GetLoopAreaSamplePosSoundMem( int *LoopStartSamplePosition, int *LoopEndSamplePosition, int SoundHandle ) ; > 含まれていた場合に使用するか否か(B)を指定したいなと考えています。 すみません、ループ情報が含まれているサウンドハンドルをループ無しで再生することは現在できず、 できるようにするためにはDXライブラリ内部の処理をかなり変更しなければならないので、 申し訳ありませんがすぐに対応することはできません 加えてループ情報が含まれる wavファイルを読み込んだ場合は強制的に『ループ情報有りサウンドハンドル』に なってしまうので、一つの wavファイルを『ループ情報有りサウンドハンドル』と『ループ情報無しサウンドハンドル』の 二つに読み分けることもできません こちらについては『サウンドファイルに含まれるループ情報を無視して読み込むかどうかを設定する関数』を 追加することで容易に対応できますので、申し訳ありませんがすぐにできる対応としてはこちらの関数を 追加することのみとなります m(_ _;m ( なので『ループ情報有りwavファイル』『ループ情報無しwavファイル』の二つのファイルを用意する必要は  なくなりますが、サウンドハンドルは二つ必要になります )
メンテ
Re: wavファイルのループ情報 ( No.2 )
名前:BayLeaf 日時:2017/10/11 02:47

> <Tsumiki Tech Times  イントロ・アウトロ付き ループ効果音・BGMを設定する> > > よろしければループ情報の付け方が同じかご確認ください m(_ _;m ループ情報の付け方は上記のサイトと同じでした。 > リファレンスには載っていませんが、GetLoopAreaSamplePosSoundMem という関数で取得することができます ありがとうございます。 こちらの関数を使って値を取得したところ、該当音源のループ情報が0で返ってきました(音声もループ無しでした)。 ファイル名の末尾に「_Loop」と書いているので間違えてはいないと思います。 念のため、上記のサイトを見ながらもう一度設定をしてみましたが結果は変わりませんでした。 > すみません、ループ情報が含まれているサウンドハンドルをループ無しで再生することは現在できず、 > できるようにするためにはDXライブラリ内部の処理をかなり変更しなければならないので、 > 申し訳ありませんがすぐに対応することはできません > > 加えてループ情報が含まれる wavファイルを読み込んだ場合は強制的に『ループ情報有りサウンドハンドル』に > なってしまうので、一つの wavファイルを『ループ情報有りサウンドハンドル』と『ループ情報無しサウンドハンドル』の > 二つに読み分けることもできません 難しいのですね。 流石に内部処理まで変更していただくとなると大変になると思うので大丈夫です。 > こちらについては『サウンドファイルに含まれるループ情報を無視して読み込むかどうかを設定する関数』を > 追加することで容易に対応できますので、申し訳ありませんがすぐにできる対応としてはこちらの関数を > 追加することのみとなります m(_ _;m > ( なので『ループ情報有りwavファイル』『ループ情報無しwavファイル』の二つのファイルを用意する必要は >  なくなりますが、サウンドハンドルは二つ必要になります ) ループ情報を無視することは容易なのですね。 では、その関数で対応できるのであればお願いします。
メンテ
Re: wavファイルのループ情報 ( No.3 )
名前:管理人 日時:2017/10/12 00:13

Android版で wavosaur を使用してループ範囲を設定した wavファイルを読み込んでみましたが、 正常にループ範囲を読み込むことができました 最近ループ範囲関係の処理に関して手を加えた記憶はありませんが、 よろしければこちらの最新版をお試しになってみてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibAndroidTest_ARM.exe // Android版 ARM用 https://dxlib.xsrv.jp/temp/DxLibAndroidTest_x86.exe // Android版 x86用 因みにテストで使用したプログラムは以下の通りです #include "DxLib.h" int android_main( void ) { int SoundHandle ; int LoopStart, LoopEnd ; SetBackgroundColor( 128,128,128 ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // wavファイルの読み込み SoundHandle = LoadSoundMem( "test_loop.wav" ) ; // ループ範囲の取得 GetLoopAreaSamplePosSoundMem( &LoopStart, &LoopEnd, SoundHandle ) ; // 再生開始 PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ; SetDrawScreen( DX_SCREEN_BACK ) ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; // 画面にループ範囲を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LoopStart:%d LoopEnd:%d", LoopStart, LoopEnd ) ; ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } > ループ情報を無視することは容易なのですね。 > では、その関数で対応できるのであればお願いします。 上記の最新版では以下の関数が追加されています // LoadSoundMem などで読み込むサウンドデータにループ範囲情報があっても無視するかどうかを設定する // IgnoreFlag TRUE:無視する FALSE:無視しない( デフォルト ) int SetCreateSoundIgnoreLoopAreaInfo( int IgnoreFlag ) ; LoadSoundMem などで wavファイルを読み込む前に SetCreateSoundIgnoreLoopAreaInfo( TRUE ) ; を 実行しておくとループ範囲の情報が wavファイルに含まれていても無視されるようになります よろしければお試しください m(_ _)m
メンテ
Re: wavファイルのループ情報 ( No.4 )
名前:BayLeaf 日時:2017/10/12 02:14

ループ情報が読めない原因がわかりました。 どうやら以前質問させていただいた際に使用していた ソフトサウンドが原因のようでした。 再生自体には別のハンドルを使用していたのですが、一度でもLoadSoundMemFromSoftSound()を使用して ソフトサウンドハンドルからそのハンドルに代入するとループ情報が消されるようでした。 ご確認よろしくお願いします。 もし、ソフトハンドル関連でループ情報を対応させていないのであれば対応させてほしいところです。 なお、管理人さんのプログラムでは正常に動いたことを確認しました。
メンテ
Re: wavファイルのループ情報 ( No.5 )
名前:管理人 日時:2017/10/14 01:31

お察しの通りソフトサウンドハンドルはループ情報に対応していませんので、ソフトサウンドとして 読み込んだ後 LoadSoundMemFromSoftSound でサウンドハンドルにした場合はループ情報はありません > もし、ソフトハンドル関連でループ情報を対応させていないのであれば対応させてほしいところです。 すみません、現在優先度の高い作業が予定より非常に遅れているので、必須ではない機能の実装は なるべく避けたいと考えています 直接 LoadSoundMem で wavファイルを読み込むのでは何か不都合があるのでしょうか?
メンテ
Re: wavファイルのループ情報 ( No.6 )
名前:BayLeaf(解決) 日時:2017/10/14 05:30

> お察しの通りソフトサウンドハンドルはループ情報に対応していませんので、ソフトサウンドとして > 読み込んだ後 LoadSoundMemFromSoftSound でサウンドハンドルにした場合はループ情報はありません 了解です。 「特定の周波数の音量取得」でお聞きした際はLoadSoundMemFromSoftSound()とLoadSoundMem()が 同じであると書かれていたのでそのまま使用していました。 この時はまだ以前のバージョンなので当然と言えば当然ですね。 > すみません、現在優先度の高い作業が予定より非常に遅れているので、必須ではない機能の実装は > なるべく避けたいと考えています そうなのですね。私としては急ではないですので必須の作業を優先して構いません。 > 直接 LoadSoundMem で wavファイルを読み込むのでは何か不都合があるのでしょうか? 以前、ご相談させていただいた「特定の周波数の音量取得」のSoftSoundを使用して FFT周波数分布の描写をしているので、別途LoadSoundMem()で読み込んだ音源を使用すると 2つの変数のFFT周波数分布が一致しなくなる可能性があるかなと思いましたが、 よく考えてみたらLoadSounndMem()の音源を基準にしているので 今回の場合はLoadSoundMem()にしたプログラムに書き直してみて大丈夫そうでした。 ただ、SoftSoundを(ソフトウエアサウンドプレイヤーを使用して)再生した場合、 ループがなくなるのでループありとの同時再生をした際に正常にできないもしくは処理の手間がかかるのではと思いました。 とはいえ、ひとまずループ情報については解決しました。 迅速な返信ありがとうございました。 どうしてもSoftSoundでループ情報が必要になったらまたここに書きに来ます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存