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