如果连接到外部 Midi 输出设备,Java 定序器会延迟循环

Posted

技术标签:

【中文标题】如果连接到外部 Midi 输出设备,Java 定序器会延迟循环【英文标题】:Java sequencer loops with a delay if connected to external Midi out device 【发布时间】:2019-01-02 19:21:49 【问题描述】:

我想使用 Java 音序器及其 setLoopCount() 方法循环一个 Midi 序列。

如果音序器的输出连接到外部 Midi 输出设备,则每次序列循环时都会引入明显的延迟。

如果音序器连接到内部 Java 合成器 (Gervill),我不会注意到循环之间有任何延迟。我尝试了不同的循环点,它不会改变问题。我正在使用 Win10/Java 8。

  sequencer = MidiSystem.getSequencer(false);
  sequencer.open();
  Sequence sequence = MidiSystem.getSequence(midiFile);
  sequencer.setSequence(sequence);

  // outDevice=Java synth (Gervill)
  // or
  // outDevice=Edirol UA-25 (USB)
  Receiver outDeviceReceiver = outDevice.getReceiver();
  Transmitter seqTransmitter = sequencer.getTransmitter();
  seqTransmitter.setReceiver(outDeviceReceiver);

  int startLoopTick = 0;
  int endLoopTick = -1;  // Loop at end of sequence
  sequencer.setLoopStartPoint(startLoopTick);
  sequencer.setLoopEndPoint(endLoopTick);
  sequencer.setLoopCount(Sequencer.LOOP_CONTINUOUSLY);

  // if outDevice==Edirol there is a slight delay between loops
  sequencer.start();

【问题讨论】:

这听起来像是您的特定 Java 实现中的错误。 我将 Oracle JDK 8 用于 Win10 x64。有替代品吗? 【参考方案1】:

Sequencer 在循环后自动发送控制器消息。 (在所有通道上重置所有控制器等 121,123,64) 这就是声音延迟的原因。

【讨论】:

我认为如果您添加一些代码来帮助解释事情会有所帮助。用目前的答案形式很难理解你在说什么。

以上是关于如果连接到外部 Midi 输出设备,Java 定序器会延迟循环的主要内容,如果未能解决你的问题,请参考以下文章

定序器接收器时间戳始终输出 -1

Unity中的MIDI输出

Unity 中的 MIDI 输出

Android音视频API(android.media.midi):概览

如何将midi从java程序发送到OSX上的IAC总线

如何将外部传感器连接到 Android 设备?