2016-11-30 9 views
2

私はいくつかのC#で遊んでいて、ピアノアプリケーションをコーディングしていました。トラバースリストC#

ユーザーがピアノノートをクリックするたびに、サウンド(.wav)の場所をリストに保存しています...次は、button1_MouseDownメソッドのコードです。

if (e.Button == MouseButtons.Left) 
    { 
     SoundPlayer sp = new SoundPlayer(); 
     string musName = Convert.ToString(mk.pitch); 
     string loc = @"D:\OneDrive\Year 2 Semester 1\OOP\Notes-Sound files\Notes-Sound files\mapped\" + musName + ".wav"; 
     sp.SoundLocation = loc; 
     sp.Play(); 
     music.Add(loc); 
    } 

ここで、クリックしたすべてのキーを一度に再生するようにループをトラバースする必要があります。私は何とか、デバッグするとき、押された再生ボタンがクリックされるたびに、最後のノートがplayed.Howeverであることを、

int k = 0; 
for (k = 1; k < music.Count; k++) 
{ 
    SoundPlayer sp = new SoundPlayer(); 
    sp.SoundLocation = music[k]; 
    sp.Play(); 
} 

ものがある(ユーザーが再生ボタンをクリックしたときに)次のように私はすべて、これをやっていますノートが再生されます。何か案は?

+0

こんにちは、私はあなたがそれぞれのノートが、私はまた、すべて1回の反復内に新しいプレーヤーをintializeするよwon'tの必要性を前提としますが、ループの外で次の1 –

+0

を再生する前に再生されることを待つ必要があると思います。 – HimBromBeere

答えて

5

MSDNによると、これはPlay方法の説明をされています

は、新しいスレッドを使用して.wavファイルを再生し、それがロードされていない場合は最初の.wavファイルをロードします。

したがって、Playを呼び出すと、非同期で実行され、ループは現在のファイルが再生される前に次のwavファイルの再生を続けます。デバッグするときは、ループを進める前に待っている可能性があります。

代わりに、PS

同期サウンドを再生する PlaySyncを使用してみてください。 forループのインデックスがで開始する必要があることを

List<SoundPlayer> music = new List<SoundPlayer>(); 
//... 

//In your first loop, you would add the SoundPlayer object 
music.Add(sp); 

//.. 
//Then when you're playing back: 
for (int k = 0; k < music.Count; k++) 
{ 
    music[k].PlaySync(); 
} 

注:また、あなたは新しいインスタンスにあなたがwavファイルを再生するたびに生成することを避けるために、ファイル名の代わりに、あなたのリストにSoundPlayerのインスタンスを使用して検討する必要があります0同様

+0

これは受け入れられる回答である必要があります! +1 – nik0lias

+0

@KMoussa どこに置くべきですか 'var music = new List ();' – Axel

+0

@AxelAzzopardiは現在宣言している 'music'リスト/' string'の配列にありません – KMoussa

0

あなたの主な問題は、最初の1が行われる前に、ノートすべてのプレーが、その後のノートが実際に再生を開始ということです。あなたは最後のものだけを聞きます。

PlaySyncを使用してください。何らかの理由でList<>をトラバースして再生する必要がある場合は、再生する前に各項目をチェックしてください(少なくとも、SoundPlayerを他のクラスに派生させた場合それは実際にチェックすることがあります)、あなたはPlaySync呼び出しのチェックを使用することができます。

SoundPlayer sp = new SoundPlayer(); 

foreach(var note in music) 
{ 
    sp.SoundLocation = note; 
    bool everythingIsFine = false; 

    // Logic for everythingIsFine; 

    if(everythingIsFine){ 
     sp.PlaySync(); 
    } 
}