Musik(Töne) abspielen

Status
Nicht offen für weitere Antworten.

Leroy42

Top Contributor
Ist es möglich, mit reinen Java-Onboard-Mitteln Musik oder wenigstens Töne abzuspielen?

Ich weiß, das es hierzu bereits einige Threads gibt, wie man MP3-Dateien
abspielen kann (JLayer, BasicPlayer, ...) aber ich konnte noch keine umsetzen.
(Fehlen mir zusätzliche Libraries)?

Es würde mir schon ausreichen einfache Midi-Sequenzen abspielen
zu können und das, wenn möglich, ohne zusätzliche Libraries
(zumindest keine die gleich 1/2 Megabyte groß sind 🙁 ).

Kennt da jemand was, oder hat einen einfachen Link?

Das einzige das ich bräuchte wäre

Code:
void playSong(...); // Sollte ein Stream erwarten, den ich auch aus einer Jar-Datei lese
boolean isFinished(); // oder evtl. ein Listener-Aufruf
void stopSong()
 
Applet#getAppletContext#getAudioClip#play

Was hast du mit BasicPlayer und/oder JMF für Probleme?
 
Midis mit Methoden aus Applet in einer Applikation abspielen:
Code:
import java.applet.*;
import java.net.*;

public class MidiAudioTest {
   public static void main(String[] args) {
      AudioClip clip = null;
      try {
         clip = Applet.newAudioClip(new URL("http://mitglied.lycos.de/midisworld/midis/eifel65/blue_da_ba_dee.mid"));
      }
      catch(MalformedURLException e) {
         e.printStackTrace();
      }
      clip.play();
   }
}

Den Rest bekommst du alleine hin, oder? 😉
 
Hobbit_Im_Blutrausch hat gesagt.:
Applet#getAppletContext#getAudioClip#play

Und wie sieht das bei normalen Anwendungen (Nicht-Applets aus)?
(Vielleicht irgendwie über Toolkit?)

Hobbit_Im_Blutrausch hat gesagt.:
Was hast du mit BasicPlayer und/oder JMF für Probleme?

Vielleicht gar keine, aber das halbe Megabyte ist mir zu groß
wenn verschiedene Programmversionen immer per email
verschifft werden müssen. 🙁
 
Leroy42 hat gesagt.:
Hobbit_Im_Blutrausch hat gesagt.:
Applet#getAppletContext#getAudioClip#play

Und wie sieht das bei normalen Anwendungen (Nicht-Applets aus)?
(Vielleicht irgendwie über Toolkit?)

Genauso. Ist doch egal ob du von einem Applet erbst oder nicht, die Klasse steht dir immer zur Verfügung. LeX hat dir ein schönes Beispiel gepostet.
 
@L-ectron-X: Danke! 😀

2 Fragen noch:

1) Wie ich sehe hat das Interface AudioClip keine Möglichkeit
abzufragen, ob der Clip noch läuft. Gibt's da eventuell 'ne andere Möglichkeit?

2) Die Applet-Methode newAudioClip benötigt einen URL. Wie lautet die
URL-Syntax für Dateien, die mit im Jar-File liegen? Mit getResouceAsStream
geht das ja nicht.

@Hobbit: Ja, L-ectron's Beispiel funzt 🙂

Mich hatte bei deiner Antwort nur das getAppletContext irritiert
 
1.) Mit AudioClip allein ist das nicht möglich
2.) Anstelle von ClassLoader#getResourceAsStraem einfach nur ClassLoader#getResource 😉
 
Code:
package sounddemo;
import java.io.*;
import javax.sound.midi.*;
public class Main {
    public Main() {
        InputStream midiFile = getClass().getResourceAsStream("alb_esp1.mid");
        Sequence sequence;
        try {
            sequence = MidiSystem.getSequence(midiFile);
            Sequencer sequencer;
            sequencer = MidiSystem.getSequencer();
            sequencer.open();
            sequencer.setSequence(sequence);
            sequencer.start();
        } catch (InvalidMidiDataException ex) {ex.printStackTrace();
        } catch (IOException ex) {ex.printStackTrace();
        } catch (MidiUnavailableException ex) {ex.printStackTrace();
        }
    }
    
    public static void main(final String[] args) {new Main();}
}
"Sequencer#isRunning" sagt dir ob die Musik noch spielt.
"Sequencer#stop" stoppt die Musik.
 
Ich wollte den Code von oben mal ausprobieren, ich bekomme aber jedesmal folgende Fehler:
Exception in thread "main" java.lang.NullPointerException
at java.io.DataInputStream.readInt(DataInputStream.java:370)
at com.sun.media.sound.StandardMidiFileReader.getMidiFileFormatFromStream(StandardMidiFileReader.java:94)
at com.sun.media.sound.StandardMidiFileReader.getSequence(StandardMidiFileReader.java:183)
at javax.sound.midi.MidiSystem.getSequence(MidiSystem.java:758)
at Main.<init>(MidiPlayer.java:37)
at Main.main(MidiPlayer.java:49)

Woran könnte das liegen?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben