我正在尝试在浏览器中播放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似乎没有从苹果那里得到足够的关爱。
如果有人有更好的解决方案在浏览器中播放Midi,我洗耳恭听!
发布于 2012-11-24 07:22:07
这似乎是一个两部分的问题。我也无法使用2011年年中配备了OSX10.7.5的iMac发送midi sysex。我确实找到了一个解决办法--首先,我必须使用mmj jar和jnilib的,其次,我必须告诉我的代码使用-1的时间戳,而不是使用system.currentTimeMillis()。在我的例子中,我发送的是实时sysex消息,因此时间戳-1对我来说是有效的。我不知道如果你正在处理midi,音符,开/关等等,应该使用什么时间戳,也许时间戳是未来的毫秒?我不知道。但我知道我必须同时使用mmj和更好地控制我的时间戳。在那之后,事情就像预期的那样工作。
发布于 2011-11-18 14:03:18
来自mmj - Midi for java on Mac OS X
苹果公司(
)的java Midi实现看起来有点半心半意。它不会将状态字节为>= 0xF0的MIDI数据视为有效(即不适用于sysex、MIDI时钟、时间码等),忽略Midi事件上的时间戳,设备名称将默认仅为端口名称(没有关于此端口所属设备的提示),并且可能会丢失类似的其他内容。
OS上的情况似乎很糟糕,尽管MIDI API是作为替代品提供的。
https://stackoverflow.com/questions/8148898
复制相似问题