2011-04-18 11 views
18

Hace un tiempo hice keyboard application que obtiene un banco de sonidos midi como recurso de un jar, y lo usa para obtener los nombres de los instrumentos contenidos en el banco de sonidos. Esto parece funcionar bien en máquinas que usan Windows 7 con soles java 6 y en Linux usando soles java 6. Sin embargo, esto no parece funcionar en máquinas que usan Windows XP usando la misma versión de java. Lo que parece estar sucediendo es que la matriz de instrumentos no se ha cargado cuando se llama al método getInstrumentName(). El conjunto de instrumentos se rellena en el constructor de la clase DefaultControl (segundo ejemplo de código). ¿Podría alguien ayudarme a entender por qué sería este el caso, y por qué parece ser dependiente de la máquina?midi keyboard no funciona en todas las plataformas

me sale el nombre del instrumento actual de la siguiente manera:

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

me sale y cargar el banco de sonidos como esto:

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

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

Este es el método que se llama para cargar el nombre es la siguiente:

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

¿Alguna excepción? Posible error JDK? http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4444193 – monojohnny

+0

Es una excepción de índice de matriz fuera de límites que se lanza. Es extraño porque el nombre get solo se invocaría si no se lanzaron errores y el banco de sonidos se cargó correctamente. –

+0

Esto podría estar relacionado con el error al que hizo referencia. Lo investigaré. –

Respuesta

1

Los bancos de sonido MIDI, en Java, están sujetos a restricciones de licencia y no se envían por defecto t para todas las plataformas (http://java.sun.com/products/java-media/sound/soundbanks.html) y requiere una descarga por separado y una configuración de varios pasos para funcionar.

La respuesta: Gervill

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

Gervill fue diseñado para ser genérico sintetizador para Java. Al agregar gervill.jar a su classpath, debería poder cargar archivos SoundFonts/DLS usando MidiSystem.getSoundBank(). Y MidiSystem.getSynthesizer() debería instancia de devolución de Gervill Sintetizador.

Es una implementación java 100% pura de código abierto de los bancos de sonidos MIDI generales. Simplemente suelta gervill.jar en el classpath y listo. Sus bancos de sonidos gm estarán disponibles para su aplicación.

+0

No estoy seguro de que ese sea el problema. Estoy leyendo el banco de sonidos midi como un recurso del jarrón. No estoy cargando el banco de sonidos de los sistemas por defecto. El problema parece ser más un problema de cargador de clases, en algunos sistemas operativos. Cuando trato de llamar al getInstrumentName que solo aparece después de que la clase ha sido instanciada (la matriz debe ser poblada dentro del constructor). Esto ha sido probado en diferentes máquinas que ejecutan la misma versión de Java –

Cuestiones relacionadas