1から9までの各キーが異なるサウンドを生成するサンプラープログラムを作成しています。 すべてがうまくいきますが、2つ(またはそれ以上)の音を同時に押すと、2番目の音が最初の音を「殺す」。SoundPlayerを使用して複数のサウンドを再生する
SoundPlayer
を使用して.WAVファイルからサウンドを再生しています。これをどうすれば解決できますか?
1から9までの各キーが異なるサウンドを生成するサンプラープログラムを作成しています。 すべてがうまくいきますが、2つ(またはそれ以上)の音を同時に押すと、2番目の音が最初の音を「殺す」。SoundPlayerを使用して複数のサウンドを再生する
SoundPlayer
を使用して.WAVファイルからサウンドを再生しています。これをどうすれば解決できますか?
複数のサウンドを同時に再生できるように設計されたDirectX(DirectSound)または同様のAPIを使用する必要があります。
私はあなたのKeyPressイベント(または使用しているもの)で、WAVファイルへのパスを取るコンストラクタを使用してSoundPlayerの新しいインスタンスを作成してから、そのPlayメソッドを呼び出すと思います。理論上、WindowsはWindows 98以降に複数のWAVファイルを同時に再生することができるので、あなたが直面している "モノ"エフェクトは発生しないはずです。このクラスを自分自身で使用していると聞いていると思いますが、秒が始まると最初の音が途切れることはありませんが、実際には、WAVファイルがディスクから読み込まれるたびに全体の再生が一時停止することによる不具合が発生します。
各キープレスでSoundPlayerの新しいインスタンスを読み込む代わりに、クラススコープのSoundPlayerオブジェクトの配列を作成し、フォームのLoadイベントでディスクからあらかじめロードしてみてください。次に、キーが押されたときに各SoundPlayerのPlayメソッドを呼び出します。これはあなたの問題を解決するかもしれませんが、私はあなたがまだこのように時折不具合を起こすと思います。
複数のサウンドをC#またはVB.Netで一度に再生する簡単な方法が1つあります。各.wavファイルを再生するには、mciSendString()
API関数を呼び出す必要があります。あなたがループプレイしていない限り、マルチスレッドを行う必要はありません。 Hereは、mciSendString()
を使用して作成されたMusicPlayer
クラスの完全な実例です。
// Sound api functions
[DllImport("winmm.dll")]
static extern Int32 mciSendString(string command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback);
上記の機能では、キーは最初のパラメータコマンドです。別のコマンド名で2つの関数を呼び出す限り、それらは個別に/同時に再生されます。これは私のC#プログラムの1つです:
private void PlayWorker()
{
StringBuilder sb = new StringBuilder();
mciSendString("open \"" + FileName + "\" alias " + this.TrackName, sb, 0, IntPtr.Zero);
mciSendString("play " + this.TrackName, sb, 0, IntPtr.Zero);
IsBeingPlayed = true;
}
EDIT:実際の例へのリンクを追加しました。
あなたはこれを行うことができます:
SoundPlayer
このようなストリームをパラメータとしてthe SoundPlayer
constructorに提供します。
このようにして、何とか複雑なDirectSoundライブラリを使用する必要はなく、ミキシング(一度に複数のサウンド)が可能です。
using System.Windows.Media
Function void Play(string audioPath)
{
MediaPlayer myPlayer = new MediaPlayer();
myPlayer.Open(new System.Uri(audioPath));
myPlayer.Play();
}
Play(Application.StartupPath + "\\Track1.wav");
Play(Application.StartupPath + "\\Track2.wav");
このコードは、同時にオーディオファイルを再生することができ、第二の音声で呼び出しtrack2.wav
はtrack1.wav
のプレイを邪魔しません。
これは素晴らしい解決策です。 2つの質問:1.明らかに、 'MediaPlayer 'には' Load'が存在しません。しかし、まだそれなしで動作します。 2.もう1つの 'mPlayer.Play()'を最初のものの直後に追加すると、オーディオファイルは2回再生されませんが、1回はなぜですか? – HeyJude
SoundPlayerにロードメソッドが存在する場合、修正されます。次に、異なるオーディオファイルを渡すため、オーディオファイルを2回再生しません。 Track1.wav、Track2.wav。 – Vijayaraghavan
@Pransesh、私の意図を明確にしましょう:私が言ったことは、もし私たちがするなら、 'Function void Play(string audioPath){... myPlayer.Play(); myPlayer.Play(); } 'を実行すると、Playは2回ではなく1回実行されます。どうして? – HeyJude
これは動作しますが、これは毎回新しいユニークなトラック名を送信する場合にのみ有効です。以前に使用したトラック名(最初のトラックが停止してからずっと後)で別のサウンドを再生しようとすると、それは黙っています。 – Sire
@Sireそれは起こるべきではありません。再生が完了した後に "停止"コマンドとそれに続く "終了"コマンドを送信してもよろしいですか?私のMusicPlayerの実装全体[ここ](http://pastebin.com/TtrCdeER)を参照できます。オーディオを再生するためにスレッド内で呼び出されるPlayWorker()に特に注意してください。 –
完全なコードをありがとう!私は答えにそのリンクを追加します。 – Sire