由于某种原因,该方法总是返回 false,因为它找不到要删除的事件或未能删除它.我这样做对吗?我只是假设我删除事件的方式与添加事件的方式相同.谢谢!删除:Iterator itr = collection.iterator();尝试{if(sequencer.isRunning()){停止();}而 (itr.hasNext()){MIDIMessageContainer msg = (MIDIMessageContainer) itr.next();if(!track.remove(CreateNoteOnEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity()))){Logger.Add("MIDI 事件未删除");返回假;}if(!track.remove(CreateNoteOffEvent(msg.GetChannel(), msg.GetKey(), msg.GetTick(), msg.GetVelocity()))){Logger.Add("MIDI 事件未删除");返回假;}}集合.清除();返回真;}CreateNoteOnEvent:private static MidiEvent CreateNoteOnEvent(int channel, int pitch, long tick, int velocity){ShortMessage noteOnMessage = new ShortMessage();尝试{noteOnMessage.setMessage(ShortMessage.NOTE_ON,通道,音高,速度);}捕获(例外 e){Logger.Add(e.getMessage());}MidiEvent event = new MidiEvent(noteOnMessage,tick);返回事件;}CreateNoteOffEvent: private static MidiEvent CreateNoteOffEvent(int channel, int pitch, long tick, int velocity){ShortMessage noteOffMessage = new ShortMessage();尝试{noteOffMessage.setMessage(ShortMessage.NOTE_OFF,通道,音高,速度);}捕获(例外 e){Logger.Add(e.getMessage());}MidiEvent 事件 = new MidiEvent(noteOffMessage, tick + 1);返回事件;} 解决方案 在翻阅文档后,我发现如果指定索引,您实际上可以在轨道中返回 MidiEvent,我的第一个解决方案实现是这样的:for(int i = 0; i 这段代码的问题是循环正在检查它在轨道长度上的条件,这会随着事件的删除而改变,因此它最终会使条件失败并跳出循环,从而在轨道中留下几个事件仍然.这是可行的解决方案:_sequence.deleteTrack(_track);_track = _sequence.createTrack();简单但非常有效,而不是在我通读文档并决定采用这种方法时反复进行循环.尽管我没有对其性能进行分析,但我感觉这是一个比循环更好的解决方案,尤其是在迭代次数可能相当高的情况下.我希望它对某人有所帮助,我花了好几个小时为此挠头.感谢您的额外反馈!A user has the ability to generate a set of MIDI events which are in turn added to an ArrayList and then iterated through and added to a Track object, waiting to be played. I'm trying to remove all of the events that are in a track, I do this by iterating through all of the MIDI Events in a collection and use the "CreateNoteOnEvent"/"CreateNoteOffEvent" in the .remove() method.For some reason the method always returns as false, as in it can't find the event to delete or that it has failed to delete it.Am I going about it the right way? I just assumed I delete the events in the same way that I add them.Thanks!Remove: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; } 解决方案 After digging around the documentation I found that you can infact return a MidiEvent in the track if you specify the index, my first implementation of a solution went like this:for(int i = 0; i < track.size(); i++){ if(!track.remove(track.get(i))) { Logger.Add("MIDI Event not removed"); }}The problem with this code is the loop is checking it's condition on the length of the Track, this will change as events are removed so it will eventually fail the condition and break out of the loop in turn leaving several events in the track still.This is the working solution:_sequence.deleteTrack(_track);_track = _sequence.createTrack();Simple but very effective, instead of iterating through a loop that could go on for a fair while I read through the documentation and decided upon this method instead. Although I have not profiled it's performance I have a feeling that this is a better solution than looping, especially when the number of iterations can be fairly high.I hope it helps someone, I spent hours scratching my head over this.Thanks for the additional feedback! 这篇关于从轨道中删除 MidiEvent 失败 - MIDI/Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
07-24 16:49