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