2011-11-16 26 views
5

Próbuję odtwarzać midi w przeglądarce i korzystam z apletu Java, który działa dobrze na komputerach. Jego niezwykle zawodne na OSX, więc napisałem prosty przypadek testowy, który wykazuje ten sam problem:Java Midi w Mac OSX Broken?

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

Brzmi jak sporadyczne wiadomość jest coraz spadła .. Podobnie jak noteoff nie zadziała, a przypadkowa uwaga będzie trzymaj się wiecznie. Czy jest to znany problem w OSX? Wygląda na to, że Java nie ma ostatnio dość miłości od Apple.

Jeśli ktokolwiek ma lepsze rozwiązanie do gry w Midi w przeglądarce, to ja mam uszy!

+0

Czy można odtworzyć problem za pomocą MIDI, do którego można podłączyć hot? NA PRZYKŁAD. na mojej [stronie medialnej] znajdują się 2 poniżej 12KB (http://pscode.org/media/#sound). –

+0

[tutaj jest przykładowy plik] (http://dl.dropbox.com/u/29939553/november%20rain.mid) Opuściłem mój mac w pracy; wrócić do ciebie jutro po tym, jak przetestuję twoje pliki. Problem jednak zdarza się przypadkowo! Nie udało mi się go odtworzyć niezawodnie. Zdarza się to co najmniej raz na 30 sekund. – Ben

+0

Andrew, udało mi się odtworzyć problem bardzo niezawodnie dzięki plikom testowym EverLove i AftrMdnt, z którymi się łączyłeś. Nie mogę grać więcej niż 20 sekund bez zwinięcia syntetyzatora (notatki są zawieszone, nie są wysyłane nowe komendy). Problem wydaje się występować losowo. – Ben

Odpowiedz

3

Od mmj - Midi for java on Mac OS X:

java realizacja Apple Midi pojawia się nieco połowiczne. Nie uważa danych MIDI za bajty statusu> = 0xF0 za poprawne (tzn. Nie działa z sysex, MIDI, timecode itp.), Ignoruje znaczniki czasu w zdarzeniach Midi, nazwy urządzeń będą domyślnie tylko nazwą portu (bez wskazówek urządzenie, do którego należy ten port) i że mogą być inne rzeczy podobne.

Sytuacja na OS X wydaje się być trudna w obsłudze MIDI, choć to API jest oferowane jako zamiennik.

+0

Dzięki za odpowiedź. Wygląda na to, że nie jestem [jedynym] (http://stackoverflow.com/questions/7749172/why-java-midi-synth-on-mac-stop-playing-notes), mimo wszystko doświadczającym tego problemu! W tej chwili szukam MMJ, ale wygląda na to, że problem tkwi w syntezatorze bardziej niż cokolwiek innego. – Ben

+0

(Z jakiegoś powodu nie zostałem powiadomiony o twoim komentarzu, ale i tak go zauważyłem) Czy MMJ nie dostarcza również syntezatora? Nie patrzyłem tak głęboko w to. –

+0

Przeszedłem przez źródło dość kompleksowo i nie mogłem znaleźć syntezatora. Wygląda bardziej jak biblioteka do komunikacji ze sprzętowymi urządzeniami MIDI. Znowu znam orzechy na temat JNI i CoreMIDI! Nie znalazłem też żadnych przykładów w Google. Dostałem test w archiwum do kompilacji, ale dostarczono tylko klawiaturę MIDI. Nie było opcji syntezy audio za pomocą mmj; Udało mi się uzyskać tylko dźwięk z opcją natywną. Naprawdę zniechęcające rzeczy. – Ben

4

Problem ten wydaje się być dwuczęściowy. Ja też nie mogłem wysłać midi sysex używając komputera iMac wyposażonego w OSX 10.7.5. Znalazłem obejście - najpierw musiałem użyć słoja mmj i jnilib, a po drugie musiałem powiedzieć swojemu kodowi, aby używał znaczników czasu -1 i NIE, aby użyć system.currentTimeMillis(). W moim przypadku wysyłam wiadomości w czasie rzeczywistym w syserze, dlatego dla mnie działa znacznik czasu wynoszący -1. Nie wiem, jakiego znacznika czasu użyć, jeśli ma się do czynienia z notatkami w środku/na zewnątrz itp. Być może znacznik czasu wynosi milisekundy w przyszłości? Nie wiem Ale wiem, że musiałem używać zarówno mmj, jak i lepiej kontrolować moje znaczniki czasu. Potem wszystko działa zgodnie z oczekiwaniami.