Boucle d'une séquence MIDI en Java


J'essaie de boucler une séquence MIDI dans un jeu java que je fais et j'ai quelques problèmes.

Le code actuel que j'ai répète la séquence, mais il y a un grand délai entre la fin de la séquence et le redémarrage. Comment puis-je éliminer ce?

Voici mon code:

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();}
Author: Andrew Thompson, 2012-12-01

1 answers

Cette source adaptée du Java Sound tag Wiki joue le MIDI sans "long delay" entre les boucles, ce qui me suggère que le delay que vous entendez fait partie de l'intro/outtro silencieuse de la piste existante.

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");
    }
}

La solution réside alors dans:

  1. Rogner la piste MIDI pour supprimer ces retards.
  2. Réglage des points de boucle du MIDI existant (comme indiqué ci-dessus, mais commenté).
 1
Author: Andrew Thompson, 2017-05-23 12:12:23