DXライブラリの音利用関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
猿渡

DXライブラリの音利用関数について

#1

投稿記事 by 猿渡 » 5年前

PlaySoundMem(ファイル名, DX_PLAYTYPE_LOOP);
を利用しています。
用意しているのはMP3なのですが、ループの折り返しでどうしても一瞬無音が入ります。
MP3のBGMの先頭か最後に無音がないようにサウンド編集ツールでシッカリと確認して
無音部分を削除しているつもりです。
ですが、PlaySoundMem(ファイル名, DX_PLAYTYPE_LOOP);でループすると
明らかに繋がって聞こえず、一瞬無音が入ってからの頭出しになっています。

これは仕方ないのでしょうか?
DXライブラリを使用している皆様もこの仕様は
黙認、というか妥協している部分なのでしょうか?

例えば、単音で「ぴーーーーー」と鳴りっぱなしのサウンドデータがあったとして、
それをどこまでうまく切り取っていてもPlaySoundMemでloopさせるときには
「ピーーーーーーーーーーーーーーーーーーーー(endless」と流すことは出来ず、
「ピーーーーー ピーーーーーー ピーーーーーー(endless」といった感じに
なるしかないのでしょうか?

だとすれば、厳密にはDX_PLAYTYPE_LOOPの説明の
「音楽の再生が 終るとすぐ最初から再生が始まります」は
違うと思うのですが、、、間にかましが入るので。

それとも自分が用意したMP3のせいでしょうか?
(うまくすればそんな風にならない、ということ?)
それならそれで安心なのですが(自分が何度も修正すれば済む話なんで。

もしくは、この仕様に満足いかず、
そこら辺をうまく回避、対処されている方、
いらっしゃいますか?
ループをスムーズにさせたいのです。
どうぞお知恵をお貸しください。

猿渡

Re: DXライブラリの音利用関数について

#2

投稿記事 by 猿渡 » 5年前

DXライブラリ制作の管理人様へ

ちょくちょくこちらでお見かけしておりますので
ここで管理人様へ意見をさせて下さい。
DXライブラリを制作するにあたって、ずっとバグの修正、処理等の改善をされて来たかと思います。
自分はこのDXライブラリの存在には本当に助けられ大変感謝させて頂いております。

しかしながら管理人さんは音利用関数に関しては、そこまで気にかけられていらっしゃらない気が致します。
理由はここ数年サウンド利用関数の更新を見たことないからです。
(関心がないので、鳴らす、止める、ループさせる、で終わっているのかな、とも)

例えば、BGMの途中で止め、その止めたところから再生させる、という音利用関数を新たに加えたり、
今回の私の疑問であるループの詰めの甘さをさらに無音が無くなる様に
切り詰めていける、ということは無いのでしょうか?

つまり、PlaySoundFileはまだ改善の余地があるのではないでしょうか?
と思うのですがどうだったんですか?

そんなのは自分でやってください、と言われたらそれまでですが
痒いところに手が届くほど細かく揃っているグラフィック利用関数と違って、
音利用関数がちょっと質素だな、と思いまして。
それとも、この辺はどうしようもないことですか?
だったら本当にすみません。私はそこら辺が無知ですので失礼しました。
自分は、ループの途切れが気になるからと、
二倍、三倍の長さでmp3を用意するんですが、
それはその分容量を食うので、最終手段としています。

ただ、興味がありますので、よかったら音利用関数へのスタンスというか、、
管理人さんのお考えをお聞かせ下さい。
「こんなもんで十分じゃないの?」とか、「言いたいことはわかるが、難しいんでパスしてる」とか、
「ゲーム制作においてサウンド利用関数にそこまでこだわる必要があるとは思わない、
毎回頭から鳴らし直し、ループも切り口で無音が入る、それでもいいじゃないか」などです。

Rittai_3D
記事: 524
登録日時: 7年前

Re: DXライブラリの音利用関数について

#3

投稿記事 by Rittai_3D » 5年前

int SetLoopPosSoundMem( int LoopTime, int SoundHandle )を使用してみてはいかがでしょうか?
サンプルコードです。

コード:

#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ライブラリの音利用関数について

#4

投稿記事 by 猿渡 » 5年前

Rittai_3D さんが書きました:int SetLoopPosSoundMemを使用してみてはいかがでしょうか?
それは、使ってみました。
でもそれも、
指定した場所に戻って再生されるとき、
一瞬無音が入りますよね?

無音をどうにかしたいんですよね、、、
なんで無音が入るんでしょう?

猿渡

Re: DXライブラリの音利用関数について

#5

投稿記事 by 猿渡 » 5年前

Rittai_3D さんが書きました:ここの管理人であるDixqさんとDxライブラリの製作者様は別人です
そ、そうなんですか?
了解しました。。。。。。。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリの音利用関数について

#6

投稿記事 by Dixq (管理人) » 5年前

確かに通常の音楽のループなら気になりませんが、Audacity等のトーンで作った音だとループする瞬間プツッと聞こえますね。
テストしたプロジェクトは添付ファイルです。
DXライブラリの製作者様は山田様といって
http://homepage2.nifty.com/natupaji/DxLib/
こちらのHPの方です。
こちらの掲示板で聞いてみてはいかがでしょうか。
添付ファイル
DxLib.zip
(57.74 KiB) ダウンロード数: 43 回

猿渡

Re: DXライブラリの音利用関数について

#7

投稿記事 by 猿渡 » 5年前

Dixq (管理人) さん

ありがとうございます、向こうの掲示板でも質問させて頂いたところ
別の方がoggを推奨されまして、mp3をoggに変換し同じようにループ再生しましたが
結果はmp3となんら変わらず、途切れてのループ状態でした。

Dixq (管理人) さんのサンプルも確認しました。
まさにそういう状態ですよね
プーーーーー 一度切れてからの 戻って プーーーーーーと鳴ってます。
これ、どうにか出来ないのでしょうか?

解決、というか対処出来たら
DXライブラリ制作によるゲームの
サウンド面のクオリティが飛躍的に上がるんですが、、個人的に。

確かに、キリの良いBGMのループだと、うまく無音部分すら
BGMの一部と感じられ、違和感なくループさせられるんですが、
DXライブラリの長い歴史にわたり、区切りのないBGMでループさせることを
誰も試したことが無かったのでしょうか、、、?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリの音利用関数について

#8

投稿記事 by softya(ソフト屋) » 5年前

OS性能的に不可能な場合や技術的に難しい問題もありますので一概には言えないと思います。
XAudio2関係で問題がある場合が有った気もしましたが、あちらの掲示板の過去ログを探してみてください。
DXライブラリの本筋のグラフィックの片手間だと性能を突き詰めるのは相当困難だと思います。

サウンドでWindowsOSだと問題が大きいと思うので専業メーカーさんのライブラリを検討するのも手だと思います。
http://www.adx2le.com/
PS1の頃からゲーム系のサウンドツールを手がけている老舗です。条件付きで無料利用可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

Re: DXライブラリの音利用関数について

#9

投稿記事 by へにっくす » 5年前

猿渡 さんが書きました:DXライブラリの長い歴史にわたり、区切りのないBGMでループさせることを
誰も試したことが無かったのでしょうか、、、?
検索ぐらいしましょうよ。DXライブラリ製作者本人からのレスがあります。
BGMをループさせた際に無音が入る(2012/07/16 20:53)
No.5の返信に、mp3にした際、必ず無音部分がはいると明記されていますね。
wav→mp3→wav
とやるとサイズが増えるらしいです。確かめてみましたか?
猿渡 さんが書きました:mp3をoggに変換し同じようにループ再生しましたが
結果はmp3となんら変わらず
mp3→oggとやっても同じでしょう。mp3に無音部分がすでに入ってるのですから意味がありません。
mp3をいったんwavに変換して、そこの無音部分を削除してからoggに変換する必要があると思います。
written by へにっくす

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: DXライブラリの音利用関数について

#10

投稿記事 by YuO » 5年前

個人的に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が存在しない方がよい可能性が高いです。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリの音利用関数について

#11

投稿記事 by Dixq (管理人) » 5年前

確かに圧縮したmp3は後ろに変な空白が出来ていますね。
無題.png
無題.png (48.88 KiB) 閲覧数: 4449 回
しかし、wavでLoopしても極僅かな雑音が入るようです。
(添付ファイル参照)
添付ファイル
DxLib.zip
(362.4 KiB) ダウンロード数: 39 回

ru-pu

Re: DXライブラリの音利用関数について

#12

投稿記事 by ru-pu » 5年前

Dixq (管理人) さんが書きました: しかし、wavでLoopしても極僅かな雑音が入るようです。
Dixqさんがご用意されたwavファイルで雑音が入るのは波形の先端と終端が綺麗に繋がっていないのが原因です。
綺麗に繋がるようにしたwavファイルを作成しましたのでお試しください。
http://fast-uploader.com/file/6984279171182/
(綺麗に繋がるwavファイルとDixqさんのwavファイルの終端と先端の波形を画像化したpngファイルも入っています。)

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: DXライブラリの音利用関数について

#13

投稿記事 by Dixq (管理人) » 5年前

ru-puさん

ご指摘ありがとうございます。
確かにわずかにずれていたようです。
頂いたwavファイルでは正常にLOOPしていることを確認しました。

閉鎖

“C言語何でも質問掲示板” へ戻る