2011-11-16 17 views
5

Sto provando a riprodurre midi in un browser e ho utilizzato un'applet Java che funziona perfettamente con i PC. La sua estremamente inaffidabile su OSX, così ho scritto un semplice caso di test che presenta lo stesso problema:Java Midi in Mac OSX interrotto?

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

Sembra che il messaggio occasionale è sempre caduto .. Come un noteoff non si attiva, e una nota casuale resisti per sempre. Si tratta di un problema noto in OSX? Sembra che Java non abbia abbastanza amore da Apple in questi giorni.

Se qualcuno ha una soluzione migliore per giocare a Midi in un browser, sono tutto orecchie!

+0

È possibile riprodurre il problema utilizzando un MIDI che può essere collegato via cavo a? PER ESEMPIO. ci sono 2 sotto 12Kb disponibili nella mia [pagina media] (http://pscode.org/media/#sound). –

+0

[ecco un file di esempio] (http://dl.dropbox.com/u/29939553/november%20rain.mid) Ho lasciato il mio mac al lavoro; torna da te domani dopo aver testato i tuoi file. Il problema sembra tuttavia avvenire casualmente! Non sono stato in grado di riprodurlo in modo affidabile. Succede almeno una volta ogni 30 secondi circa. – Ben

+0

Andrew, sono stato in grado di ricreare il problema in modo molto affidabile con i file di test EverLove e AftrMdnt a cui ti sei collegato. Non riesco a suonare più di 20 secondi senza che il sintetizzatore si blocchi (le note vengono lasciate sospese, non vengono inviati neanche i nuovi comandi noteon). Il problema sembra verificarsi a caso. – Ben

risposta

3

Da mmj - Midi for java on Mac OS X:

java implementazione Midi di Apple sembra un po 'timida. Non considera i dati MIDI con byte di stato> = 0xF0 validi (cioè non funziona con sysex, MIDI clock, timecode, ecc.), Ignora i timestamp sugli eventi Midi, i nomi dei dispositivi assumono solo il nome della porta (senza suggerimenti su il dispositivo a cui questa porta appartiene) e potrebbero esserci altre cose che mancano allo stesso modo.

La situazione su OS X sembra terribile MIDI, sebbene tale API sia offerta come una sostituzione.

+0

Grazie per la risposta. Sembra che io non sia [l'unico] (http://stackoverflow.com/questions/7749172/why-java-midi-synth-on-mac-stop-playing-notes) sperimentare questo problema dopo tutto! Sto esaminando MMJ in questo momento, ma sembra che il problema sia nel sintetizzatore più di ogni altra cosa. – Ben

+0

(Per qualche ragione non mi è stato notificato il tuo commento, ma è successo a notarlo comunque) MMJ non fornisce anche un sintetizzatore? Non l'ho guardato così profondamente. –

+0

Ho analizzato la fonte in modo abbastanza completo e non sono riuscito a trovare un sintetizzatore. Sembra più una libreria per comunicare con dispositivi midi hardware. Poi di nuovo so pazzi su JNI e CoreMIDI! Non sono riuscito a trovare alcun esempio su Google neanche. Ho compilato il test nell'archivio, ma tutto ciò che ho fornito era una tastiera midi. Non c'era alcuna opzione per la sintesi audio con mmj; Sono riuscito a ottenere l'output audio solo con l'opzione nativa. Roba davvero scoraggiante. – Ben

4

Questo sembra essere un problema in due parti. Anche io non ho potuto inviare midi sysex usando un iMac dotato di OSX 10.7.5 a metà del 2011. Ho trovato una soluzione alternativa: in primo luogo, ho dovuto usare il jar mmj e jnilib e in secondo luogo ho dovuto dire al mio codice di usare timestamp di -1 e NON di usare system.currentTimeMillis(). Nel mio caso sto inviando messaggi sysex in tempo reale, quindi un timestamp di -1 funziona per me. Non so quale timestamp utilizzare se hai a che fare con note midi on/off, ecc. Forse il timestamp è millisecondo nel futuro? Non lo so. Ma so che dovevo usare entrambi i mmj e controllare meglio i miei timestamp. Dopo ciò, le cose funzionano come previsto.