c# - 如何获得 MIDI 事件的准确时间

标签 c# midi naudio

我正在尝试读取一个 MIDI 文件,并且我想在 C# 中从中确定 NoteOn 事件的确切时间。
我尝试使用绝对时间,但输出类似于 256632。
这个号码是多少? 这是我返回时间的代码行:

(note as NoteOnEvent).AbsoluteTime

最佳答案

MIDI 文件只包含增量时间。在每个 MIDI 事件之前作为可变长度值包含在 1 到 4 个字节之间。您正在使用的库有助于为您提供 AbsoluteTime 属性。简单地通过对每个事件的增量时间求和来计算。

单位是“delta ticks”。增量节拍的长度不是固定值,它在 MIDI 文件头中指定。 NAudio 将其公开为 MidiFile.DeltaTicksPerQuarterNote 属性。因此,您需要用从 AbsoluteTime 获得的值除以该值,以获得歌曲开头的音符位置。

这当然还是一个相对值,要看歌曲的节奏。您演奏四分音符的速率。推荐的速度也包含在文件中,它是 NAudio 中的 TempoEvent。它的 MicrosecondsPerQuarterNote 属性告诉您后续事件的四分音符应该有多长。请注意,一首歌曲中可能有多个速度事件。

关于c# - 如何获得 MIDI 事件的准确时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070510/

相关文章:

java - JNI4Net C# 到 Java

c# - 为什么 Dictionary[index] 会抛出 KeyNotFoundException 但 Hashtable[index] 不会?

java - 从数组中检索特定范围的数据 (Java)

c# - 将 2 channel wav 文件拆分为单 channel wav 文件时音频失真

c# - 使 Stream 可搜索的 Stream 包装器?

c# - 如何同时声明和填充集合?

c# - 动态加载程序集的多个版本

c - 为什么 MIDI 音序器在 Windows 10 上无法第二次播放

flash - 迷笛 |我如何判断弦的声音何时是 Pizzicato(一种手指捏的噪音)

c# - 来自 NAudio 的原始音频