gpt4 book ai didi

java - 从轨道中删除 MidiEvent 失败 - MIDI/Java

转载 作者:行者123 更新时间:2023-11-30 05:04:57 24 4
gpt4 key购买 nike

用户能够生成一组 MIDI 事件,这些事件依次添加到 ArrayList,然后迭代并添加到 Track 对象,等待播放。我正在尝试删除轨道中的所有事件,我通过迭代集合中的所有 MIDI 事件并使用 .remove() 方法中的“CreateNoteOnEvent”/“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;
}

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;
}

最佳答案

在深入研究文档后,我发现如果指定索引,您实际上可以在轨道中返回 MidiEvent,我的解决方案的第一个实现如下:

for(int i = 0; i < track.size(); i++)
{
if(!track.remove(track.get(i)))
{
Logger.Add("MIDI Event not removed");
}
}

这段代码的问题是循环正在检查轨道长度的条件,这会随着事件被删除而改变,因此它最终会失败并依次跳出循环,在轨道中留下几个事件仍然。

这是可行的解决方案:

_sequence.deleteTrack(_track);
_track = _sequence.createTrack();

简单但非常有效,我通读文档并决定采用此方法,而不是迭代可能持续很长时间的循环。虽然我还没有分析过它的性能,但我感觉这是比循环更好的解决方案,特别是当迭代次数相当高时。

我希望它能对某人有所帮助,我花了几个小时为此绞尽脑汁。

感谢您的额外反馈!

关于java - 从轨道中删除 MidiEvent 失败 - MIDI/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5418773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com