DXライブラリの音利用関数について
DXライブラリの音利用関数について
PlaySoundMem(ファイル名, DX_PLAYTYPE_LOOP);
を利用しています。
用意しているのはMP3なのですが、ループの折り返しでどうしても一瞬無音が入ります。
MP3のBGMの先頭か最後に無音がないようにサウンド編集ツールでシッカリと確認して
無音部分を削除しているつもりです。
ですが、PlaySoundMem(ファイル名, DX_PLAYTYPE_LOOP);でループすると
明らかに繋がって聞こえず、一瞬無音が入ってからの頭出しになっています。
これは仕方ないのでしょうか?
DXライブラリを使用している皆様もこの仕様は
黙認、というか妥協している部分なのでしょうか?
例えば、単音で「ぴーーーーー」と鳴りっぱなしのサウンドデータがあったとして、
それをどこまでうまく切り取っていてもPlaySoundMemでloopさせるときには
「ピーーーーーーーーーーーーーーーーーーーー(endless」と流すことは出来ず、
「ピーーーーー ピーーーーーー ピーーーーーー(endless」といった感じに
なるしかないのでしょうか?
だとすれば、厳密にはDX_PLAYTYPE_LOOPの説明の
「音楽の再生が 終るとすぐ最初から再生が始まります」は
違うと思うのですが、、、間にかましが入るので。
それとも自分が用意したMP3のせいでしょうか?
(うまくすればそんな風にならない、ということ?)
それならそれで安心なのですが(自分が何度も修正すれば済む話なんで。
もしくは、この仕様に満足いかず、
そこら辺をうまく回避、対処されている方、
いらっしゃいますか?
ループをスムーズにさせたいのです。
どうぞお知恵をお貸しください。
を利用しています。
用意しているのはMP3なのですが、ループの折り返しでどうしても一瞬無音が入ります。
MP3のBGMの先頭か最後に無音がないようにサウンド編集ツールでシッカリと確認して
無音部分を削除しているつもりです。
ですが、PlaySoundMem(ファイル名, DX_PLAYTYPE_LOOP);でループすると
明らかに繋がって聞こえず、一瞬無音が入ってからの頭出しになっています。
これは仕方ないのでしょうか?
DXライブラリを使用している皆様もこの仕様は
黙認、というか妥協している部分なのでしょうか?
例えば、単音で「ぴーーーーー」と鳴りっぱなしのサウンドデータがあったとして、
それをどこまでうまく切り取っていてもPlaySoundMemでloopさせるときには
「ピーーーーーーーーーーーーーーーーーーーー(endless」と流すことは出来ず、
「ピーーーーー ピーーーーーー ピーーーーーー(endless」といった感じに
なるしかないのでしょうか?
だとすれば、厳密にはDX_PLAYTYPE_LOOPの説明の
「音楽の再生が 終るとすぐ最初から再生が始まります」は
違うと思うのですが、、、間にかましが入るので。
それとも自分が用意したMP3のせいでしょうか?
(うまくすればそんな風にならない、ということ?)
それならそれで安心なのですが(自分が何度も修正すれば済む話なんで。
もしくは、この仕様に満足いかず、
そこら辺をうまく回避、対処されている方、
いらっしゃいますか?
ループをスムーズにさせたいのです。
どうぞお知恵をお貸しください。
Re: DXライブラリの音利用関数について
DXライブラリ制作の管理人様へ
ちょくちょくこちらでお見かけしておりますので
ここで管理人様へ意見をさせて下さい。
DXライブラリを制作するにあたって、ずっとバグの修正、処理等の改善をされて来たかと思います。
自分はこのDXライブラリの存在には本当に助けられ大変感謝させて頂いております。
しかしながら管理人さんは音利用関数に関しては、そこまで気にかけられていらっしゃらない気が致します。
理由はここ数年サウンド利用関数の更新を見たことないからです。
(関心がないので、鳴らす、止める、ループさせる、で終わっているのかな、とも)
例えば、BGMの途中で止め、その止めたところから再生させる、という音利用関数を新たに加えたり、
今回の私の疑問であるループの詰めの甘さをさらに無音が無くなる様に
切り詰めていける、ということは無いのでしょうか?
つまり、PlaySoundFileはまだ改善の余地があるのではないでしょうか?
と思うのですがどうだったんですか?
そんなのは自分でやってください、と言われたらそれまでですが
痒いところに手が届くほど細かく揃っているグラフィック利用関数と違って、
音利用関数がちょっと質素だな、と思いまして。
それとも、この辺はどうしようもないことですか?
だったら本当にすみません。私はそこら辺が無知ですので失礼しました。
自分は、ループの途切れが気になるからと、
二倍、三倍の長さでmp3を用意するんですが、
それはその分容量を食うので、最終手段としています。
ただ、興味がありますので、よかったら音利用関数へのスタンスというか、、
管理人さんのお考えをお聞かせ下さい。
「こんなもんで十分じゃないの?」とか、「言いたいことはわかるが、難しいんでパスしてる」とか、
「ゲーム制作においてサウンド利用関数にそこまでこだわる必要があるとは思わない、
毎回頭から鳴らし直し、ループも切り口で無音が入る、それでもいいじゃないか」などです。
ちょくちょくこちらでお見かけしておりますので
ここで管理人様へ意見をさせて下さい。
DXライブラリを制作するにあたって、ずっとバグの修正、処理等の改善をされて来たかと思います。
自分はこのDXライブラリの存在には本当に助けられ大変感謝させて頂いております。
しかしながら管理人さんは音利用関数に関しては、そこまで気にかけられていらっしゃらない気が致します。
理由はここ数年サウンド利用関数の更新を見たことないからです。
(関心がないので、鳴らす、止める、ループさせる、で終わっているのかな、とも)
例えば、BGMの途中で止め、その止めたところから再生させる、という音利用関数を新たに加えたり、
今回の私の疑問であるループの詰めの甘さをさらに無音が無くなる様に
切り詰めていける、ということは無いのでしょうか?
つまり、PlaySoundFileはまだ改善の余地があるのではないでしょうか?
と思うのですがどうだったんですか?
そんなのは自分でやってください、と言われたらそれまでですが
痒いところに手が届くほど細かく揃っているグラフィック利用関数と違って、
音利用関数がちょっと質素だな、と思いまして。
それとも、この辺はどうしようもないことですか?
だったら本当にすみません。私はそこら辺が無知ですので失礼しました。
自分は、ループの途切れが気になるからと、
二倍、三倍の長さでmp3を用意するんですが、
それはその分容量を食うので、最終手段としています。
ただ、興味がありますので、よかったら音利用関数へのスタンスというか、、
管理人さんのお考えをお聞かせ下さい。
「こんなもんで十分じゃないの?」とか、「言いたいことはわかるが、難しいんでパスしてる」とか、
「ゲーム制作においてサウンド利用関数にそこまでこだわる必要があるとは思わない、
毎回頭から鳴らし直し、ループも切り口で無音が入る、それでもいいじゃないか」などです。
Re: DXライブラリの音利用関数について
int SetLoopPosSoundMem( int LoopTime, int SoundHandle )を使用してみてはいかがでしょうか?
サンプルコードです。
更新履歴を見ると大体がバグの修正によって更新されていることが分かると思います。
また、新規のサウンド関連の関数が出ない理由として、既存の関数の組み合わせで実装できることばかりだからだと考えます。
たとえば、
>BGMの途中で止め、その止めたところから再生させる
のような機能は既存の関数を組み合わせればできます。過去にわたし自身がその機能を実装したことがあります。
サンプルコードです。
#include "DxLib.h" // WinMain関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SoundHandle ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // 音をロードする SoundHandle = LoadSoundMem( "testMusic.wav" ) ; // ループ位置を音の先頭から20秒後にセットする SetLoopPosSoundMem( 20000, SoundHandle ) ; // 音をループ再生する PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ; // キーの入力待ち WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; }
関心が無いのではなく、サウンド関連でバグが出ないから更新していないだけかと思います。猿渡 さんが書きました: しかしながら管理人さんは音利用関数に関しては、そこまで気にかけられていらっしゃらない気が致します。
理由はここ数年サウンド利用関数の更新を見たことないからです。
(関心がないので、鳴らす、止める、ループさせる、で終わっているのかな、とも)
例えば、BGMの途中で止め、その止めたところから再生させる、という音利用関数を新たに加えたり、
今回の私の疑問であるループの詰めの甘さをさらに無音が無くなる様に
切り詰めていける、ということは無いのでしょうか?
更新履歴を見ると大体がバグの修正によって更新されていることが分かると思います。
また、新規のサウンド関連の関数が出ない理由として、既存の関数の組み合わせで実装できることばかりだからだと考えます。
たとえば、
>BGMの途中で止め、その止めたところから再生させる
のような機能は既存の関数を組み合わせればできます。過去にわたし自身がその機能を実装したことがあります。
ここの管理人であるDixqさんとDxライブラリの製作者様は別人です。猿渡 さんが書きました:ただ、興味がありますので、よかったら音利用関数へのスタンスというか、、
管理人さんのお考えをお聞かせ下さい。
「こんなもんで十分じゃないの?」とか、「言いたいことはわかるが、難しいんでパスしてる」とか、
「ゲーム制作においてサウンド利用関数にそこまでこだわる必要があるとは思わない、
毎回頭から鳴らし直し、ループも切り口で無音が入る、それでもいいじゃないか」などです。
初心者です
Re: DXライブラリの音利用関数について
それは、使ってみました。Rittai_3D さんが書きました:int SetLoopPosSoundMemを使用してみてはいかがでしょうか?
でもそれも、
指定した場所に戻って再生されるとき、
一瞬無音が入りますよね?
無音をどうにかしたいんですよね、、、
なんで無音が入るんでしょう?
Re: DXライブラリの音利用関数について
そ、そうなんですか?Rittai_3D さんが書きました:ここの管理人であるDixqさんとDxライブラリの製作者様は別人です
了解しました。。。。。。。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリの音利用関数について
確かに通常の音楽のループなら気になりませんが、Audacity等のトーンで作った音だとループする瞬間プツッと聞こえますね。
テストしたプロジェクトは添付ファイルです。
DXライブラリの製作者様は山田様といって
http://homepage2.nifty.com/natupaji/DxLib/
こちらのHPの方です。
こちらの掲示板で聞いてみてはいかがでしょうか。
テストしたプロジェクトは添付ファイルです。
DXライブラリの製作者様は山田様といって
http://homepage2.nifty.com/natupaji/DxLib/
こちらのHPの方です。
こちらの掲示板で聞いてみてはいかがでしょうか。
- 添付ファイル
-
- DxLib.zip
- (57.74 KiB) ダウンロード数: 149 回
Re: DXライブラリの音利用関数について
Dixq (管理人) さん
ありがとうございます、向こうの掲示板でも質問させて頂いたところ
別の方がoggを推奨されまして、mp3をoggに変換し同じようにループ再生しましたが
結果はmp3となんら変わらず、途切れてのループ状態でした。
Dixq (管理人) さんのサンプルも確認しました。
まさにそういう状態ですよね
プーーーーー 一度切れてからの 戻って プーーーーーーと鳴ってます。
これ、どうにか出来ないのでしょうか?
解決、というか対処出来たら
DXライブラリ制作によるゲームの
サウンド面のクオリティが飛躍的に上がるんですが、、個人的に。
確かに、キリの良いBGMのループだと、うまく無音部分すら
BGMの一部と感じられ、違和感なくループさせられるんですが、
DXライブラリの長い歴史にわたり、区切りのないBGMでループさせることを
誰も試したことが無かったのでしょうか、、、?
ありがとうございます、向こうの掲示板でも質問させて頂いたところ
別の方がoggを推奨されまして、mp3をoggに変換し同じようにループ再生しましたが
結果はmp3となんら変わらず、途切れてのループ状態でした。
Dixq (管理人) さんのサンプルも確認しました。
まさにそういう状態ですよね
プーーーーー 一度切れてからの 戻って プーーーーーーと鳴ってます。
これ、どうにか出来ないのでしょうか?
解決、というか対処出来たら
DXライブラリ制作によるゲームの
サウンド面のクオリティが飛躍的に上がるんですが、、個人的に。
確かに、キリの良いBGMのループだと、うまく無音部分すら
BGMの一部と感じられ、違和感なくループさせられるんですが、
DXライブラリの長い歴史にわたり、区切りのないBGMでループさせることを
誰も試したことが無かったのでしょうか、、、?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: DXライブラリの音利用関数について
OS性能的に不可能な場合や技術的に難しい問題もありますので一概には言えないと思います。
XAudio2関係で問題がある場合が有った気もしましたが、あちらの掲示板の過去ログを探してみてください。
DXライブラリの本筋のグラフィックの片手間だと性能を突き詰めるのは相当困難だと思います。
サウンドでWindowsOSだと問題が大きいと思うので専業メーカーさんのライブラリを検討するのも手だと思います。
http://www.adx2le.com/
PS1の頃からゲーム系のサウンドツールを手がけている老舗です。条件付きで無料利用可能です。
XAudio2関係で問題がある場合が有った気もしましたが、あちらの掲示板の過去ログを探してみてください。
DXライブラリの本筋のグラフィックの片手間だと性能を突き詰めるのは相当困難だと思います。
サウンドでWindowsOSだと問題が大きいと思うので専業メーカーさんのライブラリを検討するのも手だと思います。
http://www.adx2le.com/
PS1の頃からゲーム系のサウンドツールを手がけている老舗です。条件付きで無料利用可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DXライブラリの音利用関数について
検索ぐらいしましょうよ。DXライブラリ製作者本人からのレスがあります。猿渡 さんが書きました:DXライブラリの長い歴史にわたり、区切りのないBGMでループさせることを
誰も試したことが無かったのでしょうか、、、?
BGMをループさせた際に無音が入る(2012/07/16 20:53)
No.5の返信に、mp3にした際、必ず無音部分がはいると明記されていますね。
wav→mp3→wav
とやるとサイズが増えるらしいです。確かめてみましたか?
mp3→oggとやっても同じでしょう。mp3に無音部分がすでに入ってるのですから意味がありません。猿渡 さんが書きました:mp3をoggに変換し同じようにループ再生しましたが
結果はmp3となんら変わらず
mp3をいったんwavに変換して、そこの無音部分を削除してからoggに変換する必要があると思います。
written by へにっくす
Re: DXライブラリの音利用関数について
個人的にmp3ファイルから曲の長さを調べたりしようとしていたことがあったので,技術的背景を。
mp3ファイルはフレームあたりのサンプル数が固定(Layer-Ⅰの場合384,Ⅱ/Ⅲの場合1152)である上,フレーム中に有効なサンプル数が含まれないため,最終フレームの有効なサンプル数を決定出来ません。
このため,最大で1151サンプル分,なんらかのデータでパディングしないといけないことになります。
サンプリングレートが44.1k㎐のmp3ファイルでは,最大1151 / (44.1 * 1000)ミリ秒,つまりは26㎳強のパディングが入ります。
また,LAME Tag が書き込まれているmp3ファイルを非対応のプレイヤーで再生すると,1フレーム (1152サンプル) 分再生が遅れます。
ループさせた場合,最大52㎳程度の無音ができる可能性があります。
mp3ファイルで無音を避けるのであれば,
これでも発生する無音は,mp3に依存しない問題になってきます。
mp3ファイルはフレームあたりのサンプル数が固定(Layer-Ⅰの場合384,Ⅱ/Ⅲの場合1152)である上,フレーム中に有効なサンプル数が含まれないため,最終フレームの有効なサンプル数を決定出来ません。
このため,最大で1151サンプル分,なんらかのデータでパディングしないといけないことになります。
サンプリングレートが44.1k㎐のmp3ファイルでは,最大1151 / (44.1 * 1000)ミリ秒,つまりは26㎳強のパディングが入ります。
また,LAME Tag が書き込まれているmp3ファイルを非対応のプレイヤーで再生すると,1フレーム (1152サンプル) 分再生が遅れます。
ループさせた場合,最大52㎳程度の無音ができる可能性があります。
mp3ファイルで無音を避けるのであれば,
- オリジナルデータの状態 (PCM生データの状態) で,サンプル数を1152の倍数にしておく
- LAME Tagを書き込まない (LAMEであれば-tオプション)
これでも発生する無音は,mp3に依存しない問題になってきます。
オフトピック
LAME Tag自体には,元々の長さなどの情報が含まれています。
なので,LAME Tagを正しく解釈してくれるのであれば,LAME Tagを入れる方が末尾が正しい長さで処理されます。
また,解釈してくれないにしても通常の音楽プレイヤーで音楽を聴く場合は26㎳程度は普通は気付かない時間でしかなく,それが先頭と末尾に入っていても問題になりません。
また,LAME TagにはVBRでの曲長を決定するのに有利な情報も入っていたりするため,通常のmp3ファイル作成ではLAME Tagを入れた方がよいでしょう。
しかし,今回のような場合や,動画と合わせる場合などは,LAME Tagが存在しない方がよい可能性が高いです。
なので,LAME Tagを正しく解釈してくれるのであれば,LAME Tagを入れる方が末尾が正しい長さで処理されます。
また,解釈してくれないにしても通常の音楽プレイヤーで音楽を聴く場合は26㎳程度は普通は気付かない時間でしかなく,それが先頭と末尾に入っていても問題になりません。
また,LAME TagにはVBRでの曲長を決定するのに有利な情報も入っていたりするため,通常のmp3ファイル作成ではLAME Tagを入れた方がよいでしょう。
しかし,今回のような場合や,動画と合わせる場合などは,LAME Tagが存在しない方がよい可能性が高いです。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリの音利用関数について
確かに圧縮したmp3は後ろに変な空白が出来ていますね。
(添付ファイル参照)
しかし、wavでLoopしても極僅かな雑音が入るようです。(添付ファイル参照)
- 添付ファイル
-
- DxLib.zip
- (362.4 KiB) ダウンロード数: 148 回
Re: DXライブラリの音利用関数について
Dixqさんがご用意されたwavファイルで雑音が入るのは波形の先端と終端が綺麗に繋がっていないのが原因です。Dixq (管理人) さんが書きました: しかし、wavでLoopしても極僅かな雑音が入るようです。
綺麗に繋がるようにしたwavファイルを作成しましたのでお試しください。
http://fast-uploader.com/file/6984279171182/
(綺麗に繋がるwavファイルとDixqさんのwavファイルの終端と先端の波形を画像化したpngファイルも入っています。)
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: DXライブラリの音利用関数について
ru-puさん
ご指摘ありがとうございます。
確かにわずかにずれていたようです。
頂いたwavファイルでは正常にLOOPしていることを確認しました。
ご指摘ありがとうございます。
確かにわずかにずれていたようです。
頂いたwavファイルでは正常にLOOPしていることを確認しました。