我正在尝试使用 javax.sound 包中的 midi 类与 USB midi 控制器通信。我成功地从设备获得了输入,但我不知道如何与设备通信。该设备是生动的OhmRGB。根据 wiki,我应该发送一些 SysEx 消息以获取带有参数的响应。我以前没有使用过 java 库,所以也许我以错误的方式使用它。您将看到下面的方法从设备请求一些数据,但设备不响应任何系统消息。
伪代码(jython):
class Communicator:
def __init__(self):
self.outputs = []
self.inputs = []
self.input = None
self.output = None
def getMidiDevices(self):
devices = MidiSystem.getMidiDeviceInfo()
for dev in devices:
midi = MidiSystem.getMidiDevice(dev)
# get outputs
if midi.getMaxReceivers() != 0: #(-1 or positive)
self.outputs.append(dev)
if midi.getMaxTransmitters() != 0:
self.inputs.append(dev)
def openOutput(self, dev): #!right device resolved somewhere
self.output = MidiSystem.getMidiDevice( dev )
self.output.open()
def openInput(self, dev):
self.input = MidiSystem.getMidiDevice( dev )
inReceiver = SomeReciever()
self.input.getTransmitter().setReceiver(inReceiver)
self.input.open() #input open and receiver print messages from dev.
def requestDevice(self):
device = self.resolveOutput()
self.openOutput(device)
data = [240, 0, 1, 97, 0, 7, 8, 247]
_bytes = bytearray(b"")
for i in data: _bytes.append(i)
# create message from array
message = SysexMessage(str(_bytes), len(_bytes)) # it works correctly
self.output.getReceiver().send(message,-1L)
self.output.close()
communacate = Communicator()
communacate.openInput()
time.sleep(2)
communicate.requestDevice()
当我打开输入时,接收器类处理传入的 midi 消息。当我请求设备时,我看不到来自设备的任何响应(我希望它在输入接收器上)。我请求了所有可用的输出端口,甚至在任何情况下都在输入接收器上发送了消息。我也在java中复制了它并得到了相同的结果。我认为我使用错误的方式从设备获取响应。
非常感谢,
安东