我正在尝试使用工具包分析 MIDI 文件python-midi
for python
(链接到存储库 https://github.com/vishnubob/python-midi).
基本上,我的问题是关于数据的解释我刚提取出来。
这是数据:
mididump.py HHOP-Drums.mid
midi.Pattern(format=0, resolution=96, tracks=\
[midi.Track(\
[midi.TrackNameEvent(tick=0, text='HHOP-Drums\x00', data=[72, 72, 79, 80, 45, 68, 114, 117, 109, 115, 0]),
midi.TimeSignatureEvent(tick=0, data=[4, 2, 36, 8]),
midi.NoteOnEvent(tick=0, channel=0, data=[60, 125]),
midi.NoteOnEvent(tick=0, channel=0, data=[71, 110]),
midi.NoteOffEvent(tick=24, channel=0, data=[60, 0]),
midi.NoteOffEvent(tick=0, channel=0, data=[71, 0]),
(...)
midi.NoteOffEvent(tick=12, channel=0, data=[71, 0]),
midi.NoteOffEvent(tick=0, channel=0, data=[72, 0]),
midi.NoteOnEvent(tick=0, channel=0, data=[72, 110]),
midi.NoteOffEvent(tick=24, channel=0, data=[72, 0]),
midi.EndOfTrackEvent(tick=0, data=[])])])
(我省略了大部分 midi.NoteOn/OffEvent 以缩短此问题中嵌入的代码。
此处提供了对该 MIDI 轨道的完整分析:http://pastebin.com/5emVhJWb http://pastebin.com/5emVhJWb.)
- 我不知道 a 有什么作用
data
现场midi.TrackNameEvent
代表。
- Secondly, a
data
field of midi.NoteOn/OffEvent
is quite obscure. According to the documentation of the python-midi
repo:
NoteOnEvent 捕获音符的开始,就像钢琴演奏者按下钢琴键一样。刻度是该事件发生的时间,音高是按下的琴键的音符值,力度表示按下琴键的力度。
NoteOffEvent 捕获音符的结尾,就像钢琴演奏者将手指从按下的钢琴琴键上移开一样。再说一次,滴答声是该事件发生的时间,音高是释放的音符,速度与现实世界没有类比,通常被忽略。速度为零的 NoteOnEvents 与 NoteOffEvents 等效。
所以,很容易猜测,如果midi.NoteOn/OffEvent
data
字段,我们可以这样解释:midi.NoteOnEvent(tick=0, channel=0, data=[note_number, velocity])
.
这是棘手的部分:在分析的循环中分配给 C1 的底鼓。根据MIDI 标准的解释 http://faydoc.tripod.com/formats/mid.htmC1 的音符编号是 12。但是,我们可以在分析的输出中看到,底鼓的音符编号是 71。
为什么会这样呢?
注意:此外,将此分析结果编码回 MIDI 后,底鼓似乎在 Logic(OS X 的音乐软件)中的 C1 上播放。