有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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信息并发出最终声音

为了让乐器播放一秒钟的声音,以下是操作:

  1. [Sequencer]MIDI消息输出:注意
  2. [Instrument]MIDI信息输入:注意
  3. [乐器]开始口译注意:开始发声
  4. [Sequencer]等待一秒钟
  5. [Sequencer]MIDI信息输出:注意
  6. [Instrument]MIDI信息输入:注意
  7. [乐器]开始口译注意事项:停止发声

因此,如果这个过程在第4步被打断,就会产生一个“无休止的音符”。因为MIDI乐器收到了开始演奏某个音符的指令,但从未收到停止演奏该音符的指令。[*]

回顾我的问题。当我在注释的中间调用^ {CD1}}(步骤4),而不是有一个“无穷无尽的注释”,所有在那一刻被播放的笔记,都还没有得到注释“EEM>消息”,停止发声。对此的逻辑解释是sequencer.stop()在引擎盖下发送MIDI All Note Off消息。我们真的可以为此而心存感激,因为其他的一切都会一团糟。但在我的特殊情况下,我真的需要音序器不要发送note off消息。所以问题是:我能为这个做个变通吗

* 如果是钢琴声音,声音会自然衰减,那么声音最终会消失。但是有了synth声音,声音会一直持续到


共 (1) 个答案

  1. # 1 楼答案

    我会这么做的。创建一个过滤器,基本上可以接收音序器发送的所有内容,并将其发送到midi输出。在该过滤器内,创建一个条件,如果“暂停标志”为真,则将接收但不发送所有备忘

    创建一个pause()方法,调用该方法时,首先将“pause flag”设置为true,然后执行sequencer。停止()

    当然,你需要一些方法来记录那些被阻止的笔记,这样当你最终想要阻止它们的时候,你才能真正阻止它们,否则它们真的会永远存在