java - MIDI 音序器停止而不冲洗

标签 java midi javax.sound.midi

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

我尝试使用 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 协议(protocol)本身不指定任何音频数据。它仅向乐器提供演奏内容的指令。乐器解释 MIDI 消息并发出最终的声音。

为了让乐器演奏一秒钟的声音,请执行以下操作:

  1. [音序器] MIDI 消息输出:注释
  2. [乐器] MIDI 消息输入:注释
  3. [乐器]开始解释注释:开始发出声音
  4. [音序器]等待一秒钟
  5. [音序器] MIDI 消息输出:音符关闭
  6. [乐器] MIDI 消息输入:音符关闭
  7. [乐器]开始解释音符关闭:停止发出声音

因此,如果此过程在第 4 步被中断,则会创建“无尽的音符”。因为 MIDI 乐器收到了开始播放某个音符的指令,但从未收到停止播放该音符的指令。 [*]

回顾我的问题。当我在音符中间调用 sequencer.stop() 时(第 4 步),不是出现“无尽的音符”,而是在那一刻正在播放的所有尚未播放的音符一条注意消息,停止发声。对此的逻辑解释是 sequencer.stop() 发送 MIDI All Note Off消息在引擎盖下。我们对此非常感激,因为否则 sequencer.stop() 将是一个真正的困惑。在我的特殊情况下,尽管我确实需要定序器不发送 note off 消息。所以问题是:我可以为此找到解决方法吗?

* 如果是声音自然衰减的钢琴声音,声音最终会消亡。但对于合成声音,声音将持续存在,直到出现

最佳答案

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

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

当然,您需要某种方法来跟踪已被阻止的音符,以便您最终可以真正阻止它们,否则它们将永远保留。

关于java - MIDI 音序器停止而不冲洗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36454662/

相关文章:

objective-c - UIButton setImage 未从非触摸操作更新

java - MIDI 轨道不改变音高或乐器

browser - 浏览器之间的MIDI或OSC控件

audio - 较新版本的 JRE 不加载音库,但旧版本会加载

java - 使用 JPA 和 Hibernate 时如何避免父类(super class)查询中的多态性

java - java中的重复字符串

Java 同步

Java Gervill 软件合成器不工作

用于 SSH 辅助登录验证的 Java API