python 3 - jack-client - using write_mid_event - jack永远发送MID



我尝试使用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 C0程序更改(除非我调用jack。CallbackExit,但之后回调再也不会触发)

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

谁知道怎么解决这个问题?

谢谢你的帮助

我现在使用python-rtmidi来处理这个问题

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

然后将数据写入端口

这篇文章可能有点老了,看起来你已经弄清楚了,但我确实找到了一个解决方案:

midi客户端发送缓冲区中的任何内容,这意味着像write_mid_event这样的内容需要清除才能停止发送。因此,帮助我的是在我的过程开始的时候,我有;

outport.clear_buffer ()

希望有帮助;)

最新更新