0

我在这里发布我的问题,因为建议在 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”取决于机器。

4

1 回答 1

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");
}
于 2011-06-24T22:34:32.340 回答