MIDI音序器停止而不刷新

时间:2016-04-06 14:49:30

标签: java midi javax.sound.midi

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

我尝试使用sequencer.setTempoInBPM(0)并完成工作,但还有其他不需要的副作用特定于我的项目。

最明显的解决方案似乎压倒Sequencer.stop(),但我该怎么做?这个被覆盖的方法到底会是什么样的?

修改 我想根据 gpasch 的评论编辑问题。

  

不仅可以停止播放,还可以发送MIDI音符关闭消息   所有发声的音符:你在说什么? 不是这样的   事??

音频也是如此,但对于MIDI来说却不是这样。 MIDI协议本身不指定任何音频数据。它只给乐器上的指令播放的内容。乐器解释MIDI信息并发出最终声音。

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

  1. [音序器] MIDI信息输出:注意
  2. [乐器] MIDI留言:留言
  3. [乐器] 开始解释音符:开始发声
  4. [音序器] 等待一秒
  5. [音序器] MIDI信息输出:注意关闭
  6. [乐器] MIDI信息输入:注意关闭
  7. [乐器] 开始解释音符关闭:停止发出声音
  8. 因此,如果此过程在步骤4中被中断,则会产生“无尽的音符”。因为MIDI乐器有指令开始播放某个音符,但从未得到停止播放该音符的指令。 [*]

    回顾我的问题。当我在一个音符中间调用sequencer.stop()时(步骤4),而不是一个“无尽的音符”,那个时刻正在播放的所有音符都没有音符关闭< / em>消息,停止发声。对此的逻辑表达是sequencer.stop()在引擎盖下发送MIDI All Note Off消息。我们真的非常感谢,因为其他人sequencer.stop()将是一个真正的混乱。在我的特殊情况下,虽然我真的需要音序器不发送音符关闭消息。所以问题是:我能为此做一个解决方法吗?

    * 如果是声音自然衰减的钢琴声,声音最终会消失。但是使用合成声音,声音会一直持续到

1 个答案:

答案 0 :(得分:1)

我会这样做的。创建一个过滤器,基本上接收从音序器发送的所有内容并将其发送到midi输出。在此过滤器内创建一个条件,如果&#34;暂停标志&#34;是真的所有笔记将被收到但不发送。

创建一个pause()方法,在调用时首先设置&#34;暂停标记&#34;为true然后执行sequencer.stop()。

当然,您需要一些方法来跟踪已被阻止的音符关闭,这样您可以在最终想要的时候实际停止它们,否则它们将永远保持不变。