遍历列表C#



我正在玩一些C#,我正在编码钢琴应用程序。

每当用户单击钢琴笔记时,我将声音(.WAV)的位置存储到列表中...以下是Button 1_mousedown方法中的一些代码。

if (e.Button == MouseButtons.Left)
   {
       SoundPlayer sp = new SoundPlayer();
       string musName = Convert.ToString(mk.pitch);
       string loc = @"D:OneDriveYear 2 Semester 1OOPNotes-Sound filesNotes-Sound filesmapped" + musName + ".wav";
       sp.SoundLocation = loc;
       sp.Play();
       music.Add(loc);
    }

现在,我想穿过循环以一次播放所有单击键。我正在执行以下操作(用户单击播放按钮时)

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

问题是,每当单击播放按钮时,只有播放最后一个音符才会播放。但是,当我调试时,以某种方式播放所有音符。有什么想法吗?

根据MSDN,这是Play方法的描述:

使用新线程播放.wav文件,并在未加载的情况下首先加载.wav文件。

因此,每当您调用Play时,它都会异步运行,并且您的循环继续执行在当前wav文件完成之前播放下一个WAV文件。当您调试时,您可能无论如何都在等待循环。

相反,尝试使用PlaySync同步播放声音

ps。另外,您可能需要考虑在列表中使用SoundPlayer的实例而不是文件名中的实例,以避免每次播放WAV文件时创建新实例:

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();
}

请注意,for循环中的索引也应在0开始

您可能需要通过使用LoadAsync来播放声音Asynchronously,例如:如何:在Windows表单中加载声音异步

您的主要问题是所有音符都在播放,但是随后的笔记实际上在完成第一个之前就开始播放。因此,您只是听到最后一个。

使用playsync,它同步播放声音,如果您出于某种原因必须穿越List<>并说,请在播放之前对每个项目进行检查(嗯,至少,如果您将声音播放器推导到另一个类中,以便它实际上有需要检查的东西),您可以使用playsync调用的支票。

SoundPlayer sp = new SoundPlayer();
foreach(var note in music)
{
    sp.SoundLocation = note;
    bool everythingIsFine = false;
    // Logic for everythingIsFine;
    if(everythingIsFine){
        sp.PlaySync(); 
    }
}

相关内容

  • 没有找到相关文章

最新更新