【问题标题】:NAudio and Midi file readingNAudio 和 Midi 文件读取
【发布时间】:2011-06-24 22:25:51
【问题描述】:

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

【问题讨论】:

    标签: .net midi naudio


    【解决方案1】:

    伪代码:

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

    【讨论】:

    • 感谢您的回复。你的伪代码真的帮助我弄清楚如何做我想做的事。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多