如何使用 NAudio 读取 MIDI 音符?

Posted

技术标签:

【中文标题】如何使用 NAudio 读取 MIDI 音符?【英文标题】:How to read MIDI notes with NAudio? 【发布时间】:2013-06-02 14:05:48 【问题描述】:

我需要读取 MIDI 文件以便对音符进行进一步处理。

我尝试像这样使用 NAudio 这样做

MidiFile midi = new MidiFile("Test.mid");
foreach (MidiEvent note in midi.Events[1])

    Console.Write(note.AbsoluteTime.ToString().PadRight(10));
    Console.WriteLine(note.DeltaTime);

我希望得到音符的开头和持续时间,但我得到了奇怪的值,从 34654 开始(为什么?):

问题:

我需要每个 MIDI 音符和

开始时间 长度 频道索引

如何使用 NAudio 获得正确的值?如果您对其他库有任何建议,请随时提出建议。

【问题讨论】:

查看 NAudio 源代码附带的音频文件浏览器演示应用程序。这正是您对 MIDI 文件所追求的 ^ naudio.codeplex.com/SourceControl/latest#AudioFileInspector/… 对于任何找不到它的人。 opensebj.blogspot.co.uk/2009/09/… 也是一个很好的资源。 【参考方案1】:

midi 文件规范适用于每个事件的增量时间。所以 0 的增量时间意味着与前一个事件同时发生。 delta-time 代表多少实际时间取决于 midi 文件头中的信息。

以下是有关 MIDI 文件内部工作原理的一些信息。 http://home.roadrunner.com/~jgglatt/tech/midifile.htm

希望对你有帮助。

【讨论】:

所以 delta time 0 意味着和以前一样。为什么绝对时间以 34654 之类的值开头? 另外,这里的暂停是如何表示的? 好吧,没关系。控制台只是将其切断。我认为您提供的信息足以让我接受。谢谢! 那个网站一直在移动。 blitter.com/~russtopia/MIDI/~jglatt/files/midifile.htm

以上是关于如何使用 NAudio 读取 MIDI 音符?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 NAudio.Midi 播放音符

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

如何使用 Nadio 获取 midi 事件的实时时间

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

使用 NAudio 演奏和弦的最佳方式

从 Arduino Yun 上的 USB 接口获取 MIDI 音符