Axe*_*xel 2 c# for-loop list piano soundplayer
我正在玩一些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);
}
Run Code Online (Sandbox Code Playgroud)
现在,我希望遍历循环以一次性播放所有单击的键.我这样做如下(当用户点击播放按钮时)
int k = 0;
for (k = 1; k < music.Count; k++)
{
SoundPlayer sp = new SoundPlayer();
sp.SoundLocation = music[k];
sp.Play();
}
Run Code Online (Sandbox Code Playgroud)
问题是,每当点击播放按钮时,只播放按下的最后一个音符.但是,当我调试时,不知何故,所有音符都被播放.有任何想法吗?
根据MSDN,这是Play方法的描述:
使用新线程播放.wav文件,如果尚未加载,则首先加载.wav文件.
因此,无论何时调用Play,它都是异步运行的,并且循环继续执行下一个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();
}
Run Code Online (Sandbox Code Playgroud)
请注意,for循环中的索引也应该从0开始
| 归档时间: |
|
| 查看次数: |
246 次 |
| 最近记录: |