【问题标题】:Looping a MIDI sequence in Java在 Java 中循环一个 MIDI 序列
【发布时间】:2012-12-01 05:44:16
【问题描述】:

我正在尝试在我正在制作的 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 loops delay midi javasound


    【解决方案1】:

    这个改编自 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 的循环点(如上所示,但已注释掉)。

    【讨论】:

    • 我检查了 MIDI 文件的尾随静音。空无一人。声音结束时文件结束。
    • 你有没有解决过这个问题?您是否尝试过其他 MIDI 文件?
    • 我最终确实让它正确循环,但自 2013 年初以来我没有接触过这段代码,而且没有任何代码在版本控制中,所以此时我不知道我做了什么。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2011-03-09
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多