# Musik(Töne) abspielen



## Leroy42 (23. Apr 2007)

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


```
void playSong(...); // Sollte ein Stream erwarten, den ich auch aus einer Jar-Datei lese
boolean isFinished(); // oder evtl. ein Listener-Aufruf
void stopSong()
```


----------



## The_S (23. Apr 2007)

Applet#getAppletContext#getAudioClip#play

Was hast du mit BasicPlayer und/oder JMF für Probleme?


----------



## L-ectron-X (23. Apr 2007)

Midis mit Methoden aus Applet in einer Applikation abspielen:

```
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?


----------



## Leroy42 (23. Apr 2007)

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.


----------



## The_S (23. Apr 2007)

Leroy42 hat gesagt.:
			
		

> Hobbit_Im_Blutrausch hat gesagt.:
> 
> 
> 
> ...



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.


----------



## Leroy42 (23. Apr 2007)

@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


----------



## The_S (23. Apr 2007)

1.) Mit AudioClip allein ist das nicht möglich
2.) Anstelle von ClassLoader#getResourceAsStraem einfach nur ClassLoader#getResource


----------



## André Uhres (23. Apr 2007)

```
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.


----------



## Flo_B (15. Sep 2007)

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?


----------



## André Uhres (15. Sep 2007)

Das könnte daran liegen, daß die Musikdatei nicht gefunden wurde.


----------



## Der Müde Joe (16. Sep 2007)

kenne noch etwas...ist allerdings eine externe Library

http://jfugue.org/


----------

