我正在尝试编写一个程序,该程序将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);
       }
  }

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

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

我被困住了,所有帮助将不胜感激(源代码在工作时将在github上共享(发送到IAC将视为工作))。 :-)

最佳答案

documentation for getReceiver()说:

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

10-08 06:36