python - 如何访问 MIDI 文件中的最后一个事件?

标签 python midi

这是我的代码:

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/

相关文章:

python - seaborn color_palette 作为 matplotlib 颜色图

python - Matplotlib 动画太慢(~3 fps)

C# XNA 生成 MIDI

Java MIDI 设备列表重复

python - 使用 ctypes 在 python 中调用 c 函数

python - 如何使用 pandas 将具有多个值的字段解压到行中

python - 将 unicode 字符编码为 un​​icode 转义序列

iphone - 适用于 iOS 的简单嵌入式 MidiSynth?

javascript - 我如何使用 midi.js 和 jasmid.js?

java - 如何控制 MIDI 序列的音量