我正在使用Java Sound API,并且我知道如何使用Sequencer来编辑和执行音轨。我现在的问题是如何正确地实时播放多个音符(不一定同时播放)?
我使用了一条音轨,添加了MidiEvent NoteON和NoteOFF,然后启动了助听器来播放Note。在第二次运行中,我从音轨中删除先前的事件,并将合成器设置为位置0以重新开始。很好。
问题在于,即使未完全执行先前的音符关闭事件,先前的音符也会自然地被切断,因此该音符不会持续到我想要的时间。
是通过将音符事件发送到不同音轨来解决此问题的正确方法,还是有更好的方法?我遇到的问题是,从音序器0位置启动音序器将导致再次播放某些先前的音符。
public void playSingleNote(int note, int velocity) throws InvalidMidiDataException, MidiUnavailableException {
long tick = 0;
sequencer.setTickPosition(0);// Start at beginning.
// Clean track
for (int i = 0; i < track.size(); i++) {
track.remove(track.get(i));
}
ShortMessage msg = new ShortMessage(ShortMessage.NOTE_ON, 0, note, velocity);
MidiEvent evt = new MidiEvent(msg, tick);
track.add(evt);
msg = new ShortMessage(ShortMessage.NOTE_OFF, 0, note, velocity);
evt = new MidiEvent(msg, tick + 28);
track.add(evt);
sequencer.start();
}