对于我正在研究的项目,我需要暂停midi sequencer,我希望所有发声音符都能持续,从而使这些音符无穷无尽。我面临的问题是sequencer.stop()
显然不仅停止了播放,而且还向所有发声音符发送MIDI音符关闭消息,终止所有发声音符(在一些文献中称为刷新)。
我尝试使用sequencer.setTempoInBPM(0)
并完成工作,但还有其他不需要的副作用特定于我的项目。
最明显的解决方案似乎压倒Sequencer.stop()
,但我该怎么做?这个被覆盖的方法到底会是什么样的?
修改 我想根据 gpasch 的评论编辑问题。
不仅可以停止播放,还可以发送MIDI音符关闭消息 所有发声的音符:你在说什么? 不是这样的 事??
音频也是如此,但对于MIDI来说却不是这样。 MIDI协议本身不指定任何音频数据。它只给乐器上的指令播放的内容。乐器解释MIDI信息并发出最终声音。
为了让乐器播放一秒钟的声音,这就是行动:
因此,如果此过程在步骤4中被中断,则会产生“无尽的音符”。因为MIDI乐器有指令开始播放某个音符,但从未得到停止播放该音符的指令。 [*]
回顾我的问题。当我在一个音符中间调用sequencer.stop()
时(步骤4),而不是一个“无尽的音符”,那个时刻正在播放的所有音符都没有音符关闭< / em>消息,停止发声。对此的逻辑表达是sequencer.stop()
在引擎盖下发送MIDI All Note Off消息。我们真的非常感谢,因为其他人sequencer.stop()
将是一个真正的混乱。在我的特殊情况下,虽然我真的需要音序器不发送音符关闭消息。所以问题是:我能为此做一个解决方法吗?
* 如果是声音自然衰减的钢琴声,声音最终会消失。但是使用合成声音,声音会一直持续到
答案 0 :(得分:1)
我会这样做的。创建一个过滤器,基本上接收从音序器发送的所有内容并将其发送到midi输出。在此过滤器内创建一个条件,如果&#34;暂停标志&#34;是真的所有笔记将被收到但不发送。
创建一个pause()方法,在调用时首先设置&#34;暂停标记&#34;为true然后执行sequencer.stop()。
当然,您需要一些方法来跟踪已被阻止的音符关闭,这样您可以在最终想要的时候实际停止它们,否则它们将永远保持不变。