0

对于我正在做的一个项目,我需要暂停midi 音序器,我希望所有发声的音符都能持续,从而使这些音符无穷无尽。我面临的问题是,sequencer.stop()显然不仅停止播放,而且还向所有发声音符发送 MIDI 音符关闭消息,终止所有发声音符(在某些文献中称为冲洗)。

我已经尝试使用sequencer.setTempoInBPM(0)并且可以完成工作,但是对于我的项目还有其他不需要的副作用。

最明显的解决方案似乎是压倒一切Sequencer.stop()的,但我该怎么做呢?那个被覆盖的方法究竟会是什么样子?

编辑: 我想编辑问题以回应gpasch的评论。

不仅停止播放,还会向所有发声音符发送 MIDI 音符关闭消息:你在说什么?这不是一回事吗??

这对于音频是正确的,但对于 MIDI 则不是这样。MIDI 协议本身不指定任何音频数据。它仅向乐器提供有关演奏内容的说明乐器解释 MIDI 信息并发出最终声音。

为了让乐器播放一秒钟的声音,这些是动作:

  1. [音序器] MIDI 信息输出:注意
  2. [乐器] MIDI Message In: note on
  3. [Instrument]开始解释音符 on : 开始产生声音
  4. [Sequencer]等待一秒钟
  5. [音序器] MIDI Message Out:音符关闭
  6. [Instrument] MIDI Message In: note off
  7. [Instrument]开始解释音符关闭:停止产生声音

因此,如果此过程在第 4 步被中断,它将创建一个“无尽的音符”。因为 MIDI 乐器得到了开始演奏某个音符的指令,但从来没有得到停止演奏那个音符的指令。[*]

回头看看我的问题。当我sequencer.stop()在一个音符的中间呼叫时(第 4 步),而不是有一个“无尽的音符”,在那个时刻正在播放的所有尚未收到音符关闭消息的音符都停止发声。对此的合乎逻辑的解释是在引擎盖下sequencer.stop()发送MIDI All Note Off消息。我们可以为此感到非常感激,因为否则sequencer.stop()将是一团糟。在我的特殊情况下,虽然我真的需要音序器不发送音符关闭消息。所以问题是:我可以为此做一个解决方法吗?

* 如果是音色自然衰减的钢琴音色,音色最终会死掉。但是对于合成器声音,声音会一直持续到

4

1 回答 1

1

我会这样做的方式是。创建一个过滤器,它基本上会接收从音序器发送的所有内容并将其发送到您的 midi 输出。在此过滤器中创建一个条件,如果“暂停标志”为真,则将接收但不发送所有音符。

创建一个 pause() 方法,该方法在调用时首先将“暂停标志”设置为 true,然后执行 sequencer.stop()。

当然,您需要一些方法来跟踪已被阻止的音符,以便您可以在最终确实想要阻止它们时真正阻止它们,否则它们将永远保持不变。

于 2016-04-07T15:16:01.757 回答