如何将 midi 从 java 程序发送到 OSX 上的 IAC 总线

Rmz*_*Rmz 3 java macos midi

我正在尝试编写一个程序,将 MIDI 消息发送到外部合成器。当使用 Java 中的默认合成器(Mac 上为 1.8)时,它确实可以工作,并且当连接到 Java 中的默认合成器时,每秒都会发出很好的 ping 声音。正如预期的那样,这是一个无聊的声音,但它确实验证了我能够制作由合成器解释为声音的短 midi 序列。

然后,我尝试将该信号路由到 IAC 设备,以便其他程序(包括合成器)拾取该信号,从而发出有趣的声音。然而,似乎我产生的所有事件都没有被 IAC 设备实际捕获。它们似乎没有被发送到 JVM 之外,或者即使是,它们也会以某种方式被丢弃。

我的问题很简单:有人这样做过吗?他们能告诉我他们做了什么吗?

本质上我的代码是这样做的:

final MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < infos.length; i++) {
       final MidiDevice device = MidiSystem.getMidiDevice(infos[i]);

       final String  deviceInfo = device.getDeviceInfo().getName();

       // My IAC device is called "Bus 1"
       if ("Bus 1".equals(deviceInfo)) {

          Receiver rcvr = device.getReceiver()
          ShortMessage myMsg = new ShortMessage();
          // Start playing the note Middle C (60),
          // moderately loud (velocity = 93).
         myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
         rcvr.send(myMsg, timeStamp);
       }
  }
Run Code Online (Sandbox Code Playgroud)

我通过将 IAC 设备连接到 MS-20 软合成器进行测试,没有产生任何声音。然后,我将“MockMidi”键盘连接到“Bus 1”IAC 设备,然后我就可以播放 MS-20 总线。然后,我尝试将 MockMidi 键盘作为输入设备连接到总线 1,但我没有看到任何事件。

看起来很简单,但据我所知,当从 Java 发送时,IAC 设备上从未收到任何 MIDI 消息,但该机制似乎在 Java 内部和 Java 外部都工作正常。

我被困住了,所有的帮助都将受到高度赞赏(源代码将在工作时在 github 上共享(发送到 IAC 将被视为工作))。:-)

CL.*_*CL. 5

getReceiver() 的文档说:

使用此方法获取Receiver不会打开设备。为了能够使用该设备,必须通过调用显式打开它open()