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

ody*_*yse 4 c# midi naudio

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

(note as NoteOnEvent).AbsoluteTime
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 11

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

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

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

  • 只有节奏不改变时,该计算才是正确的.如果是,则必须计算相对于上次速度变化的时间:`((note.AbsTime - lastTempoEvent.AbsTime)/ midi.ticksPerQuarterNote)*tempo + lastTempoEvent.RealTime`.(上面的公式是速度事件在时间0的特殊情况.) (5认同)