0

我需要“连接”两个音序器:播放器和录音机。播放器可能会收到来自不同来源的 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);
    }   
}

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

4

2 回答 2

0

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

于 2012-06-04T08:45:51.887 回答
0

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

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

无论如何,将来在适当的滴答声中将(元)事件添加到“记录”中的轨道之一对我有用。

干杯,恩佐

于 2014-01-04T16:25:47.373 回答