Python midi:如何检测来自合成器的同时输入?

Python midi:如何检测来自合成器的同时输入?,python,pygame,Python,Pygame,我正在使用合成器,通过pygame.midi检测音符输入 import pygame.midi def readInput(输入设备): 尽管如此: 如果输入_device.poll(): 事件=输入设备。读取(1)[0] 数据=事件[0] 时间戳=事件[1] 注:编号=数据[1] 速度=数据[2] 打印(数据[2]) 如果数据[1]==36和40以及43和46:#不工作 打印(“chord=Cmaj7”) 其他: 打印(数据[2]) 如果uuuu name uuuuuu='\uuuuuuu m

我正在使用合成器,通过pygame.midi检测音符输入

import pygame.midi
def readInput(输入设备):
尽管如此:
如果输入_device.poll():
事件=输入设备。读取(1)[0]
数据=事件[0]
时间戳=事件[1]
注:编号=数据[1]
速度=数据[2]
打印(数据[2])
如果数据[1]==36和40以及43和46:#不工作
打印(“chord=Cmaj7”)
其他:
打印(数据[2])
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
pygame.midi.init()
my_input=pygame.midi.input(1)
readInput(我的输入)

音符正在工作,但我如何检测同时输入36+40+43+46,知道输入36=c、40=e和43=g来实现这一点?好的,您需要了解midi是如何工作的。当任何合成器键的状态发生变化(例如,键被按下或释放)时,会触发MIDI事件(input_device.poll()为True)。发生这种情况时,您的数据变量包含带有[状态、注释、速度等(我无法识别)]的列表。还有15个频道。我发现按键调用状态128+通道号,按键释放调用状态144+通道号的事件。你必须自己记录实际压过的音符。以下是您尝试执行的操作的示例代码:

pressed = []
def readInput(input_device, channel):
    while True:
        if input_device.poll():
            event = input_device.read(1)[0]
            data = event[0]
            # [state, note, velocity, something(always 0 for me)]
            timestamp = event[1]
            if data[0] == 128 + channel:  # note off on channel data[0]-128
                if data[1] in pressed:
                    pressed.remove(data[1])
            if data[0] == 144 + channel:  # note on on channel data[0]-144
                if not data[1] in pressed:
                    pressed.append(data[1])

            if all(el in pressed for el in [36, 40, 43, 46]):
                print("chord = Cmaj7")