【问题标题】:Java MIDI Sequencer LatencyJava MIDI 音序器延迟
【发布时间】:2012-03-30 17:47:32
【问题描述】:

我一直在编辑 Head First Java 书中的一些代码,以允许 MIDI 音序器动态更新音符。

这通过拥有一个 16 x 16 的 JCheckbox 网格来工作,其中包含寻找用户输入的 actionListener。每次检测到变化时,音序器都会停止播放,删除当前音轨,重新构建音轨(通过检测哪些框被选中),然后从当前播放位置恢复播放。

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

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

【问题讨论】:

  • 你可能想在codereview.stackexchange.com上发帖
  • 只是一个盲目的镜头 - 是否可以在序列运行时创建新轨道并替换对旧轨道的引用?您能否提供 makeTracks() 函数的源代码?

标签: java midi


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多