Ricerca…


Osservazioni

Invece di usare javax.sound.sampled Clip , puoi usare anche AudioClip che proviene dall'API dell'applet. Si consiglia comunque di utilizzare Clip poiché AudioClip è solo più vecchio e presenta funzionalità limitate.

Riproduce un file audio in loop

Importazioni necessarie:

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

Questo codice creerà una clip e la riprodurrà continuamente una volta avviata:

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

Ottieni una matrice con tutti i tipi di file supportati:

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

Riproduci un file MIDI

I file MIDI possono essere riprodotti utilizzando diverse classi dal pacchetto javax.sound.midi . Un Sequencer esegue la riproduzione del file MIDI e molti dei suoi metodi possono essere utilizzati per impostare i controlli di riproduzione come il conteggio dei loop, il tempo, il silenziamento della traccia e altri.

La riproduzione generale dei dati MIDI può essere eseguita in questo modo:

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();
        }
    }
}

Per interrompere la riproduzione, utilizzare:

sequencer.stop(); // Stop the playback

Un sequencer può essere impostato per silenziare una o più tracce della sequenza durante la riproduzione in modo che nessuno degli strumenti in quelli specificati suoni. L'esempio seguente imposta la prima traccia nella sequenza da disattivare:

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

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

Un sequencer può riprodurre ripetutamente una sequenza se viene dato il numero di cicli. Quanto segue imposta il sequencer per riprodurre una sequenza quattro volte e indefinitamente:

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

Il sequencer non deve sempre suonare la sequenza dall'inizio, né deve suonare la sequenza fino alla fine. Può iniziare e terminare in qualsiasi momento specificando il segno di spunta nella sequenza da cui iniziare e terminare. È anche possibile specificare manualmente quale tick nella sequenza che il sequencer dovrebbe riprodurre da:

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

I sequencer possono anche riprodurre un file MIDI ad un determinato tempo, che può essere controllato specificando il tempo in battiti al minuto (BPM) o microsecondi per nota da un quarto (MPQ). Anche il fattore con cui viene riprodotta la sequenza può essere regolato.

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

Quando hai finito di usare il Sequencer , ricorda di chiuderlo

sequencer.close();

Suono di metallo nudo

Puoi anche fare quasi bare metal quando produci suoni con java. Questo codice scriverà dati binari grezzi nel buffer audio del sistema operativo per generare suoni. È estremamente importante capire le limitazioni e i calcoli necessari per generare un suono come questo. Poiché la riproduzione è fondamentalmente istantanea, i calcoli devono essere eseguiti quasi in tempo reale.

In quanto tale, questo metodo è inutilizzabile per un campionamento del suono più complicato. Per tali scopi utilizzando strumenti specializzati è l'approccio migliore.

Il seguente metodo genera e genera direttamente un'onda di rettangolo di una determinata frequenza in un dato volume per una data durata.

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
}

Per un modo più differenziato di generare differenti calcoli del seno sonoro e possibilmente dimensioni del campione più grandi sono necessarie. Ciò si traduce in codice significativamente più complesso ed è quindi omesso qui.

Uscita audio di base

Hello Audio! di Java che riproduce un file audio dall'archivio locale o su Internet, appare come segue. Funziona con file wav non compressi e non deve essere utilizzato per riprodurre file mp3 o compressi.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow