Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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,我一直在编辑Head First Java书籍中的一些代码,以允许MIDI序列器动态更新注释 这是通过拥有一个网格16 x 16的JCheckbox来实现的,其中包含ActionListener,用于查找用户输入。每次检测到更改时,sequencer都会停止播放,删除当前曲目,重新构建曲目(通过检测选中的框),然后从当前播放位置恢复播放 这是可行的,但每次更改都会导致轻微延迟。有人知道如何处理这个问题吗 public void buildTrackAndStart() { int[] t

我一直在编辑Head First Java书籍中的一些代码,以允许MIDI序列器动态更新注释

这是通过拥有一个网格16 x 16的JCheckbox来实现的,其中包含ActionListener,用于查找用户输入。每次检测到更改时,sequencer都会停止播放,删除当前曲目,重新构建曲目(通过检测选中的框),然后从当前播放位置恢复播放

这是可行的,但每次更改都会导致轻微延迟。有人知道如何处理这个问题吗

public void buildTrackAndStart() {
    int[] trackList = null;

    sequence.deleteTrack(track);
    track = sequence.createTrack();

    for (int i = 0; i < 16; i++) {
        trackList = new int[16];

        int key = instruments[i];

        for (int j = 0; j < 16; j++ ) {
            JCheckBox jc = (JCheckBox) checkboxList.get(j + (16*i));
            if ( jc.isSelected()) {
                trackList[j] = key;
            } else {
                trackList[j] = 0;
            }
        } // close inner loop

        makeTracks(trackList);
        track.add(makeEvent(176,1,127,0,16));
    } // close outer

    track.add(makeEvent(192,9,1,0,15));
    try {
        sequencer.setSequence(sequence);
        sequencer.setLoopCount(sequencer.LOOP_CONTINUOUSLY);
        sequencer.start();
        sequencer.setTempoInBPM(120);
    } catch(Exception e) {e.printStackTrace();}
} // close buildTrackAndStart method
public void buildTrackAndStart(){
int[]trackList=null;
顺序。删除跟踪(跟踪);
track=sequence.createTrack();
对于(int i=0;i<16;i++){
trackList=newint[16];
int键=仪器[i];
对于(int j=0;j<16;j++){
JCheckBox jc=(JCheckBox)checkboxList.get(j+(16*i));
if(jc.isSelected()){
trackList[j]=键;
}否则{
轨迹列表[j]=0;
}
}//闭合内环
makeTracks(trackList);
track.add(makeEvent(176,1127,0,16));
}//关闭外部
添加(makeEvent(192,9,1,0,15));
试一试{
序列器。设置序列(序列);
sequencer.setLoopCount(sequencer.LOOP_连续);
sequencer.start();
sequencer.setTempoInBPM(120);
}catch(异常e){e.printStackTrace();}
}//关闭buildTrackAndStart方法

您需要在Java sequencer播放时动态添加事件。使用默认的Java sequencer是很困难的,因为在这种情况下它的行为是未指定的,请参阅JavaSound常见问题解答,您需要在Java sequencer播放时动态添加事件。使用默认Java sequencer很困难,因为它在这种情况下的行为是未指定的,请参阅JavaSound常见问题解答

您可能想在一个盲镜头上发布此消息-在序列运行时是否可以创建新曲目并替换对旧曲目的引用?您能提供makeTracks()函数的源代码吗?您可能只想在一个盲镜头上发布此消息-当序列运行时,是否可以创建新轨迹并替换对旧轨迹的引用?能否提供makeTracks()函数的源代码?