0

プレーヤーとレコーダーの 2 つのシーケンサーを「配線」する必要があります。プレーヤーはさまざまなソースから 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

上記のコードで作成された MIDI ファイルには、関連するすべてのイベントが含まれていますが、それらはすべてティック 0 に積み上げられています。

おそらくこれは、「recorder」内のすべてのトラックが空であるためです。

とにかく、将来の適切なティックで「レコード」のトラックの1つに(メタ)イベントを追加するとうまくいきました。

乾杯、エンツォ

于 2014-01-04T16:25:47.373 に答える
0

ここでは勝手な推測ですが、プレーヤーとレコーダーを 2 つの別々のスレッドに配置した方がうまくいくと確信しています。

于 2012-06-04T08:45:51.887 に答える