Mac OSX中的Java Midi破碎了吗?

时间:2011-11-16 08:50:34

标签: java macos 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,我会全力以赴!

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

来自mmj - Midi for java on Mac OS X

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

OS X上的情况看起来很糟糕,尽管该API是作为替代品提供的。