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 タグ 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 に答える