从曲目中删除MIDI事件失败-MIDI/Java
用户能够生成一组MIDI事件,这些事件依次添加到ArrayList,然后迭代并添加到曲目对象,等待播放。我试图删除曲目中的所有事件,我通过迭代集合中的所有MIDI事件并在.remove()方法中使用“CreateNoteOneEvent”/“CreateNoteOffEvent”来完成此操作 由于某些原因,该方法总是返回false,例如,它找不到要删除的事件,或者无法删除它 我这样做对吗?我只是假设我删除事件的方式与添加事件的方式相同 谢谢 删除:从曲目中删除MIDI事件失败-MIDI/Java,java,arraylist,midi,Java,Arraylist,Midi,用户能够生成一组MIDI事件,这些事件依次添加到ArrayList,然后迭代并添加到曲目对象,等待播放。我试图删除曲目中的所有事件,我通过迭代集合中的所有MIDI事件并在.remove()方法中使用“CreateNoteOneEvent”/“CreateNoteOffEvent”来完成此操作 由于某些原因,该方法总是返回false,例如,它找不到要删除的事件,或者无法删除它 我这样做对吗?我只是假设我删除事件的方式与添加事件的方式相同 谢谢 删除: Iterator itr = collecti
Iterator itr = collection.iterator();
try
{
if(sequencer.isRunning())
{
Stop();
}
while (itr.hasNext())
{
MIDIMessageContainer msg = (MIDIMessageContainer) itr.next();
if(!track.remove(CreateNoteOnEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity())))
{
Logger.Add("MIDI Event not removed");
return false;
}
if(!track.remove(CreateNoteOffEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity())))
{
Logger.Add("MIDI Event not removed");
return false;
}
}
collection.clear();
return true;
}
private static MidiEvent CreateNoteOnEvent(int channel, int pitch, long tick, int velocity)
{
ShortMessage noteOnMessage = new ShortMessage();
try
{
noteOnMessage.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity);
}
catch (Exception e)
{
Logger.Add(e.getMessage());
}
MidiEvent event = new MidiEvent(noteOnMessage, tick);
return event;
}
private static MidiEvent CreateNoteOffEvent(int channel, int pitch, long tick, int velocity)
{
ShortMessage noteOffMessage = new ShortMessage();
try
{
noteOffMessage.setMessage(ShortMessage.NOTE_OFF, channel, pitch, velocity);
}
catch (Exception e)
{
Logger.Add(e.getMessage());
}
MidiEvent event = new MidiEvent(noteOffMessage, tick + 1);
return event;
}
CreateNoteOneEvent:
Iterator itr = collection.iterator();
try
{
if(sequencer.isRunning())
{
Stop();
}
while (itr.hasNext())
{
MIDIMessageContainer msg = (MIDIMessageContainer) itr.next();
if(!track.remove(CreateNoteOnEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity())))
{
Logger.Add("MIDI Event not removed");
return false;
}
if(!track.remove(CreateNoteOffEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity())))
{
Logger.Add("MIDI Event not removed");
return false;
}
}
collection.clear();
return true;
}
private static MidiEvent CreateNoteOnEvent(int channel, int pitch, long tick, int velocity)
{
ShortMessage noteOnMessage = new ShortMessage();
try
{
noteOnMessage.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity);
}
catch (Exception e)
{
Logger.Add(e.getMessage());
}
MidiEvent event = new MidiEvent(noteOnMessage, tick);
return event;
}
private static MidiEvent CreateNoteOffEvent(int channel, int pitch, long tick, int velocity)
{
ShortMessage noteOffMessage = new ShortMessage();
try
{
noteOffMessage.setMessage(ShortMessage.NOTE_OFF, channel, pitch, velocity);
}
catch (Exception e)
{
Logger.Add(e.getMessage());
}
MidiEvent event = new MidiEvent(noteOffMessage, tick + 1);
return event;
}
CreateNoteOffEvent:
Iterator itr = collection.iterator();
try
{
if(sequencer.isRunning())
{
Stop();
}
while (itr.hasNext())
{
MIDIMessageContainer msg = (MIDIMessageContainer) itr.next();
if(!track.remove(CreateNoteOnEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity())))
{
Logger.Add("MIDI Event not removed");
return false;
}
if(!track.remove(CreateNoteOffEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity())))
{
Logger.Add("MIDI Event not removed");
return false;
}
}
collection.clear();
return true;
}
private static MidiEvent CreateNoteOnEvent(int channel, int pitch, long tick, int velocity)
{
ShortMessage noteOnMessage = new ShortMessage();
try
{
noteOnMessage.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity);
}
catch (Exception e)
{
Logger.Add(e.getMessage());
}
MidiEvent event = new MidiEvent(noteOnMessage, tick);
return event;
}
private static MidiEvent CreateNoteOffEvent(int channel, int pitch, long tick, int velocity)
{
ShortMessage noteOffMessage = new ShortMessage();
try
{
noteOffMessage.setMessage(ShortMessage.NOTE_OFF, channel, pitch, velocity);
}
catch (Exception e)
{
Logger.Add(e.getMessage());
}
MidiEvent event = new MidiEvent(noteOffMessage, tick + 1);
return event;
}
翻阅文档后,我发现如果指定索引,实际上可以在曲目中返回MidiEvent,我的第一个解决方案实现如下所示:
for(int i = 0; i < track.size(); i++)
{
if(!track.remove(track.get(i)))
{
Logger.Add("MIDI Event not removed");
}
}
简单但非常有效,而不是在我阅读文档并决定使用此方法时通过循环进行迭代。虽然我没有分析它的性能,但我觉得这是一个比循环更好的解决方案,特别是当迭代次数相当高时
我希望它能帮到别人,我花了好几个小时来挠头
谢谢你的额外反馈