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 文件中设置 MIDI 速度