播放 MIDI 檔案

可以使用 javax.sound.midi 包中的幾個類來播放 MIDI 檔案。Sequencer 執行 MIDI 檔案的播放,其許多方法可用於設定播放控制,如迴圈計數,速度,軌道靜音等。

MIDI 資料的一般播放可以這種方式完成:

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

要停止播放使用:

sequencer.stop(); // Stop the playback

可以將音序器設定為在播放期間使一個或多個音序的音軌靜音,這樣那些指定的樂器就不會播放。以下示例將序列中的第一個軌道設定為靜音:

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

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

如果給出迴圈計數,序列發生器可以重複播放序列。以下設定順序器可以無限次地播放序列四次:

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

音序器並不總是必須從頭開始播放序列,也不必播放序列直到結束。它可以通過指定序列中的開始和結束時的滴答來隨時開始和結束。也可以手動指定音序器應該播放的序列中的哪個音符:

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

音序器也可以以特定的速度播放 MIDI 檔案,可以通過以每分鐘節拍(BPM)或每季四分音符(MPQ)指定速度來控制。也可以調整播放序列的因子。

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

當你完成使用 Sequencer 時,請記住關閉它

sequencer.close();