NAudio和Midi文件阅读

时间:2011-06-24 22:25:52

标签: .net midi naudio

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

1 个答案:

答案 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");
}