对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=[])])])
此分析仪的数据参数为[音高,音量]。这些都是正确的。我不明白的部分是" tick"。看起来如果midi文件的长度是284,那么" Note On" s会有意义。看看音高= 60音符是如何开始的。但" Note Off" s" tick"作为他们的" Note On" s,以及赛道结束事件是在刻度0上。我想我对midi计时的工作方式有一个基本的误解,但我不知道如何从时间推断出有关时间的信息这个数据。 HALP。对于那些感兴趣的人来说,这是Hex的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
答案 0 :(得分:2)
正如@CL所说,MIDI刻度与前一个事件有关。有一个很棒的StackOverflow答案解释了tick/absolute time conversion in a bit more depth。
如果同时发生多个事件,则除第一个事件之外的每个事件都将具有0的刻度值。第一个事件可能具有大于0的值,除非它出现在排列的开头。< / p>
答案 1 :(得分:1)
MIDI文件使用增量时间,即刻度值相对于曲目中的上一个事件。