gpt4 book ai didi

java - 在 Java 中循环 MIDI 序列

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:01 27 4
gpt4 key购买 nike

我正在尝试在我正在制作的 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com