发送和接收 Java Midi Sysex 消息
Posted
技术标签:
【中文标题】发送和接收 Java Midi Sysex 消息【英文标题】:Sending and receiving Java Midi Sysex message 【发布时间】:2020-12-01 22:21:17 【问题描述】:我想使用 Java Sound API 发送和接收 SysEx 消息。
我可以向设备发送消息,但我想在命令发送后接收设备发送的 SysEx 消息。
这是我的代码:
try
MidiDevice device = MidiSystem.getMidiDevice(info);
byte[] dataAlone =
(byte) 0xF0,
(byte) 0xB0, (byte) 0x63, (byte) 0x00,
(byte) 0xB0, (byte) 0x62, (byte) 0x0C,
(byte) 0xB0, (byte) 0x60, (byte) 0x7F,
(byte) 0xF7
;
SysexMessage message1 = new SysexMessage(dataAlone, dataAlone.length);
device.open();
Receiver rcvr = device.getReceiver();
rcvr.send(message1, -1);
rcvr.close();
catch (InvalidMidiDataException | MidiUnavailableException e)
System.out.println(e);
当我发送此消息时,设备正在回复 SysEx 消息,我可以在我的计算机上运行的 midi 应用程序上看到该消息。
【问题讨论】:
需要实现Receiver
接口。另见Java MIDI - getting data from piano?
【参考方案1】:
这里是缺少的代码:
// To find the available Midi IN devices on your system, scan the available MidiDevices
// and test if (!(device instanceof Sequencer) && device.getMaxTransmitters() != 0)
// ...
inDevice.open();
// tIn will transmit Midi IN data. Don't forget to close it when no longer used
Transmitter tIn = inDevice.getTransmitter();
// Connect it to our MidiMessage handler
tIn.setReceiver(new MidiInMessageHandler());
// ...
class MidiInMessageHandler implements Receiver
@Override
public void send(MidiMessage message, long timeStamp)
if (message instanceof SysexMessage)
// Do something
@Override
public void close()
// Nothing
如果您需要更多示例代码,请查看我在 GitHub 上的应用程序 JJazzLab-X,尤其是 Midi
模块中的 JJazzMidiSystem.java
和 MidiUtilities.java
。
【讨论】:
谢谢,我们确实实现了 customReceiver,现在它可以工作了。以上是关于发送和接收 Java Midi Sysex 消息的主要内容,如果未能解决你的问题,请参考以下文章
Audiokit 似乎只接收前三个 sysex MIDI 消息