我正在尝试编写一个程序,该程序将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()
显式打开它。