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

时间:2015-09-15 16:37:46

标签: 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);
       }
  }

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

看起来很简单,但据我所知,当从Java发送时,IAC设备上没有接收过midi消息,但是这种机制似乎在java和Java之外都能正常工作。

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

1 个答案:

答案 0 :(得分:3)

documentation for getReceiver()说:

  

使用此方法获取(4*x*x*x + 8*x*x + 9*x - 18) / (std::abs(7 – x*x*x) + std::sqrt(3*x*x + 18))不会打开设备。为了能够使用该设备,必须通过调用Receiver明确打开它。