Пользователь имеет возможность генерировать набор событий MIDI, которые, в свою очередь, добавляются в ArrayList, а затем перебираются и добавляются в объект Track, ожидая воспроизведения.Я пытаюсь удалить все события, которые находятся в дорожке, я делаю это путем перебора всех MIDI-событий в коллекции и использую «CreateNoteOnEvent» / «CreateNoteOffEvent» в методе .remove ().
По какой-то причине метод всегда возвращает значение 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;
}
CreateNoteOnEvent:
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;
}
CreateNoteOffEvent:
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;
}