Некоторое время назад я создал приложение для клавиатуры , которое получает миди-саундбанк в качестве ресурса из банки и использует его для получения названий инструментов, содержащихся в банке звуков. Кажется, что это нормально работает на машинах, использующих Windows 7 с Sun Java и 6 Linux в Linux с Sun Java. Однако, это не работает на машинах с Windows XP, использующих ту же версию Java. Кажется, что происходит, что массив инструментов не был загружен, когда вызывается метод getInstrumentName()
. Массив инструментов заполняется в конструкторе класса DefaultControl
(второй пример кода). Может ли кто-нибудь помочь мне понять, почему это так, и почему это может зависеть от машины?
Я получаю название текущего инструмента следующим образом:
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();
}