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

Posted

技术标签:

【中文标题】如何将midi从java程序发送到OSX上的IAC总线【英文标题】:How to send midi from a java program to an IAC bus on OSX 【发布时间】:2015-09-15 16:37:45 【问题描述】:

我正在尝试编写一个将 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 键盘作为输入设备连接到总线 1,但我没有看到任何事件。

看起来很简单,但据我所知,从 Java 发送时,IAC 设备从未收到任何 midi 消息,但该机制似乎在 Java 内部和 Java 外部都运行良好。

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

【问题讨论】:

【参考方案1】:

documentation for getReceiver() 说:

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

【讨论】:

这解决了问题。爱你! ;-) 使用它的程序在“github.com/la3lma/chordguesser”中。目前它完全混乱,但现在这个问题已经解决了,我希望有时间清理它并让它真正有用。

以上是关于如何将midi从java程序发送到OSX上的IAC总线的主要内容,如果未能解决你的问题,请参考以下文章

通过 MacOS 上的端口将 MIDI 数据发送到数码钢琴

Android 上的 MIDI:Java 和/或 AIR 库

将 iOS 应用程序的 midi 输出发送到 Garageband

在 Mac 上从 Python Mido 库输出 MIDI 声音

适用于 Windows 的 MIDI Patchbay? / 如何在 WinXP 上实时将 MIDI 从应用程序发送到 Reason [关闭]

如何在 OSX 上的 C++ 应用程序中播放合成器声音?