我正在尝试在浏览器中播放 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 音符开/关等,我不知道要使用什么时间戳。也许时间戳是 future 几毫秒?我不知道。但我知道我必须同时使用 mmj 并更好地控制我的时间戳。之后,一切都按预期进行。
关于Mac OSX 中的 Java Midi 损坏了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8148898/