java将MIDI歌曲事件与初始设置事件分开
我正在用Java Sequencer播放一首MIDI歌曲。这首歌被设计成连续循环,我可以轻松地使用
sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY)
当通过内部(声卡)合成器播放时,效果很好(如有必要,可添加dummy event),循环计时准确无误
然而,当通过外部(USB或串行)合成器播放时,在其循环点的输出中有一个明显的间隙。这可以通过以下事实来解释:在启动时有许多设置事件。通过串行线发送需要一些时间的mid文件
我想尝试的是将一次性设置事件隔离到它们自己的^{Sequence
是否有一个简单的算法(或库函数)可以区分这两种事件强>
它需要规定:
- Registered parameter更改,作为一组相关消息发送李>
- 偶尔在通道的中间发送频道程序更改(并且必须是循环序列的一部分),但是在整个歌曲中保持相同的程序(大多数情况下),程序更改应该是设置序列的一部分。这同样适用于节奏变化李>
# 1 楼答案
看看javax。声音midi。序列由轨迹组成。曲目包含MIDI事件。MIDI事件是时间戳和MIDI消息的组合
MidiMessage有ShortMessage、MetaMessage和SysexMessage子类
很可能在勾号0(MidiEvent.getTick()==0)处过滤掉SysexMessages就可以了。如果没有,则尝试在记号0处过滤元消息。注意:信息、程序更改等都是通过短消息完成的,不要过滤这些信息
另一部分是创建初始化序列。只需创建具有相同类型和分辨率的序列。一个磁道就足够了,您可以将从循环序列中删除的所有事件添加到初始化序列中的单个磁道中