要素として多数のサウンドファイルを含むArrayListがあります。foreachループはこのコレクションを繰り返し、各ノートを再生します。
問題は、プログラムを実行すると最後の音だけが再生されますが、デバッグ時にはすべての要素を通過し、それぞれが再生されることです。
サウンドは、私の「MusicNote」クラスのオブジェクトとして表されます。問題が何であるか理解できません。デバッグするとき、それは完全に機能します。
要素として多数のサウンドファイルを含むArrayListがあります。foreachループはこのコレクションを繰り返し、各ノートを再生します。
問題は、プログラムを実行すると最後の音だけが再生されますが、デバッグ時にはすべての要素を通過し、それぞれが再生されることです。
サウンドは、私の「MusicNote」クラスのオブジェクトとして表されます。問題が何であるか理解できません。デバッグするとき、それは完全に機能します。
http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx によるとplayer.Play()
、新しいスレッドが開始されます。これは、ファイルの再生が完了するずっと前に戻ることを意味します...
代わりに使用player.PlaySync()
してください-メインスレッドまたは(ブロックしているため)別のスレッドで。
注意: マルチスレッド プログラムをデバッグする場合、動作が異なる場合があります。一歩踏み出すと…
古いコードを掘り下げて、このように実装しました(WP7で)
あなたは呼び出すことができます:
player.PlaySync();
問題は、SoundPlayer.Play() が非同期であるため、foreach をブロックしないことです。
その理由は、ループの各反復で、ファイルが再生される前にファイルを設定しているためです。ロードして再生できるのは、最後のイテレーションだけです。
クリップを同時に再生したい場合は、各スレッドがクリップを再生する複数のスレッドでこれを行う必要があると思います。
順番に再生したい場合は、プレイリストを作成してからロードすることを検討します。
オーバーヘッドが開始をスキップするのを防ぐために、出力を初期化する必要があります。ゲームエンジン環境以外でこれを行う方法がわかりません。たぶん、固定長またはエラー長のギャップに合わせて偽のメモを追加できます。
これが役立つことを願っています!それが素晴らしい答えではないことは理解していますが、正しいことをしようとしたことで男を責めることはできません;)
PSジェイソンのプレイリストのアイデアを見てください、それはいいです
にはいくつのアイテムがありnoteList
ますか? 「デバッグ時」とはどういう意味ですか? 「プログラムが実行されたとき」とはどういう意味ですか?
また、Play()
は非同期なので、すべての音が同時に再生されているので、1 つだけ再生されているように見えます。代わりに電話することができますPlaySync()
。ただし、ブロックされるため、別のスレッドで実行することをお勧めします。
ノートとは?何を使って遊んでいますか?それらはどのような種類のファイルですか?
play を呼び出して、最初の音符の再生を開始しても、ブロックせずに次の音符に移動し、最初の音符がキャンセルされ、何も来ないために完了できる最後の音符まで続きます。その後。それが問題であるかどうかを確認するためにプレイの後に待機します。問題がある場合は、次のノートに進む前にノートが終了するのを待つ方法を見つける必要があります。