• 締切済み

【Java】複数のWAV(オーディオ)の同期

ゼルダの伝説であるような、敵に近づくとBGMが変化するものだったり。 マップ上に楽器があってそれに近づくとその楽器の音がBGMに合わせてなったり。 こういったことをするためには、複数のオーディオが同期していなければなりません。 どうすればよいのでしょうか。 例えば普通にClipでバスドラのパートとスネアのパートを別ファイルで、それを同時に鳴らすよう(正確にはすぐに次のオーディオを鳴らすように)プログラミングしても、実際にはずれてしまいました。

みんなの回答

  • KSOH
  • ベストアンサー率93% (29/31)
回答No.2

>実際にやってみてることは、同時に3つのClipを再生し、敵との距離をはかり、近ければ近いほど音の数を増やしていく(ボリュームを上げる)というものです。 自分でも少しやってみました。 ひたすら計算だけを行う裏スレッド(プライオリティはイベントディスパッチスレッドと同じ程度)を10個ほど動かしてCPU稼働率100%ぐらいにし、同じ内容の複数のClipを用意して状況に応じて同時再生数を1から3の間で変えながら動かしてみると、確かにときどき目立ったずれが生じ、エコーがかかったように聞こえました。 再生開始タイミングだけを素朴に合わせたつもりでも確かにずれてしまいますね。すみません。 同期をとる機能としてMixerのsynchronizeメソッドが使えないかと思いましたが自分の環境ではどのMixerも「同期はサポートしてません」といってくるので実験できませんでした。 あと自分が思いつくのはClipを使わずに複数のAudioデータを自前でmixingして一つのSouceDataLineへ出力する方法ぐらいです。この方法を使えば複数の音声を確実に同期することができるとは思いますが、ループやmixing、SourceDataLineへの出力処理を(別スレッドで)自前でやらなければならないので処理が面倒になってしまいます。 (もう少し賢い方法があるような気もしますが残念ながらわかりません。ごめんなさい。)

dossi
質問者

お礼

SouceDataLineの方法は理論上できるとは確かに思いますが、自分の実力じゃちょっと簡単にはいけないですね。 他の言語ならできたりするんでしょうか(そりゃできてるゲームが存在するからできるのだろうけど 中々簡単にはいかないものですね… 色々考えてくださりありがとうございました・・!!

  • KSOH
  • ベストアンサー率93% (29/31)
回答No.1

2つのopen済みのclipに対して同時にstart()としても目立つほどのずれが聞こえてしまうということでしょうか?CPU能力や他のプロセスの影響とかあるかも知れませんが自分の環境(Windows7 ノートパソコン)では下記のようにすると目立ったずれは感じないほど同時に再生することができました。実行はeclipseのデバッグ実行でやってますが他のプログラムは動かしていません。 //後始末は省略 public static void main(String[] args) { String path = ".....wav"; File file = new File(path); try { AudioInputStream ain1 = AudioSystem.getAudioInputStream(file); AudioInputStream ain2 = AudioSystem.getAudioInputStream(file); Clip c1 = AudioSystem.getClip(); Clip c2 = AudioSystem.getClip(); c1.open(ain1); c2.open(ain2); c1.start(); //ここにsleep(5)とかsleep(10)とか入れてみましたがその程度ではずれは感じません。ずれを感じとれるだけの耳でないかもですが c2.start(); Thread.sleep(適当に); c1.stop(); c2.stop(); } catch (LineUnavailableException | UnsupportedAudioFileException | IOException | InterruptedException e) { } } また再生中のクリップc1にタイミングを合わせて途中から別のクリップc2を再生するなら、c2をopenしてstart()直前の状態にしておき、c1の現在の再生位置(マイクロ秒)から「あと何ミリ秒待ってからc2を開始すればよいか」を調べてその分だけsleepしてからc2をstart()するという感じでしょうか。VM内で動作しているゲームのグラフィック処理が重いならば念のためタイミングを制御するようなスレッドのプライオリティを上げてやるのも効果があるかも知れません(そうする効果が本当にあるかは自身ないですが)

dossi
質問者

補足

改めてパソコンの環境が違う時に試してみました。 重いときにはずれ、軽いときにはずれは生じませんでした。 (だんだんずれるのでは無く恐らく最初に再生しはじめるタイミングがずれてしまったのかと 実際にやってみてることは、同時に3つのClipを再生し、敵との距離をはかり、近ければ近いほど音の数を増やしていく(ボリュームを上げる)というものです。 必ずずれないなんてことはできないのでしょうか・・

関連するQ&A