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