返回

Java MIDI 音轨音符重复播放与无延迟播放问题解决之道

java

Java MIDI 音轨重复播放音符问题剖析与解决方案

前言

在 Java MIDI 音序器中播放音符时,有时会出现意想不到的问题,例如重复播放音符或同时播放所有音符。本篇文章将深入探讨这些问题的根源并提供详尽的解决方案。

问题

重复播放音符

在向集合中添加一个音符消息时,播放时会出现两个音符,尽管它们具有相同的音高、长度和速度。

无延迟播放

所有音符都同时播放,无论集合中包含多少个音符。

问题分析

重复播放音符

代码中重复播放音符的问题源于为集合中的每个音符消息都创建了音符开事件和音符关事件。对于集合中的第一个音符消息以外的所有音符消息,只需要创建音符关事件即可。

无延迟播放

音序器在播放音符事件时没有指定延迟,导致所有音符同时播放。

解决方案

修复重复播放音符

只需在集合中的第一个音符消息处创建音符开事件。对于随后的音符消息,只需要创建音符关事件即可。

添加延迟播放

在音序器播放音符事件时,指定一个适当的延迟,以确保音符按顺序播放。

修改后的代码:

ShortMessage noteOnMsg = new ShortMessage();
noteOnMsg.setMessage(ShortMessage.NOTE_ON, firstMsg.GetChannel(), firstMsg.GetPitch(), firstMsg.GetVelocity());

track.add(new MidiEvent(noteOnMsg, 0));

while (itr.hasNext()) {
    MIDIMessage msg = (MIDIMessage) itr.next();

    ShortMessage noteOffMsg = new ShortMessage();
    noteOffMsg.setMessage(ShortMessage.NOTE_OFF, msg.GetChannel(), msg.GetPitch(), msg.GetVelocity());

    track.add(new MidiEvent(noteOffMsg, i));
    i++;
}

结论

通过实施这些修改,我们成功解决了 Java MIDI 音轨中重复播放音符和无延迟播放的问题。这些修改确保了音符按预期播放,而不会出现重复或同时播放的情况。

常见问题解答

1. 为什么会出现重复播放音符的问题?

这个问题是由为集合中的每个音符消息都创建了音符开事件引起的。

2. 如何解决重复播放音符的问题?

只需要在集合中的第一个音符消息处创建音符开事件,对于随后的音符消息,只需要创建音符关事件即可。

3. 为什么所有音符都会同时播放?

这是因为音序器在播放音符事件时没有指定延迟。

4. 如何添加延迟播放?

在音序器播放音符事件时,指定一个适当的延迟,以确保音符按顺序播放。

5. 如何防止未来出现这些问题?

通过遵循最佳实践,例如仅在必要时创建音符开事件并指定延迟,可以防止这些问题在将来出现。