C#设置持续时间并连续播放存储在arraylist中的声音
我使用以下播放方法播放存储在arraylist中的音符:C#设置持续时间并连续播放存储在arraylist中的声音,c#,arraylist,C#,Arraylist,我使用以下播放方法播放存储在arraylist中的音符: public void Play(Duration d){ int duration = 1; if (d == Duration.SemiBreve) { duration = 16; } else if (d == Duration.DotMin) {
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一样连续播放,但使用设置的持续时间,有什么建议吗?您不必在任何地方等待计时器。因此,在实践中,所有音符几乎同时播放,从而使最后一个音符可以有效地听到
更新:使用
System.Timers.Timer
类,方法是注册appeased
事件的处理程序,并在事件处理程序中逐个播放注释。这样可以避免冻结UI
另一个选项是在后台线程中播放,并使用线程.Sleep
等待。在这里,您必须确保根据UI的状态停止线程(即,用户关闭当前对话框等)
在任何一种情况下,为了避免竞争条件,您必须解决对
staff.Notes
的并发访问问题,或者制作一份副本以便播放。您必须添加一些逻辑,以便一次播放一个音符。试着让它工作,这样它在点击按钮后只播放一个音符。然后添加计时器。所以我猜我必须在按钮方法中等待计时器,而不是音乐。播放方法?如何等待计时器,所以使用timer.appeased?谢谢,如果问题很简单,请原谅,但是我以前从来没有使用过timer类,而且我一直在研究,因为我设法用一种非常简单的方法解决了它,我将主线程设置为睡眠时间与每个音符的计时器间隔时间相同(直到声音播放完毕)。这适合我的特殊需要,但是由于整个程序都被阻塞了,你能建议一个更好的方法吗?不管怎样,你的回答让我找到了解决办法,谢谢。