java - 在 Java 中循环 MIDI 序列

标签 java loops delay midi javasound

我正在尝试在我正在制作的 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();}

最佳答案

此来源改编自 Java Sound tag 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 的循环点(如上所示,但已注释掉)。

关于java - 在 Java 中循环 MIDI 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656804/

相关文章:

java - 将指纹模板保存到数据库 mysql - java

java - 尝试使用 bouncycaSTLe 加密抛出错误

mysql - 简单的 MySQL 循环语法错误

php - 简单的for循环不起作用

c++ - DirectShow 使用 C++ 无限循环视频

java - 为什么使用实例变量进行数据遮蔽在我的程序中不起作用?

java - 问 : JPA save() save other object

C编程: print only int from fgets

css - 使用 CSS 延迟淡入淡出

android - 启动画面后的延迟