使用 mido 库的绝对 MIDI 刻度值
Posted
技术标签:
【中文标题】使用 mido 库的绝对 MIDI 刻度值【英文标题】:Absolute MIDI tick value using mido library 【发布时间】:2020-04-13 13:06:53 【问题描述】:我正在使用Mido library 在 python 中读取一个简单的 MIDI 文件。
我的 MIDI 文件如下:https://www.dropbox.com/s/t80kg9l2k525g0h/file.mid?dl=0
这只是一个我用基本音符创建的虚拟 MIDI 文件。
我用 Mido 库打开它并打印它的内容:
from mido import MidiFile
mid = MidiFile('file.mid')
for i, track in enumerate(mid.tracks):
print('Track : '.format(i, track.name))
for msg in track:
print(msg)
这是我得到的:
Track 0:
<meta message track_name name='\x00' time=0>
<meta message time_signature numerator=4 denominator=4 clocks_per_click=36 notated_32nd_notes_per_beat=8 time=0>
<meta message time_signature numerator=4 denominator=4 clocks_per_click=36 notated_32nd_notes_per_beat=8 time=0>
note_on channel=0 note=60 velocity=100 time=0
note_on channel=0 note=64 velocity=100 time=0
note_off channel=0 note=60 velocity=64 time=384
note_on channel=0 note=62 velocity=100 time=0
note_on channel=0 note=67 velocity=100 time=0
note_off channel=0 note=62 velocity=64 time=384
note_off channel=0 note=64 velocity=64 time=0
note_on channel=0 note=64 velocity=100 time=0
note_off channel=0 note=67 velocity=64 time=0
note_off channel=0 note=64 velocity=64 time=384
note_on channel=0 note=67 velocity=100 time=0
note_on channel=0 note=66 velocity=100 time=384
note_off channel=0 note=67 velocity=64 time=0
note_off channel=0 note=66 velocity=64 time=384
note_on channel=0 note=67 velocity=100 time=0
note_off channel=0 note=67 velocity=64 time=384
note_on channel=0 note=69 velocity=100 time=0
note_off channel=0 note=69 velocity=64 time=384
note_on channel=0 note=71 velocity=100 time=0
note_on channel=0 note=60 velocity=100 time=384
note_off channel=0 note=71 velocity=64 time=0
note_off channel=0 note=60 velocity=64 time=384
note_on channel=0 note=62 velocity=100 time=0
note_off channel=0 note=62 velocity=64 time=384
note_on channel=0 note=64 velocity=100 time=0
note_off channel=0 note=64 velocity=64 time=375
note_on channel=0 note=67 velocity=100 time=9
note_on channel=0 note=66 velocity=100 time=384
note_off channel=0 note=67 velocity=64 time=0
note_off channel=0 note=66 velocity=64 time=384
note_on channel=0 note=67 velocity=100 time=0
note_off channel=0 note=67 velocity=64 time=384
note_on channel=0 note=69 velocity=100 time=0
note_off channel=0 note=69 velocity=64 time=384
note_on channel=0 note=71 velocity=100 time=0
note_off channel=0 note=71 velocity=64 time=384
<meta message end_of_track time=0>
做一些实验,我有点明白时间是以相对于前一个事件的刻度表示的(note_on - note_off)。
如何使用绝对时间参考(以滴答声)重新排序笔记?
我想要一个我的笔记的绝对时间线,但我不知道如何从我拥有的数据中“提取”它。
有没有其他库已经实现了这个功能?我看到了这个库:Python-midi,但不幸的是它只适用于 Python 2。
【问题讨论】:
【参考方案1】:增量时间不是相对于相应的note-on事件,而是相对于同一轨道中的前一个事件。
只需按顺序将所有增量时间相加即可。
【讨论】:
我能问你“track”是什么意思吗?我也在库的文档代码中阅读过它,但我无法弄清楚它代表什么 @MattiaSurricchio 在使用库之前,您需要先阅读标准 MIDI 文件规范。 MIDI 文件包含包含事件的轨道块。一个事件的绝对时间是所有先前事件的增量时间之和。 @Maxim 你有这些资源的有用链接吗?我尝试了几个来源,但我发现它们非常模棱两可且难以理解。非常感谢任何帮助 the official specification【参考方案2】:不幸的是,绝对 midi 刻度值尚未作为功能实现... https://github.com/mido/mido/issues/185
【讨论】:
以上是关于使用 mido 库的绝对 MIDI 刻度值的主要内容,如果未能解决你的问题,请参考以下文章
python mido MIDI包中使用MultiPort的问题
在 Mac 上从 Python Mido 库输出 MIDI 声音
使用 Python Mido 库选择 GM MIDI Level 2 乐器