Suche…


Bemerkungen

Anstelle des Clip javax.sound.sampled können Sie auch den AudioClip der Applet-API verwenden. Es wird jedoch empfohlen, Clip zu verwenden, da AudioClip nur älter ist und nur eingeschränkte Funktionen bietet.

Spielen Sie eine Audiodatei Looped

Notwendige Importe:

import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;

Dieser Code erstellt einen Clip und spielt ihn nach dem Start fortlaufend ab:

Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new URL(filename)));
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);

Holen Sie sich ein Array mit allen unterstützten Dateitypen:

AudioFileFormat.Type [] audioFileTypes = AudioSystem.getAudioFileTypes();

Spielen Sie eine MIDI-Datei

MIDI-Dateien können mit mehreren Klassen aus dem Paket javax.sound.midi werden. Ein Sequencer führt die Wiedergabe der MIDI-Datei aus, und viele seiner Methoden können verwendet werden, um Wiedergabesteuerelemente wie Loop-Count, Tempo, Spur-Muting und andere einzustellen.

Die allgemeine Wiedergabe von MIDI-Daten kann auf folgende Weise erfolgen:

import java.io.File;
import java.io.IOException;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Sequence;
import javax.sound.midi.Sequencer;

public class MidiPlayback {
    public static void main(String[] args) {
        try {
            Sequencer sequencer = MidiSystem.getSequencer(); // Get the default Sequencer
            if (sequencer==null) {
                System.err.println("Sequencer device not supported");
                return;
            } 
            sequencer.open(); // Open device
            // Create sequence, the File must contain MIDI file data.
            Sequence sequence = MidiSystem.getSequence(new File(args[0]));
            sequencer.setSequence(sequence); // load it into sequencer
            sequencer.start();  // start the playback
        } catch (MidiUnavailableException | InvalidMidiDataException | IOException ex) {
            ex.printStackTrace();
        }
    }
}

Um die Wiedergabe zu stoppen, verwenden Sie:

sequencer.stop(); // Stop the playback

Ein Sequenzer kann so eingestellt werden, dass eine oder mehrere Spuren der Sequenz während der Wiedergabe stummgeschaltet werden, sodass keines der Instrumente der angegebenen Musik wiedergegeben wird. Im folgenden Beispiel wird der erste Track in der Sequenz stummgeschaltet:

import javax.sound.midi.Track;
// ...

Track[] track = sequence.getTracks();
sequencer.setTrackMute(track[0]);

Ein Sequenzer kann eine Sequenz wiederholt abspielen, wenn die Anzahl der Schleifen angegeben ist. Im Folgenden wird der Sequenzer so eingestellt, dass eine Sequenz viermal und unbegrenzt abgespielt wird:

sequencer.setLoopCount(3);
sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);

Der Sequenzer muss die Sequenz nicht immer von Anfang an spielen, noch muss er die Sequenz bis zum Ende spielen. Sie kann an einem beliebigen Punkt beginnen und enden, indem Sie das Häkchen in der Sequenz festlegen, mit der begonnen und beendet wird. Es ist auch möglich, manuell festzulegen, von welchem ​​Tick in der Sequenz der Sequenzer abgespielt werden soll:

sequencer.setLoopStartPoint(512);
sequencer.setLoopEndPoint(32768);
sequencer.setTickPosition(8192);

Sequenzer können auch eine MIDI-Datei in einem bestimmten Tempo abspielen, das durch Angabe des Tempos in Beats pro Minute (BPM) oder Mikrosekunden pro Viertelnote (MPQ) gesteuert werden kann. Der Faktor, bei dem die Sequenz gespielt wird, kann ebenfalls eingestellt werden.

sequencer.setTempoInBPM(1250f);
sequencer.setTempoInMPQ(4750f);
sequencer.setTempoFactor(1.5f);

Wenn Sie mit dem Sequencer fertig sind, schließen Sie ihn bitte

sequencer.close();

Bare-Metal-Sound

Wenn Sie mit Java Sound erzeugen, können Sie auch fast nackt sein. Dieser Code schreibt rohe Binärdaten in den OS-Audiopuffer, um Ton zu erzeugen. Es ist äußerst wichtig, die Einschränkungen und notwendigen Berechnungen zur Erzeugung eines solchen Sounds zu verstehen. Da die Wiedergabe grundsätzlich sofort erfolgt, müssen Berechnungen nahezu in Echtzeit durchgeführt werden.

Daher ist dieses Verfahren für eine kompliziertere Tonabtastung unbrauchbar. Für solche Zwecke ist die Verwendung von Spezialwerkzeugen der bessere Ansatz.

Das folgende Verfahren erzeugt eine Rechteckwelle einer gegebenen Frequenz in einem gegebenen Volumen für eine gegebene Dauer und gibt diese direkt aus.

public void rectangleWave(byte volume, int hertz, int msecs) {
    final SourceDataLine dataLine;
    // 24 kHz x 8bit, single-channel, signed little endian AudioFormat
    AudioFormat af = new AudioFormat(24_000, 8, 1, true, false);
    try {
        dataLine = AudioSystem.getSourceDataLine(af);
        dataLine.open(af, 10_000); // audio buffer size: 10k samples
    } catch (LineUnavailableException e) {
        throw new RuntimeException(e);
    }

    int waveHalf = 24_000 / hertz; // samples for half a period
    byte[] buffer = new byte[waveHalf * 20];
    int samples = msecs * (24_000 / 1000); // 24k (samples / sec) / 1000 (ms/sec) * time(ms)

    dataLine.start(); // starts playback
    int sign = 1;

    for (int i = 0; i < samples; i += buffer.length) {
        for (int j = 0; j < 20; j++) { // generate 10 waves into buffer
            sign *= -1; 
            // fill from the jth wave-half to the j+1th wave-half with volume
            Arrays.fill(buffer, waveHalf * j, waveHalf * (j+1), (byte) (volume * sign));
        }
        dataLine.write(buffer, 0, buffer.length); // 
    }
    dataLine.drain(); // forces buffer drain to hardware
    dataLine.stop();  // ends playback
}

Für eine differenziertere Art, verschiedene Schallwellen zu erzeugen, sind Sinusberechnungen und möglicherweise größere Stichprobengrößen erforderlich. Dies führt zu wesentlich komplexerem Code und wird dementsprechend hier weggelassen.

Grundlegende Audioausgabe

Das Hallo Audio! von Java, das eine Audiodatei aus lokalem oder Internetspeicher abspielt, sieht wie folgt aus. Es funktioniert für unkomprimierte WAV-Dateien und sollte nicht für die Wiedergabe von MP3- oder komprimierten Dateien verwendet werden.

import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;

public class SoundClipTest {

   // Constructor
   public SoundClipTest() {          
      try {
         // Open an audio input stream.           
          File soundFile = new File("/usr/share/sounds/alsa/Front_Center.wav"); //you could also get the sound file with an URL
          AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile); 
          AudioFormat format = audioIn.getFormat();             
         // Get a sound clip resource.
         DataLine.Info info = new DataLine.Info(Clip.class, format);
         Clip clip = (Clip)AudioSystem.getLine(info);
         // Open audio clip and load samples from the audio input stream.
         clip.open(audioIn);
         clip.start();
      } catch (UnsupportedAudioFileException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } catch (LineUnavailableException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new SoundClipTest();
   }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow