我对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();
感谢任何帮助。
答案 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();
}
}
}