2

外部デバイスからシーケンサーの受信機にデータを送信するのに問題があります。他の受信機に送信しても問題ありません。例:

私はこれらの2つのクラスを持っています:

public class TestData {
    private Receiver receiver;

    public TestData(Receiver receiver)
    {
        this.receiver = receiver;
    }

    public void sendTestData() throws InvalidMidiDataException
    {
        ShortMessage shortMessage = new ShortMessage();
        shortMessage.setMessage(ShortMessage.NOTE_ON, 0, 50, 127);
        receiver.send(shortMessage, 123);
        shortMessage.setMessage(ShortMessage.NOTE_OFF, 0, 50, 0);
        receiver.send(shortMessage, 124);
        shortMessage.setMessage(ShortMessage.NOTE_ON, 0, 51, 127);
        receiver.send(shortMessage, 125);
        shortMessage.setMessage(ShortMessage.NOTE_OFF, 0, 51, 0);
        receiver.send(shortMessage, 126);
    }

}

public class MidiInputReceiver implements Receiver {
    public String name;
    Map<Byte, String> commandMap = new HashMap<Byte, String>();

    public MidiInputReceiver(String name) {
        this.name = name;
        commandMap.put((byte)-112, "Note On");
        commandMap.put((byte) -128, "Note Off");
        commandMap.put((byte) -48, "Channel Pressure");
        commandMap.put((byte) -80, "Continuous Controller");
    }
    public void send(MidiMessage msg, long timeStamp) {
        System.out.println("midi received");
        System.out.println("Timestamp: "  + timeStamp);
        byte[] b = msg.getMessage();

        if(b[0] != -48){
            //System.out.println("Message length: " + msg.getLength());
            System.out.println("Note command: " + commandMap.get(b[0]));
            System.out.println("Which note: " + b[1]);
            System.out.println("Note pressure: " + b[2]);
            System.out.println("---------------------");
        }else{
            //System.out.println("Message length: " + msg.getLength());
            System.out.println("Note command: " + commandMap.get(b[0]));
            System.out.println("Note Pressure: " + b[1]);
            System.out.println("---------------------");
        }
    }
    public void close() {}
}

これはうまくいきます:

sequencer = MidiSystem.getSequencer();
sequencer.open();
Sequence myseq = new Sequence(Sequence.PPQ, 10);
Track newTrack = myseq.createTrack();
sequencer.setSequence(myseq);
sequencer.setTickPosition(0);
sequencer.recordEnable(newTrack, -1);

TestData testData = new TestData(sequencer.getReceiver())
sequencer.startRecording();
testData.sendTestData();

これも同様に機能します:

MidiDevice device;
MidiDevice.Info[] infos;
infos = MidiSystem.getMidiDeviceInfo();
device = MidiSystem.getMidiDevice(infos[0]);
device.open();

Transmitter conTrans = device.getTransmitter();
conTrans.setReceiver(new MidiInputDevice("Test"));

したがって、コントローラーはカスタムレシーバーに問題なく送信できます。また、シーケンサーのレシーバーは、私の TestData クラスから問題なく受信できます。ただし、次のようになります (外部コントローラーからシーケンサーの受信機への送信が機能しません)。

MidiDevice device;
MidiDevice.Info[] infos;
infos = MidiSystem.getMidiDeviceInfo();
device = MidiSystem.getMidiDevice(infos[0]);
device.open();

sequencer = MidiSystem.getSequencer();
sequencer.open();
Sequence myseq = new Sequence(Sequence.PPQ, 10);
Track newTrack = myseq.createTrack();
sequencer.setSequence(myseq);
sequencer.setTickPosition(0);
sequencer.recordEnable(newTrack, -1);

Transmitter conTrans = device.getTransmitter();
conTrans.setReceiver(sequencer.getReceiver());
sequencer.startRecording();

不足しているものはありますか?

編集: トラックが実際に MidiEvents を受信して​​いることがわかります。問題はタイミングだと思います。ティック数が非常に多いように見えるので、再生しようとすると、録音の最初に発生したイベントを再生するのに本当に長い時間を待っているだけだと思います. これは、デバイスをシーケンサーに同期することに関係していると思いますが、SyncModes を何に設定すればよいかわかりません。

4

1 に答える 1