首页 > 解决方案 > python 3 - jack-client - 使用 write_midi_event - jack 一直发送 midi 事件

问题描述

当我单击按钮时,我尝试使用 python jack-client模块发送程序更改 midi

这是代码的简化版本:

def process_callback(frames: int):
    global midiUi
    if(midiUi is not None):
        midiUi.process_callback(frames)    

class MidiUi:
    
    def __init__(self):

        self.client = jack.Client('MidiUi')
        self.client.set_process_callback(process_callback)
        self.client.activate()

    def sendProgramChange(self):
        self.midiQueue.append([0xC0,0])
        
    def process_callback(self,frames: int):

        while(len(self.midiQueue)>0):
            data = self.midiQueue.pop()
            self.outMidiPort.clear_buffer()
            buffer = self.outMidiPort.reserve_midi_event(0,len(data))
            buffer[:] = bytearray(data)
            self.outMidiPort.write_midi_event(0,buffer) # this only happens once yet midi input receives tons of program changes events 
            #raise jack.CallbackExit

midiUi = MidiUi()

while True:
    ....
    #some button calls midiUi.sendProgramChange()

write_midi_event仅在按下按钮时调用一次,

但显然目标midi端口接收到midi C0程序更改的连续流(除非我调用jack.CallbackExit,但随后回调永远不会再次触发)

(我使用 jack_midi_dump 和 midisnoop 监控我的 python 脚本输出)

有谁知道如何解决这个问题?

感谢您的帮助

标签: python-3.x

解决方案


我现在使用 python-rtmidi 来解决这个问题

midiout = rtmidi.MidiOut(rtapi=rtmidi.API_UNIX_JACK)
rtMidiOutputPorts=midiout.get_ports()

然后将数据写入端口


推荐阅读