java MIDI音序器停止而不刷新
对于我正在做的一个项目,我需要暂停midi sequencer,我希望所有听起来的音符都能持续下去,从而使这些音符永无止境。我面临的问题是sequencer.stop()
显然不仅停止播放,而且还向所有发声音符发送MIDI note off消息,终止所有发声音符(在一些文献中称为刷新)
我曾尝试使用sequencer.setTempoInBPM(0)
,这样就完成了工作,但对我的项目有其他不必要的副作用
最明显的解决方案似乎凌驾于Sequencer.stop()
之上,但我该怎么做呢?那个被重写的方法到底会是什么样子
编辑: 我想编辑这个问题以回应gpasch的评论
not only stops the playback, but also sends MIDI note off messages to all sounding notes: what are you talking about?? isnt this the same thing??
这对音频来说是正确的,但对MIDI来说不是这样。MIDI协议本身不指定任何音频数据。它只向乐器提供演奏什么的指令。乐器解释MIDI信息并发出最终声音
为了让乐器播放一秒钟的声音,以下是操作:
- [Sequencer]MIDI消息输出:注意
- [Instrument]MIDI信息输入:注意
- [乐器]开始口译注意:开始发声
- [Sequencer]等待一秒钟
- [Sequencer]MIDI信息输出:注意
- [Instrument]MIDI信息输入:注意
- [乐器]开始口译注意事项:停止发声
因此,如果这个过程在第4步被打断,就会产生一个“无休止的音符”。因为MIDI乐器收到了开始演奏某个音符的指令,但从未收到停止演奏该音符的指令。[*]
回顾我的问题。当我在注释的中间调用^ {CD1}}(步骤4),而不是有一个“无穷无尽的注释”,所有在那一刻被播放的笔记,都还没有得到注释“EEM>消息”,停止发声。对此的逻辑解释是sequencer.stop()
在引擎盖下发送MIDI All Note Off消息。我们真的可以为此而心存感激,因为其他的一切都会一团糟。但在我的特殊情况下,我真的需要音序器不要发送note off消息。所以问题是:我能为这个做个变通吗
* 如果是钢琴声音,声音会自然衰减,那么声音最终会消失。但是有了synth声音,声音会一直持续到
# 1 楼答案
我会这么做的。创建一个过滤器,基本上可以接收音序器发送的所有内容,并将其发送到midi输出。在该过滤器内,创建一个条件,如果“暂停标志”为真,则将接收但不发送所有备忘
创建一个pause()方法,调用该方法时,首先将“pause flag”设置为true,然后执行sequencer。停止()
当然,你需要一些方法来记录那些被阻止的笔记,这样当你最终想要阻止它们的时候,你才能真正阻止它们,否则它们真的会永远存在