我尝试使用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脚本输出)
有人知道怎么解决吗?
谢谢你的帮助
2条答案
按热度按时间roejwanj1#
我现在使用python-rtmidi来处理这件事
然后将数据写入端口
xzv2uavs2#
这篇文章可能有点老了,看起来你已经把它弄明白了,但我确实找到了一个解决方案:
midi客户端正在发送缓冲区中的任何内容,这意味着需要清除write_midi_event之类的内容以停止发送。
输出端口.clear_buffer()
希望能有所帮助;)