Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MIDI音序器永不停止_Java_Midi - Fatal编程技术网

Java MIDI音序器永不停止

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

我正在运行教程中的一些MIDI代码,但程序从未终止。MIDI音序器似乎从未停止运行,即使它报告长度为0.625s

我需要做些别的事情让音序器停止吗

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();
}