• 締切済み

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

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

  • dossi
  • お礼率40% (11/27)
  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

  • 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

  • 任天堂64 ゼルダの伝説 ムジュラの仮面最初の神殿

    よろしくお願いします。 ハードは任天堂64 ソフトは 「ゼルダの伝説 ムジュラの仮面」についてです。 最初の神殿の序盤あたり、マップを取得した次の仕掛けで 上手くすすめられなくて困っています。 部屋に火の燈っている燈台が一つ 燈っていない燈台が一つありまして 前者の所で「デクの棒」を使い 火をつけて そこから後者に向かい火をともしたいのですが 蛾のような敵キャラクターに邪魔されて 上手く移動できずに 時間が経ってしまい 火が「デクの棒」から自然に消えてしまいます。 上手く切り抜けるコツなどありましたら お教え願えますか?

  • ゲームbgm探してます。

    ゲームbgmなどで、物語が進むに連れて少しずつ完成していく演出のあるものを教えてほしいです。 [具体例] ヨッシーアイランド(ds)(ワールドマップ) https://youtu.be/LwuS6jDS3Xc https://youtu.be/7iQbi4VqyVM ゼルダの伝説 大地の汽笛(神の塔) https://youtu.be/iwDfuhFSM68 ペルソナ3 (タルタロス) https://youtu.be/JidZAC4zIaA

  • 名前のわからないゲーム、スーパーファミコンでアクションRPG

    昔友達から借りてプレイしたソフトがあるのですが、名前が思い出せません。 誰から借りたのかも思い出せなくて。 確定的なこと ・スーパーファミコン用ソフト ・昔の聖剣伝説やゼルダの伝説のような、見下ろし型のARPG(アクションRPG)。マップ上の敵を武器で攻撃していく。 ・武器はシナリオが進むにつれて替わる。(替えることもできる、の間違いかもしれません) 不確定で曖昧な記憶(こんな要素あったかも・・) ・タイトルはカタカナかローマ字 ・物語が始まると、船をおりて森か草原でスタートしたような気がする。でも物語の最初ではなかったかもしれないし、違うゲームかもしれない(すみません)。 ・魔法を使えたかも ・物語が進むと玉のようなものを手に入れたような。戦闘能力か先頭アクションに関係のある。 ・色んな種類の武器があった気がする。剣や槍。ただ、はっきりとおぼえていない。 ・長い槍で攻撃してた記憶がある。 ・鎧を着ていたかも。 ・ダンジョンはあったかわからないが、野外で闘ったことのほうが多かった 曖昧で申し訳ないです。 上の情報に少しでもかするようなソフトを挙げて頂けたら嬉しいです。 よろしくお願いします。

  • 動画編集でのトラックの切り替え方法について

    こんにちは。 当方動画編集の初心者です。 バンドのプロモーションビデオ風の動画を作成したいと考えているのですが、 やり方を教えていただけないでしょうか? 自分が考えている方法は以下のとおりです。 例)ドラマーを撮影する場合 (1)後で同期できるよう原曲を流しながら、特定のリズムで叩いてもらう。 (2)バスドラだけ、スネアだけ、上から、横から等複数の動画を順に撮影。 (3)編集ソフトに取り込み、複数のトラックに原曲のオーディオトラックと、撮影した動画を配置。 (4)音楽と各トラックが同期するよう位置を調整。 (5)音楽に合わせながら、ここからここまではトラックAで、そこからはトラックBで・・・という風に、特定の位置で動画を細かく切り替えていく。 (6)最後に全体の色味等調整。 というような感じで考えています。 なお、お試し版のソフトで試してみたところ、一番動作が安定していたSONYの「Vegas Movie Studio HD」を作業を進めようとしています。 それで、何となく上記の(1)~(4)まではできたような気がしますが、 ここから(5)の作業が思うようにいきません。 自分したい操作がどういう用語なのかわからず、検索してもあまり見つかりません。 この「特定の位置でトラックを切り替える」という方法を教えていただければ幸いです。 (ちなみに、その作業を何かの用語で呼ぶことはありますでしょうか?) また、vegas以外に、上記の作業が簡単にできるソフトがあればお教えください。 みなさんどうぞよろしくお願いします。

  • 秘法伝についての質問です。

    秘法伝を打ち始めてまだ日が浅く、勉強中です。 そこで以下の質問にわかる方教えていただけませんか? 1.ストック切れを見抜く挙動はありますか? 2.BIG中の小役G中にBGMが変化したときは伝説Lモード滞在が確定するのですか? 3.前兆とは最大何Gあるのでしょうか? 4.雑誌などで見かけるプレミア演出と呼ばれているものが多々ありますが、このプレミア演出とは高確突入が確定するだけで、大当たり確定ではないのですか?(リアルシャロン登場、レバーONでファンファーレ…等)演出発生時にチャンス目を引かないとダメ? 5.チャンス目は目押しが正確ならば青ピラミッドシンボル出現で小役不揃いの目以外にどんな目がありますか? よろしくお願いします。

  • 複数人で同期を取りたい

    こんにちは、よろしくお願いいたします。 できるかどうかもわからないのですが、複数人で同じページにアクセスしそのページでの変化をアクセスしてる人すべてに適用させるにはどうしたらよいのでしょうか。 変化の内容としては、簡単な直線を引いたりボタンを押して出現するテキストボックスに文字を書き込めるなどの簡単なものです。 少々わかりづらいかもしれませんが、お願いします。

  • wavでオーディオCDが作れない

    wavファイルの音楽をWindows Media Player 11で オーディオCDとして書き込みたいのですが ファイルをドラッグしても×マークがついて 作成できません。 どうしたらよいでしょうか? よろしくおねがいします。

  • 複数wavの合成

    複数のwavファイルを同時再生して録音(ひとつのwavファイルに)する あるいは ひとつのwavファイルを再生しながら上書き録音を可能にする というフリーウェアをご存知の方いらっしゃいますでしょうか。 具体的にいうと、自分で歌って録音したファイルに、 自分のハモリを挿入したいのです。 Windows Sound Recorderでそれが既に可能なのであれば 方法を教えてください。 よろしくお願いします。

  • java初心者 wavファイル再生について

    こんにちは。 趣味でプログラミングをしている者です。 javascriptでポーカーを再現するくらいです。 eclipse3.6でJAVAの勉強をしているのですが、 Applet.newAudioClip() について、質問させていただきます。 http://d.hatena.ne.jp/aidiary/20041003/1251379247 上記のサイトを参考にして ボールが壁に当たった時に wavファイルの 効果音を鳴らすように試みたのですが、 以下のようなメッセージが表示されてしまいました。 ----------------------------------------------------------- Exception in thread "main" java.lang.NullPointerException at sun.applet.AppletAudioClip.<init>(AppletAudioClip.java:48) at java.applet.Applet.newAudioClip( Applet.java:279 ) at many_balls.soundball.<init>( soundball.java:12 ) at many_balls.soundpanel.<init>( soundpanel.java:24 ) at many_balls.soundframe.<init>( soundframe.java:12 ) at many_balls.soundframe.main( soundframe.java:21 ) ----------------------------------------------------------- 効果音をなしにしたときは、描画されたのですが・・・ http://d.hatena.ne.jp/hhelibex/20090214/1234629150 上記のサイトを見て、ファイル名を   AudioClip sef = Applet.newAudioClip( classname.class.getResource("/fimename.wav") ); とか、 sef = Applet.newAudioClip( classname.class.getClassLoader().getResource("filename.wav") ); とかにしても、同様のエラーメッセージがコンソール部分に 表示されてしまいました。 初心者なもので、エラーメッセージの意味がよくわからないのですが。 ファイルを置く場所が違っている、ということなのでしょうか? getResource( arg ) の引数の指定の仕方が違うのでしょうか? もしよろしかったら教えていただけないでしょうか よろしくおねがいします。

    • ベストアンサー
    • Java
  • WAVファイルは、オーディオCDに焼けますか?

    現在、パソコンにアナログソースをデジタル化して取り込んでいます。WAVファイル、44100hz、16bit、128kbpsで保存しています。これをオーディオCDに焼きたいのですが、その方法を教えてください。何か変換しなければならないのでしょうか?

専門家に質問してみよう