终止Java Midi输出

我写了这个简短的程序来学习javax.sound.midi系统。 这是使用Java 6.输出是预期的(由Sequencer事件触发的一系列System.out.println()字符串)但问题是,在最后一个声音效果之后,程序保持循环并且没有按预期终止。

有谁能说出如何解决这个问题? 谢谢你的帮助:

import javax.sound.midi.MidiEvent; import javax.sound.midi.ShortMessage; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.ControllerEventListener; import javax.sound.midi.Sequencer; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequence; import javax.sound.midi.Track; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MidiUnavailableException; class MySound { public static MidiEvent makeEvent(int comd, int chan, int one, int two, int tick) { MidiEvent event = null; try { ShortMessage a = new ShortMessage(); a.setMessage(comd, chan, one, two); event = new MidiEvent(a, tick); } catch (InvalidMidiDataException imde) { imde.printStackTrace(); } return event; } } class MyControllerListener implements ControllerEventListener { public void controlChange(ShortMessage event) { System.out.println("la"); } } class SoundEffects { public static void main(String[] args) { try { Sequencer seq = MidiSystem.getSequencer(); seq.open(); int[] events = { 127 }; MyControllerListener mcl = new MyControllerListener(); seq.addControllerEventListener(mcl, events); Sequence s = new Sequence(Sequence.PPQ, 4); Track t = s.createTrack(); for (int i = 5; i < 60; i += 4) { t.add(MySound.makeEvent(144, 1, i, 100, i)); t.add(MySound.makeEvent(176, 1, 127, 0, i)); t.add(MySound.makeEvent(128, 1, i, 100, i + 2)); } seq.setSequence(s); seq.setTempoInBPM(220); seq.start(); } catch (InvalidMidiDataException imde) { imde.printStackTrace(); } catch (MidiUnavailableException mue) { mue.printStackTrace(); } } } 

一旦曲目播放完毕,您需要调用seq.close()。 这样做的方法是添加元消息监听器,并在遇到类型为0x2F的消息时调用close()(这是非可选元消息“end of track”)。 您的代码看起来像这样:

  seq.addMetaEventListener(new MetaEventListener() { @Override public void meta(MetaMessage metaMsg) { if (metaMsg.getType() == 0x2F) { seq.close(); } } }); 

请注意,您需要将final修饰符添加到seq ,以便在匿名接口实现中引用它。

希望有所帮助。