Java MIDI曲目中音符之间的延迟播放不正确

Java MIDI曲目中音符之间的延迟播放不正确,java,midi,Java,Midi,根据我的问题,我创建了一个列表,允许我将需要播放的音符集合排队,然后将这些音符按顺序添加到曲目中,以便一次性播放 我将要在曲目中播放的音符添加到临时列表中,如下所示: int pitch = jComboBoxPitch.getSelectedIndex(); int velocity = ((Integer)jSpinnerVelocity.getValue()); collection.add(new MIDIMessage(pitch,velocity)); 当用户添加了所有必要的注释

根据我的问题,我创建了一个列表,允许我将需要播放的音符集合排队,然后将这些音符按顺序添加到曲目中,以便一次性播放

我将要在曲目中播放的音符添加到临时列表中,如下所示:

int pitch = jComboBoxPitch.getSelectedIndex();
int velocity = ((Integer)jSpinnerVelocity.getValue());

collection.add(new MIDIMessage(pitch,velocity));
当用户添加了所有必要的注释后,按“播放”按钮:

如您所见,我遍历了ArrayList,并将每个noteOn/Off添加到曲目中

播放完这首曲目后,我注意到它只播放两个音符,而不管列表中有多少音符

我已经检查了临时收集和曲目收集,它们似乎都有正确的数据


我是否以错误的方式添加事件和消息?我只是希望能够以录制的方式播放这些音符,并且在每个音符之间应有合理的时间。

您似乎正在将留言中的音符添加到频道0,将留言中的音符添加到频道1。我猜这并不是你真正想要做的——将它们都设置在第一个频道(即,
0
)。

你似乎在将留言添加到频道0,将留言添加到频道1。我猜这并不是你真正想要做的——将它们都设置在第一个频道上(即,
0
)。

我设法解决了我遇到的问题,在查看了我将消息添加到曲目的实现方式后,我发现每条消息都添加得太近了,因此,当每个音符播放时,下一个音符几乎立即播放

下面的代码显示了我是如何修复它的:

int i = 0;

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

                ShortMessage noteOnMsg = new ShortMessage();
                //Signal/Channel/Pitch/Velocity
                noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0,msg.GetPitch(),msg.GetVelocity());

                ShortMessage noteOffMsg = new ShortMessage();
                //Signal/Channel/Pitch/Velocity
                noteOffMsg.setMessage(ShortMessage.NOTE_OFF,0,msg.GetPitch(),msg.GetVelocity());

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

通过将i的计数增加到50,可以确保所有音符在音轨中都有足够的空间将它们分开,从而正确播放音符。

我成功地解决了我遇到的问题,在查看了我将消息添加到曲目的实现方式后,我发现每条消息都添加得太近,因此当每个音符播放时,下一个音符几乎立即播放

下面的代码显示了我是如何修复它的:

int i = 0;

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

                ShortMessage noteOnMsg = new ShortMessage();
                //Signal/Channel/Pitch/Velocity
                noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0,msg.GetPitch(),msg.GetVelocity());

                ShortMessage noteOffMsg = new ShortMessage();
                //Signal/Channel/Pitch/Velocity
                noteOffMsg.setMessage(ShortMessage.NOTE_OFF,0,msg.GetPitch(),msg.GetVelocity());

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

通过将i的计数增加到50,可以确保所有音符在音轨中都有足够的空间将它们分开,从而正确播放音符。

我知道几个月前有人问过这个问题,但我正在尝试做一些非常类似的事情。 我遇到了同样的问题,发现
sequencer.setLoopCount(1)导致我的音序器播放两次音符


通过删除此选项,它只播放一次音符。希望这能有所帮助。

我知道几个月前有人问过这个问题,但我正在尝试做一些非常类似的事情。 我遇到了同样的问题,发现
sequencer.setLoopCount(1)导致我的音序器播放两次音符


通过删除此选项,它只播放一次音符。希望这能有所帮助。

即使在更改后也会发生同样的事情,我不明白为什么即使我只添加一个音符,它也会播放两个音符。即使更改后也会发生同样的事情,我不明白为什么即使我只添加一个音符,它也会播放两个音符。