2011-04-18 70 views
18

前段時間,我做了一個keyboard application,它將一個midi soundbank作爲jar中的資源,並使用它獲取soundbank中包含的樂器名稱。這似乎在使用Windows 7與太陽Java 6和Linux使用太陽Java 6的機器上工作得很好。但是,這似乎不適用於使用Windows XP的機器使用相同版本的Java。似乎發生的情況是,調用getInstrumentName()方法時儀器陣列尚未加載。儀器數組被填充到DefaultControl類的構造函數中(第二個代碼示例)。有人能幫助我理解爲什麼會出現這種情況,爲什麼它似乎是機器相關的?midi鍵盤不適用於所有平臺

我得到當前的儀器名稱是這樣的:

data.setControls(new DefaultControls()); 
data.setKeyboard(new KeyboardPanel(data.getPressed())); 
data.getKeyboard().setInstrumentName(data.getControls().getInstrumentName()); 

我得到並加載這樣的音庫:

this.synth=MidiSystem.getSynthesizer(); 
synth.open(); 
synth.loadAllInstruments(
    MidiSystem.getSoundbank(
    getClass().getResourceAsStream("soundbank.gm"))); 

this.instrument=synth.getAvailableInstruments(); 
this.channels=synth.getChannels(); 

這是被稱爲加載的名稱的方式是這樣的:

public String getInstrumentName(){ 
    return instrument[selected_instrument].getName(); 
} 
+1

是否有例外?可能的JDK錯誤? http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4444193 – monojohnny 2011-04-18 13:47:03

+0

它的一個數組索引越界異常被拋出。它的奇怪之處在於,只有在沒有引發錯誤並且聲音庫已成功加載時纔會調用名稱。 – 2011-04-18 14:05:24

+0

這可能與你引用的錯誤有關,我會研究它。 – 2011-04-18 14:06:32

回答

1

在Java中,MIDI音色庫受許可限制並且不通過低價t適用於所有平臺(http://java.sun.com/products/java-media/sound/soundbanks.html),需要單獨下載和多步設置才能正常工作。

答案:Gervill

http://java.net/projects/gervill/pages/Home

Gervill被設計爲通用 合成爲Java。通過將 gervill.jar添加到類路徑中,您應該能夠使用MidiSystem.getSoundBank()加載SoundFonts/DLS 文件。 和MidiSystem.getSynthesizer()應該 返回Gervill實例 合成器。

這是一個開放源代碼的100%純java實現的通用MIDI音色庫。你只需在類路徑中放入gervill.jar即可。您的gm音效銀行將會提供給您的應用。

+0

我不確定這是否是問題。我正在從罐子裏讀取midi soundbank作爲資源。我不加載默認系統soundbank。這個問題似乎更像是一個類加載器問題,在某些操作系統上。當我嘗試調用getInstrumentName時,只有在實例化該類後纔會發生(該數組應該在構造函數中填充)。這已經在運行相同版本的Java的不同機器上測試過 – 2011-05-24 12:41:01