Midi in Java abspielen

G00fY

Commodore
🎅Rätsel-Elite ’24
Registriert
Aug. 2009
Beiträge
4.662
Hallo zusammen,

suche mir gerade nen Wolf. Ich möchte einfach eine fertige mid-datei auf einen EventListener in meinem Programm legen. Also so lange eine Checkbox ausgewählt ist, soll das abgespielt werden. Bekomm das aber nicht hin die MIDI Datei überhaupt wiederzugeben. hab mit dem Sequencer rum gespielt aber der will nicht. Hab die Datei quasi direkt lokal im gleichen Ordner wie die java Datei liegen.

Vielleicht könnt ihr mir ja helfen.

Lg G00fY
 
Zeig mal den Code und sag, welche IDE du verwendest (NetBeans, Eclipse, ...)?
 
Ich nutze JCreator. Habs aber jetzt nach wirklich intensiver Suche doch geschafft.

Mit dem Code hier gings:
Code:
  public void abspielen() {
      try {
          Sequencer sequencer = MidiSystem.getSequencer();
          if (sequencer == null)
              throw new MidiUnavailableException();
          sequencer.open();
          FileInputStream is = new FileInputStream("song.mid");
          Sequence mySeq = MidiSystem.getSequence(is);
          sequencer.setSequence(mySeq);
          sequencer.start();
      } catch (Exception e) {
          e.printStackTrace();
      }
  }


Ich weiß nur noch nicht wie ich den Song wieder abbrechen kann. Selbst wenn ich das Programm schließe läuft die Musik noch zu ende.
 
Dann beende die Wiedergabe mit sequencer.stop(); wenn du das Programm beendest.
 
Wie kann ich das denn hin bekommen, das ich von "außen" den sequencer in einer Methode beende?

Weil die methode läuft immer bis ds Lied zuende ist. Gibts ne Möglichkeit das manuell abzubrechen, zB wenn ein anderer Song ausgewählt wurde? Hab versucht eine stoppen Methode zu implementieren, aber da mehrere sequencer parallel laufen können, bringt nichts einen neuen mit dem gleichen Namen zu erstellen und diesen zu stoppen.:(
 
Du darfst die Referenzen dazu nicht verlieren, wenn du später noch einmal darauf zugreifen willst.

Leg dir z.B. ein field an in der Klasse wo du die Sequencer erzeugst
Code:
private final ArrayList<Sequencer>;
[...]
// Im Konstruktor
sequencers = new ArrayList<Sequencer>();
[...]
// Hier wird wohl irgendwo ein Sequencer erzeugt
makeMusic()
{
     [...]
     sequencers.add(...)   // und hier hebst du dir die Referenz auf zu dem, den du gerade erzeugt hast
}
[...]
// und am Ende natürlich noch einen getter für den Zugriff von außen
public ArrayList<Sequencer> getAllSequencers()
{
    return sequencers;
}
Code:
    // woanders
        for (Sequencer s : deineMusikKlasse.getAllSequencers())
        {
            s.stop();
        }
Ganz abgesehen davon möchte ich anmerken, dass ich diesen Sequencer noch nie benutzt habe und daher gar nicht weiß ob das so "good practice" ist, wie du das machst. Aber dein Problem sollte es trotzdem lösen.
 
Zuletzt bearbeitet:
Zurück
Oben