2011-11-16 14 views
5

Estoy tratando de jugar midi dentro de un navegador, y he estado usando un Applet de Java que funciona muy bien en las PC. Es extremadamente poco fiable en OSX, así que escribió un caso de prueba simple que presenta el mismo problema:Java Midi en Mac OSX ¿Roto?

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

Suena como el mensaje de vez en cuando se está cayó .. Como un NoteOff no se disparará, y una nota al azar espera para siempre ¿Es este un problema conocido en OSX? Parece que Java no está recibiendo suficiente amor de Apple en estos días.

Si alguien tiene una mejor solución para jugar a Midi en un navegador, ¡soy todo oídos!

+0

¿Se puede reproducir el problema utilizando un MIDI que se puede vincular en caliente? P.EJ. hay 2 por debajo de 12 Kb disponibles en mi [página multimedia] (http://pscode.org/media/#sound). –

+0

[aquí hay un archivo de muestra] (http://dl.dropbox.com/u/29939553/november%20rain.mid) Dejé mi mac en el trabajo; Contáctese con usted mañana después de que pruebe sus archivos. ¡El problema parece ocurrir al azar sin embargo! No he podido reproducirlo de manera confiable. Sucede al menos una vez cada 30 segundos más o menos. – Ben

+0

Andrew, he podido recrear el problema de manera muy confiable con los archivos de prueba EverLove y AftrMdnt a los que se ha vinculado. No puedo tocar más de 20 segundos sin el sintetizador colgando (las notas se dejan colgando, tampoco se envían nuevos comandos de notas). El problema parece ocurrir al azar. – Ben

Respuesta

3

De mmj - Midi for java on Mac OS X:

java aplicación de Midi de Apple parece un poco a medias. No considera que los datos MIDI con bytes de estado> = 0xF0 sean válidos (es decir, no funcionen con sysex, reloj MIDI, código de tiempo, etc.), ignora las marcas de tiempo en eventos Midi, los nombres de los dispositivos predeterminados solo al nombre del puerto (sin pistas el dispositivo al que pertenece este puerto) y puede haber otras cosas que faltan por igual.

La situación en OS X parece terrible, aunque la API se ofrece como reemplazo.

+0

Gracias por la respuesta. Parece que no soy [el único] (http://stackoverflow.com/questions/7749172/why-java-midi-synth-on-mac-stop-playing-notes) que experimenta este problema después de todo. Estoy viendo MMJ ahora mismo, pero parece que el problema está en el sintetizador más que nada. – Ben

+0

(Por alguna razón, no me notificaron su comentario, pero lo noté de todos modos) ¿No proporciona MMJ también un sintetizador? No lo miré tan profundamente. –

+0

Revisé la fuente bastante exhaustivamente y no pude encontrar un sintetizador. Parece más una biblioteca para comunicarse con dispositivos midi de hardware. ¡De nuevo, sé algo sobre JNI y CoreMIDI! No pude encontrar ningún ejemplo en Google tampoco. Obtuve la prueba en el archivo para compilar, pero todo lo que proporcionó fue un teclado midi. No había opción para síntesis de audio con mmj; Solo logré obtener salida de audio con la opción nativa. Realmente desalentador. – Ben

4

Esto parece ser un problema de dos partes. Yo tampoco pude enviar midi sysex utilizando un iMac equipado a mediados de 2011 OSX 10.7.5. Encontré una solución alternativa: primero, tenía que usar el jarrón mmj y el de jnilib y, en segundo lugar, tenía que indicarle a mi código que utilizara marcas de tiempo de -1 y NO que utilizara system.currentTimeMillis(). En mi caso, estoy enviando mensajes sysex en tiempo real, por lo tanto, una marca de tiempo de -1 funciona para mí. No sé qué marca de tiempo usar si está tratando con el encendido/apagado de la nota midi, etc. ¿Quizás la marca de tiempo sea milisegundos en el futuro? No lo sé. Pero sí sé que tenía que usar ambos mmj y tener un mejor control de mis marcas de tiempo. Después de eso, las cosas funcionan como se esperaba.