Java MIDI外部设备传输到音序器';s接收器

Java MIDI外部设备传输到音序器';s接收器,java,midi,javasound,Java,Midi,Javasound,我从外部设备向音序器接收器传输数据时遇到一些问题。我没有问题将其发送到任何其他接收器。例如: 我有两门课: public class TestData { private Receiver receiver; public TestData(Receiver receiver) { this.receiver = receiver; } public void sendTestData() throws InvalidMidiDataE

我从外部设备向音序器接收器传输数据时遇到一些问题。我没有问题将其发送到任何其他接收器。例如:

我有两门课:

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);
    }

}

这同样有效:

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

Transmitter conTrans = device.getTransmitter();
conTrans.setReceiver(new MidiInputDevice("Test"));
因此,控制器发送到我的自定义接收器没有问题。sequencer的接收器从我的TestData类接收数据没有问题。但以下情况(从我的外部控制器传输到音序器的接收器不起作用):

有什么我遗漏的吗

编辑:
好的,我可以看到这首曲子实际上正在接收MIDI事件。我认为问题在于时机。滴答声似乎很高,所以当我去播放它时,我想它只是在等待一段非常非常长的时间来播放在录制开始时发生的事件。我认为这与将我的设备同步到音序器有关,但我不确定我的同步模式应该设置为什么。

好的,我找到了解决这个问题的方法。这似乎很有效。在播放之前,我会根据第一个刻度调整所有刻度。每一条赛道都需要这样做

像这样:

int eventSize = sequencer.getSequence().getTracks()[0].size();
MidiEvent firstEvent = sequencer.getSequence().getTracks()[0].get(0);
long baseTime = firstEvent.getTick();

for(int i = 0; i < eventSize; i++){
    MidiEvent event = sequencer.getSequence().getTracks()[0].get(i);
    event.setTick(event.getTick() - baseTime);
}
int eventSize=sequencer.getSequence().getTracks()[0].size();
MidiEvent firstEvent=sequencer.getSequence().getTracks()[0].get(0);
long baseTime=firstEvent.getTick();
for(int i=0;i
+1,谢谢。。但是,你有关于这个“问题”的消息吗?
MidiDevice device;
MidiDevice.Info[] infos;
infos = MidiSystem.getMidiDeviceInfo();
device = MidiSystem.getMidiDevice(infos[0]);
device.open();

Transmitter conTrans = device.getTransmitter();
conTrans.setReceiver(new MidiInputDevice("Test"));
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();
int eventSize = sequencer.getSequence().getTracks()[0].size();
MidiEvent firstEvent = sequencer.getSequence().getTracks()[0].get(0);
long baseTime = firstEvent.getTick();

for(int i = 0; i < eventSize; i++){
    MidiEvent event = sequencer.getSequence().getTracks()[0].get(i);
    event.setTick(event.getTick() - baseTime);
}