Mac OSX中的Java Midi破碎了?

我正在尝试在浏览器中播放midi,并且一直在使用在PC上运行良好的Java Applet。 它在OSX上非常不可靠,所以我写了一个简单的测试用例,它表现出同样的问题:

import javax.sound.midi.*; import java.io.InputStream; import java.io.IOException; import java.io.FileInputStream; import java.io.FileNotFoundException; public class MidiPlayer { public static void main(String[] args) { try { Sequencer sequencer = MidiSystem.getSequencer(); if (sequencer == null) throw new MidiUnavailableException(); sequencer.open(); FileInputStream is = new FileInputStream("sample.mid"); Sequence mySeq = MidiSystem.getSequence(is); sequencer.setSequence(mySeq); sequencer.start(); } catch (Exception e) { e.printStackTrace(); } } } 

听起来偶尔的消息会被丢弃。就像一个音符不会发射,随机音符将永远挂起。 这是OSX中的已知问题吗? 看起来Java似乎没有从Apple获得足够的爱。

如果有人有更好的解决方案在浏览器中播放Midi,我全都耳朵!

这似乎是一个两部分问题。 我也无法使用配备2011年中期OSX 10.7.5的iMac发送midi sysex。 我找到了一个解决方法 – 首先,我必须使用mmj jar和jnilib,其次我必须告诉我的代码使用-1的时间戳,而不是使用system.currentTimeMillis()。 在我的情况下,我发送实时sysex消息,因此-1的时间戳对我有用。 如果您正在处理midi音符开/关等,我不知道使用什么时间戳。也许时间戳是未来几毫秒? 我不知道。 但我知道我必须同时使用mmj并更好地控制我的时间戳。 在那之后,事情按预期工作。

来自mmj – Midi for Mac OS X上的java :

Apple的java Midi实现看起来有点半心半意。 它不考虑状态字节> = 0xF0的MIDI数据有效(即不能使用sysex,MIDI时钟,时间码等),忽略Midi事件的时间戳,设备名称默认只有端口的名称(没有提示这个端口所属的设备)并且可能还有其他缺失的东西。

虽然该API作为替代品提供,但OS X上的情况似乎很糟糕。