Как зациклить последовательность MIDI Java - PullRequest
5 голосов
/ 15 ноября 2011

Я довольно новичок в программировании на Java и хотел бы знать, как правильно зациклить последовательность MIDI во время игры. У меня есть некоторый код, и я знаю, что я должен использовать setLoopCount (), чтобы сделать это, но я не уверен, как это реализовать.

Вот код, который у меня есть

Sequencer myseq; 
myseq = MidiSystem.getSequencer(); 
myseq.open();
File myMidiFile = new File("sounds/music.midi");
Sequence supersequence = MidiSystem.getSequence(myMidiFile);
myseq.setSequence(supersequence);
myseq.start(); 

Любая помощь приветствуется.

Ответы [ 4 ]

3 голосов
/ 15 ноября 2011

Я думаю, что это может помочь вам: myseq.setLoopCount (Sequencer.LOOP_CONTINUOUSLY);

2 голосов
/ 18 октября 2013

Вам не нужен внешний метод для зацикливания миди-последовательности.Исходя из приведенного выше кода, вы должны использовать следующее:

import java.io.*;
import java.util.*;
import javax.sound.midi.*;
public class Midiplayer{
        public static void main(String[] args) throws InvalidMidiDataException, IOException, MidiUnavailableException {
            //Create scanner object
            Scanner in= new Scanner(System.in);

            //Request Loop Count
           System.out.println("How Many Loops?");
           int loops= in.nextInt();

           //Retrieve the MIDI File
           System.out.println("Please type in the exact location of your midi:");
           String fileAndLocation= in.next();
           Sequence myseq = MidiSystem.getSequence(new File(fileAndLocation));

           // Create a sequencer for the sequence
           final Sequencer sequencer = MidiSystem.getSequencer();
           sequencer.open();
           sequencer.setSequence(myseq);
           sequencer.setLoopCount(loops);

          //Exit message
          System.out.println("Press 'ctrl' and 'c' on keyboard simultaneously to end sequence and program.");
          // Start playback, repeats automatically
         sequencer.start();
          //Don't forget to close reader
          in.close();
     }
}

Обратите внимание, что приведенное выше не создает бесконечный цикл.Моя догадка заключается в том, что вам нужно установить «loop» в 1 и увеличить его в течение оператора while, который проверяет примерно так:

while(loops>0){
    //Start/restart Midi Sequence
    sequencer.start();
    //increment loops
    loops++;
    //Re-instantiate .setLoopCount()
    sequencer.setLoopCount(loops);
 }

Если циклопределение на основе пользователя , затем введите пользовательский ввод 0 вместо бесконечности, чтобы:

if(loops==0){
    //Declare and instantiate a boolean to test
    boolean infinite=true;
    //Make loops equal to 1 so that the later while statement initiates and repeates
    loops++;
    //Re-instantiate .setLoopCount()
    sequencer.setLoopCount(loops);
}
if(infinite==true){
    while(loops>0){
        //Start/restart Midi Sequence
        sequencer.start();
        //increment loops
        loops++;
       //Re-instantiate .setLoopCount(), thus always adding a loop to setLoopCount(), making it infinite because loops will always be greater than zero
       sequencer.setLoopCount(loops);
    }
}
else{
   //Starts sequence and repeats according to defined loop while loops>0 (so long as you have an error cather for loops<0)
   sequencer.start();
}

Для завершения пользовательского интерфейса для бесконечного цикла, в какой-то момент напомните пользователю, что в COMMAND PROMPT «ctrl» + «c» выходит из программы.

Я надеюсь, что это помогает многим людям (я основал это на своей собственной программе midi, которая работает),Однако обратите внимание, что ничего о бесконечном цикле я еще не проверял.Это только теория, основанная на тщательном анализе ситуации и доступных классов и переменных.Обратите внимание, что .setLoopCounter () присутствует в Java 1.4.1 и далее.Спасибо и я рад помочь.

1 голос
/ 15 ноября 2011

Есть хорошая (но старая) книга о разработке java-игр: http://www.brackeen.com/javagamebook/ Исходный код доступен на сайте.Посмотрите главу 4 ... В файле SoundManagerTest.java вы найдете пример зацикливания миди-звуков.Я надеюсь, что это не слишком устарело.

Кстати: похоже, есть проблема с циклом MIDI и Java 5. Посмотрите в конце страницы:

Проблемы со звуком в Java 5и Java 6.

Sun обновила звуковой движок в Java 5, что привело к нескольким проблемам.Вот исправления: музыка MIDI не зацикливается.Добавьте эту строку (жирным шрифтом) в MidiPlayer.java:

public void meta(MetaMessage event) {
  if (event.getType() == END_OF_TRACK_MESSAGE) {
   if (sequencer != null && sequencer.isOpen() && loop) {
       sequencer.setTickPosition(0);
       sequencer.start();
   }
  }
}
1 голос
/ 15 ноября 2011

Добавьте слушателя к концу песни, например:

myseq.addMetaEventListener(new MetaEventListener() {
    public void meta(MetaMessage msg) {
        if (msg.getType() == 0x2F) { // End of track
            // Restart the song
            sequencer.setTickPosition(0);
            sequencer.start();
        }
    }
});

Это также полезно, если вы хотите создать плейлист и перейти к следующей песне.

...