2011-11-16 46 views
5

我試圖在瀏覽器中播放midi,並且一直在使用可在PC上正常工作的Java Applet。它在OSX極不可靠,所以我寫了表現出同樣的問題,一個簡單的測試用例:Mac OSX中的Java Midi Broken?

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(); 
     } 
    } 
} 

這聽起來像偶爾的消息越來越下降了。像一個noteoff不會閃光,並且隨機注會永遠堅持下去。這是OSX中的一個已知問題嗎?似乎Java現在還沒有從蘋果那裏獲得足夠的愛。

如果任何人有更好的解決方案來在瀏覽器中播放Midi,那麼我都是耳朵!

+0

您可以使用可以熱鏈接的MIDI重現問題嗎?例如。在我的[媒體頁面](http://pscode.org/media/#sound)上有2個12Kb以下的可用空間。 –

+0

[這是一個示例文件](http://dl.dropbox.com/u/29939553/november%20rain.mid) 我離開了我的mac工作;在我測試你的文件後,明天再回到你身邊。這個問題似乎隨機發生!我無法可靠地重現它。它至少每30秒發生一次。 – Ben

+0

Andrew,我已經能夠非常可靠地使用您鏈接的EverLove和AftrMdnt測試文件重新創建問題。如果沒有合成器懸掛,我無法播放超過20秒鐘(音符懸掛,沒有發送新的音符命令)。這個問題似乎是隨機發生的。 – Ben

回答

3

mmj - Midi for java on Mac OS X

蘋果公司的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上也找不到任何示例。我在檔案中得到了測試,但它提供的只是一個midi鍵盤。沒有用mmj進行音頻合成的選項;我只設法使用本機選項獲得音頻輸出。真的令人沮喪的東西。 – Ben

4

這似乎是一個兩部分問題。我也無法使用裝備有2011年中期OSX 10.7.5的iMac發送midi sysex。我找到了一個解決方法 - 首先,我必須使用mmj jar和jnilib's,其次我必須告訴我的代碼使用-1的時間戳,而不使用system.currentTimeMillis()。在我的情況下,我發送實時sysex消息,因此時間戳-1適用於我。如果你正在處理MIDI音符的開/關等,我不知道要使用什麼時間戳。或許時間戳是毫秒到未來?我不知道。但我知道我必須同時使用mmj和更好地控制我的時間戳。之後,事情按預期工作。