2011-12-27 9 views
1

I持っているのArrayListに保存されている音符を再生するための、次のプレイ方法:C#設定した時間とプレイはArrayListの中に保存された音を連続して

public void Play(Duration d){ 


      int duration = 1; 

      if (d == Duration.SemiBreve) 
      { 
       duration = 16; 
      } 

      else if (d == Duration.DotMin) 
      { 
       duration = 10; 
      } 

      else if (d == Duration.minim) 
      { 
       duration = 8; 
      } 

      else if (d == Duration.Crotchet) 
      { 
       duration = 4; 
      } 

      else if (d == Duration.Quaver) 
      { 
       duration = 2; 
      } 

      else if (d == Duration.SemiQuaver) 
      { 
       duration = 1; 
      } 

      player = new SoundPlayer(); 

      player.SoundLocation = "pathToLocation"; 


      //set timer 
      time = new Timer(); 
      time.Tick += new EventHandler(clockTick); 
      time.Interval = duration * 150; 
      player.Play(); 
      time.Start(); 

     } 

私はボタンでメソッドを呼び出すとき:

private void PlayButton_Click(object sender, EventArgs e) 

{ 

     //Loops through the collection and plays each note one after the other 
     foreach (MusicNote music in this.staff.Notes) 
     { 
      music.Play(music.Dur) 

     } 
    } 

最後の音だけが再生されます。 PlaySync()では、すべての音符が再生されますが、継続時間は認識されません。私はまた、スレッドをこのように使用しようとしました:

foreach (MusicNote music in this.staff.Notes) 
      { 
       Thread t = new Thread(playMethod=>music.Play(music.Dur)); 
       t.Start(); 
       t.Join(); 

      } 

しかし、どちらも動作しません。 PlaySyncのようにファイルを連続して再生する方法はありますか?

+0

一度に1つの音符を演奏するには、いくつかのロジックを追加する必要があります。ボタンがクリックされた後にただ1つの音符を演奏するように、それを動作させるようにしてください。その後、タイマーを追加します。 – CodingBarfield

答えて

3

あなたはどこでもタイマーを待つことはありません。したがって、実際にはすべての音符がほぼ同時に再生され、最後の音符だけが効果的に聞こえるようになります。


UPDATE:行きSystem.Timers.Timerクラスの道を使用するには、Elapsedイベントのハンドラを登録し、一つずつイベントハンドラでノートを演奏しています。これにより、UIをフリーズすることを避けることができます。

もう1つのオプションがバックグラウンドスレッドで再生されており、Thread.Sleepを使用して待機しています。ここでは、UIの状態に応じてスレッドが停止していることを確認する必要があります(つまり、現在のダイアログを閉じるなど)。

競合状態を回避するには、staff.Notesへの同時アクセスを解決するか、再生のためにコピーを作成する必要があります。

+0

だから私はボタンメソッドではなく、music.Playメソッドでは、タイマーを待たなければならないと思いますか?どのようにタイマーを待つので、timer.Elapsedを使用しますか?ありがとう、そして、もし彼らがシンプルなら質問を言い訳してください。私は前にタイマークラスを使ったことはありませんでした。 – Matt

+0

私は非常に簡単な方法で修正することができました。私はメインスレッドを音符ごとにタイマーの間隔(サウンドが再生されるまで)。これは私の特別なニーズに対応しましたが、プログラム全体がブロックされているので、より良い方法を提案できますか?いずれの方法でも、あなたの答えは私を解決に導いてくれました。ありがとう。 – Matt

関連する問題