我在这里发布我的问题,因为建议在NAudio页面(http://naudio.codeplex.com/documentation)上这样做。
鉴于我已经加载了一个带有NAudio的.mid文件,我想在适当的时间逐步完成一个轨道的事件。在达到“NoteOn”事件时,我想给我的控制台写一些类似“Beep”的内容。这样我就可以显示.mid文件的简单活动。详细地说,如何及时正确地逐步浏览文件的事件?
我正在使用vsC#2008而且NAudio的.dll工作正常。我已经加载了一个带库的midi文件,可以提取轨道信息和所有内容,但我只是不确定如何在时间方面使用它。我想我需要用提供的“绝对时间”或“增量时间”值来做某事。谢谢你的帮助。
编辑: 经过非常有益的回应,我能够弄清楚如何做我想做的事。
double convertAbsoluteTimeToMilliseconds = 1.0 / 30.0;
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
foreach (MidiEvent note in _f1.Events[1])
{
while (note.AbsoluteTime * convertAbsoluteTimeToMilliseconds > sw.ElapsedMilliseconds) { }
if(note.CommandCode==MidiCommandCode.NoteOn)
Console.Write ("beep ");
}
sw.Stop();
如果有人知道另一种方法,请告诉我。在一段时间内使用睡眠导致响应由于某种原因变得越来越慢。这似乎工作正常。另外,我确信“convertAbsoluteTimeToMilliseconds”与机器有关。
答案 0 :(得分:2)
伪代码:
DateTime offset = DateTime.Now; /Start playing here.
foreach (MidiEvent note in events)
{
DateTime beepAt = offset.AddMilliseconds (note.AbsoluteTime * convertAbsoluteTimeToMilliseconds);
System.Threading.Thread.Sleep (beepAt - offset);
Console.WriteLine ("beep");
}