NAudio 和 Midi 文件读取

Posted

技术标签:

【中文标题】NAudio 和 Midi 文件读取【英文标题】:NAudio and Midi file reading 【发布时间】: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”取决于机器。

【问题讨论】:

【参考方案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");

【讨论】:

感谢您的回复。你的伪代码真的帮助我弄清楚如何做我想做的事。

以上是关于NAudio 和 Midi 文件读取的主要内容,如果未能解决你的问题,请参考以下文章

使用 NAudio 从 MIDI 文件中读取音符

如何使用 NAudio 读取 MIDI 音符?

NAudio - 读取和写入 Wav 文件

使用 NAudio 在 MIDI 文件中设置 MIDI 速度

您如何确定 NAudio 1.7 中的 midi 文件持续时间(以条为单位)?

从 Java 中的 Midi 文件中读取 Midi 消息 [重复]