我尝试使用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 ()
希望有帮助;)