Java Language Riproduci un file MIDI


Esempio

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