4

我正在尝试在我正在制作的 java 游戏中循环一个 MIDI 序列,但我遇到了一些问题。

我当前的代码确实重复了这个序列,但是在序列结束和重新启动之间有很大的延迟。我怎样才能消除这个?

这是我的代码:

try
    {
    // From file
        final Sequence sequence = MidiSystem.getSequence(new File("main menu.mid"));
        sequencer = MidiSystem.getSequencer();
        sequencer.open();
        sequencer.addMetaEventListener(new MetaEventListener() {
            public void meta(MetaMessage msg) {
                if (msg.getType() == 47) { // End of track
                    sequencer.setTickPosition(0);
                    try
                    {
                        sequencer.setSequence(sequence);
                    } catch(InvalidMidiDataException e) {e.printStackTrace();}
                    sequencer.start();
                }
            }
        });
        sequencer.setSequence(sequence);

    // Start playing
        sequencer.start();
    } catch (IOException e) {e.printStackTrace();}
      catch (MidiUnavailableException e) {e.printStackTrace();}
      catch (InvalidMidiDataException e) {e.printStackTrace();}
4

1 回答 1

2

这个改编自Java Sound tag Wiki的源在循环之间没有“长时间延迟”的情况下播放 MIDI,这表明您听到的延迟是现有轨道的无声前奏/后奏的一部分。

import javax.sound.midi.*;
import javax.swing.JOptionPane;
import java.net.URL;

class LoopMidi {

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://pscode.org/media/EverLove.mid");

        Sequence sequence = MidiSystem.getSequence(url);
        Sequencer sequencer = MidiSystem.getSequencer();

        sequencer.open();
        sequencer.setSequence(sequence);
        //sequencer.setLoopStartPoint(2000);
        //sequencer.setLoopEndPoint(4000);
        sequencer.setLoopCount(5);

        sequencer.start();
        JOptionPane.showMessageDialog(null, "Everlasting Love");
    }
}

那么解决方案在于:

  1. 修剪 MIDI 轨道以消除这些延迟。
  2. 设置现有 MIDI 的循环点(如上所示,但已注释掉)。
于 2012-12-01T06:30:52.170 回答