2011-11-16 8 views
5

私はブラウザ内でMIDIを再生しようとしており、PC上で正常に動作するJavaアプレットを使用しています。 OSX上での非常に信頼できないが、私は同じ問題を示す簡単なテストケースを書いた:noteoffは発生しませんのように時折メッセージが..ドロップなっているようMac OSXのJavaミディは壊れていますか?

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を再生するためのより良い解決策を持っている場合、私はすべての耳です! mmj - Midi for java on Mac OS Xから

+0

ホットリンクできるMIDIを使用して問題を再現できますか?例えば。私の[media page](http://pscode.org/media/#sound)には12Kb以下の2つがあります。 –

+0

[サンプルファイルはこちら](http://dl.dropbox.com/u/29939553/november%20rain.mid) 私は仕事中に私のマックを去った。私はあなたのファイルをテストした後、明日あなたに戻ってきます。問題はランダムに発生するようだ!私はそれを確実に再現することができませんでした。少なくとも30秒ごとに1回以上発生します。 – Ben

+0

Andrew、リンクしたEverLoveとAftrMdntのテストファイルを使用して、問題を非常に確実に再現することができました。シンセサイザーを掛けることなく、20秒以上演奏することはできません(音符はぶら下げられ、新しい音符コマンドも送られません)。この問題はランダムに発生するようです。 – Ben

答えて

3

AppleのJavaのMIDIインプリメンテーションは、ビット中途半端表示されます。ステータスバイト> = 0xF0のMIDIデータは有効ではない(つまり、sysex、MIDIクロック、タイムコードなどでは動作しない)、MIDIイベントのタイムスタンプを無視する、デバイス名はデフォルトでポート名のみになる(ヒントなしこのポートが属しているデバイス)、他にも欠けていることがあります。

OS Xの状況はMIDIのように思えますが、そのAPIは代替として提供されています。

+0

答えをありがとう。結局のところ、私はこの問題を経験しているようです(http://stackoverflow.com/questions/7749172/why-java-midi-synth-on-mac-stop-playing-notes)。私は今MMJを探していますが、問題はシンセサイザーの中にあるようです。 – Ben

+0

(何らかの理由で私はあなたのコメントは通知されませんでしたが、とにかく気がついたことがあります)MMJもシンセサイザーを供給していませんか?私はそれを深く見ていない。 –

+0

私はソースをかなり包括的に辿り、シンセサイザーを見つけることができませんでした。ハードウェアMIDIデバイスと通信するためのライブラリのように見えます。それから、JNIとCoreMIDIに関するナッツをもう一度知りました!私はGoogleでも例を見つけることができませんでした。私はコンパイルするためにアーカイブのテストを受けましたが、それが提供したのはすべてミディ・キーボードでした。 mmjでのオーディオ合成のオプションはありませんでした。私はネイティブオプションでオーディオ出力を得ることができました。本当に落胆しているもの。 – Ben

4

これは2つの部分の問題のようです。私もmidi sysexに2011年半ばのOSX 10.7.5搭載のiMacを使用して送信できませんでした。私は回避策を見つけました - まず、mmj jarとjnilibを使用しなければなりませんでした。そして、第二に、コードに-1のタイムスタンプを使用し、system.currentTimeMillis()を使用しないように指示しなければなりませんでした。私の場合、私はリアルタイムのsysexメッセージを送信しています。したがって、-1のタイムスタンプは私のために働きます。私はあなたがmidiノートのオン/オフなどを扱っている場合、どのタイムスタンプを使うのか分かりません。おそらく、タイムスタンプは将来ミリ秒ですか?知りません。しかし、私はmmjを使い、私のタイムスタンプをより良くコントロールしなければならないことを知っています。その後は、期待どおりに動作します。

関連する問題