python 3 -jack-客户端-使用write_midi_event - jack始终发送midi事件

au9on6nz  于 2022-11-26  发布在  Python
关注(0)|答案(2)|浏览(133)

我尝试使用pythonjack-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 C 0程序更改流(除非我调用jack.callbackExit,但之后回叫再也不会触发)
(我使用jack_midi_dump和midisnoop来监视python脚本输出)
有人知道怎么解决吗?
谢谢你的帮助

roejwanj

roejwanj1#

我现在使用python-rtmidi来处理这件事

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

然后将数据写入端口

xzv2uavs

xzv2uavs2#

这篇文章可能有点老了,看起来你已经把它弄明白了,但我确实找到了一个解决方案:
midi客户端正在发送缓冲区中的任何内容,这意味着需要清除write_midi_event之类的内容以停止发送。

输出端口.clear_buffer()

希望能有所帮助;)

相关问题