接线midi音序器

时间:2012-06-04 04:08:15

标签: java midi

我需要“连线”两个音序器:播放器和录音机。 播放器可以接收来自不同来源的midi事件,录音机将负责将整个事件记录到文件中。

以下代码只是用于理解机制的示例,但它无法正常工作。它将创建一个文件,其大小和属性与原始文件非常相似,但无法正常播放。输出文件长度只有3秒,只生成垃圾声!

import javax.sound.midi.*;
import java.io.File;

public class test {
    public static void main(String[] args) throws Exception {
        Sequence play, record; 
        Sequencer player, recorder;
        Transmitter t;
        Receiver r;
        try {   
            play = MidiSystem.getSequence(new File("input.mid"));
            record = new Sequence(play.getDivisionType(), play.getResolution(), play.getTracks().length);

            player = MidiSystem.getSequencer();
            player.open();
            player.setSequence(play);

            recorder = MidiSystem.getSequencer();
            recorder.open();
            recorder.setSequence(record);

            for (Track track : record.getTracks())
                recorder.recordEnable(track, -1);

            // Do some wiring
            r = recorder.getReceiver();
            t = player.getTransmitter();
            t.setReceiver(r);

            // let the show begin !
            recorder.startRecording();
            player.start();
            Thread.sleep(play.getMicrosecondLength() / 1000);
            while (player.isRunning())
                ;               
            recorder.stopRecording();

            MidiSystem.write(record, MidiSystem.getMidiFileTypes(record)[0], new File("output.mid")); 
        } catch(Exception e) {
            e.printStackTrace();
            System.exit(1);
        }       
        System.exit(0);
    }   
}

任何人都可以查明问题吗? 感谢。

2 个答案:

答案 0 :(得分:0)

这里只是一个疯狂的猜测,但我敢打赌,如果你将播放器和录音机放在两个不同的线程中,这将会更好。

答案 1 :(得分:0)

上面代码创建的MIDI文件包含所有相关事件,但它们都是在0时刻堆积的。

也许这是因为“录音机”中的所有曲目都是空的。

无论如何,将(meta)事件添加到“记录”中的其中一个曲目中,以适当的时间点为我工作。

干杯, 恩佐