如何循环Midi序列Java

时间:2011-11-14 22:39:06

标签: java loops midi

我对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 个答案:

答案 0 :(得分:3)

我认为它可以帮到你:myseq.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);

答案 1 :(得分:2)

您不需要外部方法来循环Midi序列。根据您的上述代码,您应该使用以下代码:

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

请注意,上述不会创建无限循环。我的 guess 是你需要将“loops”设置为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();
}

要结束无限循环的用户界面,在某些时候会提醒用户在命令PROMPT中,'ctrl'+'c'退出程序。

我希望这可以帮助很多人(我基于我自己的midi程序,它有效)。但是,请注意有关无限循环的任何内容我还没有测试过。它只是基于对情况和可用类和变量的大量分析的理论。 请注意.setLoopCounter()存在于Java 1.4.1及更高版本中。 谢谢,我很乐意提供帮助。

答案 2 :(得分:1)

为歌曲的结尾添加一个监听器,如下所示:

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

如果您想创建一个播放列表并让它继续播放下一首歌曲,这也很有用。

答案 3 :(得分:1)

有一本关于java游戏开发的好书(但很旧):http://www.brackeen.com/javagamebook/源代码可在网站上找到。查看第4章...在SoundManagerTest.java文件中,您将找到有关循环midi声音的示例。我希望它不会过时。

顺便说一下: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();
   }
  }
}