python-3.x - 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-rtmidi 来解决这个问题
midiout = rtmidi.MidiOut(rtapi=rtmidi.API_UNIX_JACK)
rtMidiOutputPorts=midiout.get_ports()
然后将数据写入端口
推荐阅读
- javascript - 定义两种返回类型时,属性“x”不存在
- python - 如何生成最有可能在给定句子中占据缺失标记位置的标记列表?
- ansible - Ansible如何找到inventory、group_vars、all.yaml、user_vars的位置
- javascript - 未捕获(承诺中)类型错误:无法读取 null 的属性“长度”
- facebook - Facebook Graph API webhook 未在 DM 中发送 GIF 图像附件
- graphql - 使用 `openapi-to-graphql` 构建的 TypeDef 在 Fastify 中暴露 GraphQL 的问题
- javascript - 简化 DynamoDB 代码(JavaScript API 文档客户端)
- mongodb - MongoDb 在使用聚合计算同一行时需要帮助
- lua - Computercraft 错误尝试在 turtle.inspectDown() 返回值上调用 nil
- python - GCP 自定义预测例程无法包含 setup.py 中指定的 jsonschema 依赖项