继我的问题here我创建了一个列表,允许我排列需要播放的音符集合,然后将这些音符添加到音轨中,以便它们可以一气呵成地演奏。Java MIDI Track中的音符之间的延迟播放不正确
我想补充说明,以在轨道上播放的临时列表,像这样:
int pitch = jComboBoxPitch.getSelectedIndex();
int velocity = ((Integer)jSpinnerVelocity.getValue());
collection.add(new MIDIMessage(pitch,velocity));
当用户已添加了所有需要说明的事项,他们按“播放”按钮:
private void PlayMIDI()
{
try
{
Sequencer seq = MidiSystem.getSequencer();
seq.open();
Sequence sequence1 = new Sequence(Sequence.PPQ,16);
Track track = sequence1.createTrack();
Iterator itr = collection.iterator();
int i = 0;
while(itr.hasNext())
{
MIDIMessage msg = (MIDIMessage)itr.next();
ShortMessage noteOnMsg = new ShortMessage();
//Signal/Channel/Pitch/Velocity
noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0,msg.GetPitch(),msg.GetVelocity());
ShortMessage noteOffMsg = new ShortMessage();
//Signal/Channel/Pitch/Velocity
noteOffMsg.setMessage(ShortMessage.NOTE_OFF,0,msg.GetPitch(),msg.GetVelocity());
track.add(new MidiEvent(noteOnMsg,msg.GetDelay()));
track.add(new MidiEvent(noteOffMsg,msg.GetDelay() + i));
i++;
}
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(120);
sequencer.setLoopCount(1);
seq.start();
}
catch(Exception e)
{
}
}
正如你所看到的,我遍历ArrayList并将每个noteOn/Off添加到轨道。
播放曲目后,我注意到它只播放两个音符,无论列表中的数量如何。
我已经检查了临时收藏和曲目集合,他们都似乎有正确的数据。
我是否以错误的方式添加事件和消息?我只是希望能够以他们记录的方式演奏音符,并且他们应该在每个音符之间有合理的时间。
即使改变后也会发生同样的事情,我不明白为什么它会弹奏两个音符,即使我只添加一个音符。 – 2010-11-29 15:15:07