发送和接收 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.javaMidiUtilities.java

【讨论】:

谢谢,我们确实实现了 customReceiver,现在它可以工作了。

以上是关于发送和接收 Java Midi Sysex 消息的主要内容,如果未能解决你的问题,请参考以下文章

Audiokit 似乎只接收前三个 sysex MIDI 消息

使用 Arduino 发送 MIDI SysEx 消息?

SysEx 不会发送字节“AD”

Alesis QS MIDI Sysex 数据转换

如何从音量级别创建 MIDI Sysex Master Volume 消息?

使用 Swift 和 CoreMIDI 发送和接收 MIDI