从曲目中删除MIDI事件失败-MIDI/Java

从曲目中删除MIDI事件失败-MIDI/Java,java,arraylist,midi,Java,Arraylist,Midi,用户能够生成一组MIDI事件,这些事件依次添加到ArrayList,然后迭代并添加到曲目对象,等待播放。我试图删除曲目中的所有事件,我通过迭代集合中的所有MIDI事件并在.remove()方法中使用“CreateNoteOneEvent”/“CreateNoteOffEvent”来完成此操作 由于某些原因,该方法总是返回false,例如,它找不到要删除的事件,或者无法删除它 我这样做对吗?我只是假设我删除事件的方式与添加事件的方式相同 谢谢 删除: Iterator itr = collecti

用户能够生成一组MIDI事件,这些事件依次添加到ArrayList,然后迭代并添加到曲目对象,等待播放。我试图删除曲目中的所有事件,我通过迭代集合中的所有MIDI事件并在.remove()方法中使用“CreateNoteOneEvent”/“CreateNoteOffEvent”来完成此操作

由于某些原因,该方法总是返回false,例如,它找不到要删除的事件,或者无法删除它

我这样做对吗?我只是假设我删除事件的方式与添加事件的方式相同

谢谢

删除:

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");
       }
}
简单但非常有效,而不是在我阅读文档并决定使用此方法时通过循环进行迭代。虽然我没有分析它的性能,但我觉得这是一个比循环更好的解决方案,特别是当迭代次数相当高时

我希望它能帮到别人,我花了好几个小时来挠头

谢谢你的额外反馈