这是我的代码:
import midi
pattern = midi.read_midifile('midifile.mid')
for p in pattern:
for event, lastEvent in zip(p[1:], p):
if event.name == 'Note On' and lastEvent.name == 'Note On':
if event.channel == 1:
print(event.pitch, lastEvent.pitch)
举个例子,前 5 个音高是 57, 45, 65, 53, 52
意思是我想要
45, 57
65, 45
53, 65
52, 53
但是代码的输出是
45, 57
53, 65
64, 52
50, 62
提前致谢
最佳答案
我认为问题在于 .name
属性是否不全是 'Note on'
这意味着您正在将事件与上一个事件进行比较,而不是与 event.name == 'Note on'
的上一个事件进行比较
也许可以尝试一下:
import midi
pattern = midi.read_midifile('midifile.mid')
for p in pattern:
previous_event = p[0]
for event in p[1:]:
if event.name == 'Note on':
if event.channel == 1:
print(event.pitch, previous_event.pitch)
previous_event = event
我想做的是过滤 p 中的事件,仅查找 event.name == 'Note on' 的事件(尽管我确信有更简单的方法可以通过使用 p = [event for event in p if event.name == 'Note on']
之类的内容重新定义 p 来做到这一点
合并这意味着:
import midi
pattern = midi.read_midifile('midifile.mid')
for p in pattern:
p2 = [event for event in p if event.name == 'Note on'] # maybe should include and event.channel ==1 ?
for event, lastEvent in zip(p2[1:], p2):
if event.name == 'Note On' and lastEvent.name == 'Note On':
if event.channel == 1:
print(event.pitch, lastEvent.pitch)
关于python - 如何访问 MIDI 文件中的最后一个事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44800236/