【发布时间】: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() 函数的源代码?