Java MIDI音序器永不停止
我正在运行教程中的一些MIDI代码,但程序从未终止。MIDI音序器似乎从未停止运行,即使它报告长度为0.625s 我需要做些别的事情让音序器停止吗Java MIDI音序器永不停止,java,midi,Java,Midi,我正在运行教程中的一些MIDI代码,但程序从未终止。MIDI音序器似乎从未停止运行,即使它报告长度为0.625s 我需要做些别的事情让音序器停止吗 import javax.sound.midi.*; public class MyMidiPlayer { public static void main(String[] args) { MyMidiPlayer player = new MyMidiPlayer(); player.setUpP
import javax.sound.midi.*;
public class MyMidiPlayer {
public static void main(String[] args)
{
MyMidiPlayer player = new MyMidiPlayer();
player.setUpPlayer(4);
}
public void setUpPlayer(int numOfNotes)
{
try {
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
Sequence sequence = new Sequence(Sequence.PPQ, 4);
Track track = sequence.createTrack();
for (int i = 0; i < numOfNotes; i++)
{
track.add(makeEvent(144, 1, i+48, 100, i));
track.add(makeEvent(128, 1, i+48, 100, i + 2));
}
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(88);
System.out.println("Playing (length=" + sequencer.getMicrosecondLength()/1000000f + "s)...");
sequencer.start();
while (true) {
// Never returns false, so the program never quits
if (!sequencer.isRunning()) {
sequencer.close();
System.exit(1);
}
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
public MidiEvent makeEvent(int command, int channel, int note, int velocity, int tick)
{
MidiEvent event = null;
try {
ShortMessage a = new ShortMessage();
a.setMessage(command, channel, note, velocity);
event = new MidiEvent(a, tick);
}
catch (Exception ex) {
ex.printStackTrace();
}
return event;
}
}
导入javax.sound.midi.*;
公共类迷笛手{
公共静态void main(字符串[]args)
{
MyMidiPlayer=新的MyMidiPlayer();
播放器。设置播放器(4);
}
公共无效设置播放器(int numOfNotes)
{
试一试{
Sequencer Sequencer=MidiSystem.getSequencer();
sequencer.open();
序列=新序列(Sequence.PPQ,4);
Track Track=sequence.createTrack();
对于(int i=0;i
我本来打算删除这个,但我会保留它,然后发布答案。似乎需要在while
循环中调用sequencer.getMicrosecondPosition()
。大概这会更新sequencer类中的某个变量,当位置与getMicrosecondLength
返回的值匹配时,该变量会使isRunning
正确返回false
具体而言:
while (true) {
if (!sequencer.isRunning()) {
sequencer.close();
System.exit(1);
}
sequencer.getMicrosecondPosition();
}
我本来打算删除这个,但我会保留它,然后发布答案。似乎需要在
while
循环中调用sequencer.getMicrosecondPosition()
。大概这会更新sequencer类中的某个变量,当位置与getMicrosecondLength
返回的值匹配时,该变量会使isRunning
正确返回false
具体而言:
while (true) {
if (!sequencer.isRunning()) {
sequencer.close();
System.exit(1);
}
sequencer.getMicrosecondPosition();
}