# Das Frequenzspektrum einer WAV/MP3-Datei anzeigen



## M3t4tron (14. Nov 2009)

Hey Leute,

ich versuche zur Zeit ein kleines Programm zu Erstellen, welches das Frequenzspektrum von einer _Midi_[Edit -> Wav ode Mp3] Datei anzeigen kann. Welche API sollte ich dafüram besten nehmen und hat irgendjemand damitschon erfahrung gemacht? Da ich bisher noch nicht mit Multimedia Zeugs gearbeitet hab wäre nen gutes Tutorial nett, falls jemand eins kennt.

Danke im voraus

M3t4tron


----------



## Spacerat (14. Nov 2009)

[c]javax.sound.midi[/c] ist schon mal die API. Wie es aber genau geht, hab' ich nicht mehr im Schädel. Müsste also nachforschen. Da war irgend was mit 'nem integrierten Softwaresynthesizer...


----------



## Steev (14. Nov 2009)

In folgendem "Javabuch" gibt es ein Kapitel, das sich eingehend mit der Midi-API beschäftigt. Einfach runterladen und durchlesen 

www.javabuch.de - Das Handbuch der Java-Programmierung

In der Insel gibt es auch ein kurzes Kapitel dazu...

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.8 Musik abspielen


----------



## ModellbahnerTT (14. Nov 2009)

Was erwartest du denn für eine Ausgabe? MIDI kennt nur Noten, die haben nur eine einzelne Frequenz, ergo kein Frequenzspektrum zum anzeigen.


----------



## M3t4tron (14. Nov 2009)

Ok verdammt daran hab ich gar nicht gedacht - welches wäre denn das nächst einfachste Format womit ich das realisiren kann? wav oder direkt Mp3?


----------



## Spacerat (14. Nov 2009)

Irgendwie müssen aus den Noten aber Töne erzeugt werden... Dieser Softwaresynthesizer verwendet dafür eine Line aus [c]javax.sound.sampled[/c]. Und iwie gab es darüber dann eben die Möglichkeit diese Line mit zu schneiden.


----------



## Steev (14. Nov 2009)

Na ja, bei mp3 fällt dir dann wieder der Java-Standard auf die Füße: mp3 wird nämlich nicht unterstützt.
Wav wird zwar unterstützt, wobei sich die Unterstützung leider von Update zu Update verändert und man daher nicht garantieren kann, dass der Code von Heute Morgen auch noch funktioniert :-(.

Na ja, die Klassen für so etwas sind Clip.

Eine gute Anleitung findest du in oben genanntem "Java-Buch". Folgend findest du ein kleines Codebeispiel...

Abspielen eines Sounds über Clip
[Java]import java.io.File;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;

public class Soundspielen {
    public Soundspielen(File audiofile) {
        try {
            AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(audiofile);
            AudioFormat af = audioInputStream.getFormat();
            int size = (int) (af.getFrameSize() * audioInputStream.getFrameLength());
            byte[] audio = new byte[size];
            DataLine.Info info = new DataLine.Info(Clip.class, af, size);
            audioInputStream.read(audio, 0, size);

            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(af, audio, 0, size);

            // Clip-Event
            clip.addLineListener(new LineListener() {
                public void update(LineEvent event) {
                    System.out.println(event.getFramePosition());
                }
            });

            // Clip abspielen
            clip.start();

            // Warten bis der Clip beendet wurde
            while (true) {
                try {
                    Thread.sleep(100);
                } catch (Exception e) {
                    // nothing
                }
                if (!clip.isRunning()) {
                    break;
                }
            }
            clip.stop();
            clip.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        File audiofile = new File("C:\\alert.wav");
        new Soundspielen(audiofile);
    }
}[/Java]


----------

