Midi文件中的Midi音符长度

3

在MIDI音乐中,关于音符长度有一些误解。我在Ableton Live中制作了一个简单的2全音符MIDI文件(整个文件只有1小节),然后将其导出并使用Python脚本(mididump.py)进行分析。

midi.Pattern(format=0, resolution=96, tracks=\
[midi.Track(\
[midi.TrackNameEvent(tick=0, text='examplemidi\x00', data=[101, 120, 97, 109, 112, 108, 101, 109, 105, 100, 105, 0]),
midi.TimeSignatureEvent(tick=0, data=[4, 2, 36, 8]),
midi.TimeSignatureEvent(tick=0, data=[4, 2, 36, 8]),
midi.NoteOnEvent(tick=0, channel=0, data=[65, 127]),
midi.NoteOnEvent(tick=192, channel=0, data=[60, 100]),
midi.NoteOffEvent(tick=0, channel=0, data=[65, 64]),
midi.NoteOffEvent(tick=192, channel=0, data=[60, 64]),
midi.EndOfTrackEvent(tick=0, data=[])])])

数据参数为[pitch,volume],已确认正确。我不理解的是“tick”。如果midi文件长度为284,则“Note On”会有意义。因为pitch = 60的音符从中间开始。但是,“Note Off”与它们的“Note On”在同一个“tick”上,而且曲目结束事件也在tick 0上。我认为我对midi定时工作方式的基本理解存在误解,但我无法看出如何从这些数据中推导出有关定时的信息。请帮忙解答。以下是该midi的十六进制代码,供感兴趣的人参考:
4d54 6864 0000 0006 0000 0001 0060 4d54
726b 0000 0039 00ff 0301 0000 ff58 0404
0224 0800 ff58 0404 0224 0800 9040 6460
903c 6400 8040 4060 803c 4000 9040 6460
8040 4000 9043 6460 8043 4000 ff2f 00

请和谢谢你,Mingman

2个回答

4

正如@CL所指出的那样,MIDI滴答声是相对于上一个事件而言的。有一个很好的StackOverflow答案(关于滴答声/绝对时间转换)作了更深入的解释。

如果多个事件同时发生,则第一个事件之外的每个事件都将具有0的滴答声值。第一个事件可能会有一个大于0的值,除非它发生在排列的开头。


1
MIDI文件使用增量时间,即一个滴答值相对于曲目中的前一个事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接