当前位置: 首页 > 面试题库 >

终止Java Midi输出

于高雅
2023-03-14
问题内容

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

谁能说出解决办法?谢谢你的帮助:

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的消息(这是非可选元消息“ track of
track”)时调用close()。您的代码如下所示:

        seq.addMetaEventListener(new MetaEventListener() {

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

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

希望能有所帮助。



 类似资料:
  • 终止容器 可以使用 docker container stop 来终止一个运行中的容器。 此外,当 Docker 容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器立刻终止。 终止状态的容器可以用 docker container ls -a 命令看到。例如 docker container ls

  • 线程“main”org.openqa.selenium.nosuchelementException:没有这样的元素:找不到元素:{“method”:“id”,“selector”:“passwd”}(会话信息:chrome=53.0.2785.143) 但是,我尝试了ID元素和Xpath元素,它们都是正确 :(

  • 只是想知道在我完成输入后如何终止程序?因为在几次“输入”之后扫描仪仍然会继续,假设我要继续输入...我试过了: 和 它们不起作用....程序继续运行,打乱了初衷,

  • 它的工作很好,但当我把它封闭在我的如果不喜欢 这给了我一个例外: org.apache.jasper.jasperexception:/jsp/custmngmt/reports/viewCustomerDepositReportCriteriaForOldReceipt.jsp(356,0)未终止 我已经测试了条件,它确实输入了if部分,但在通过form标记时会导致异常。我不明白。请帮帮我。

  • 2.4 频道终止 2.4.1 描述 通过调用该接口终止指定的域名的加速服务。 2.4.2 请求地址 地址:https://api.bokecs.com/channel/delete/{channelId} 2.4.3 请求方式 POST 2.4.4 请求参数 1) 请求入参 channelId 频道唯一标识 2)请求出参 { "code": "", "message": "" } code:接口

  • 我是第一次使用LLDB。我正在运行MacOSX小牛队。由于某种原因,我无法让LLDB打印任何一行源代码。相反,输出似乎是汇编指令集。我如何“修复”此问题,使其显示代码? [源代码] 当前可执行文件设置为“a . out”(x86 _ 64)。< br> (lldb)断点设置-n main 断点1: where = a.out main,address = 0x 00000000100000 d60