- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
示例:如果我想在我即将自制的 VST 乐器中播放一个声音,并且音序器中的这个音符有 15000 个样本长,并且该音符被 processEvents 设置为 ON,则 processReplace 函数开始播放声音从 0 到 sampleFrames(在我这里的例子中是 10000)。然后,下次进入 processReplace 循环时,音符将剩下 5000 个样本可播放,但循环仍将从 0 播放到 10000,这比音符要播放的样本多 5000 个。将播放 5000 个静音样本,这意味着直到 5000 个样本之后才会关闭此音符!?
如果音序器中的新声音直接放在第一个声音之后,processReplace 函数将看不到由 processEvents 设置的短时间关闭,并且将下一个样本视为第一个声音的连续声音,因为它只会看到再次进入循环时,新音符打开。
如何防止这种情况发生?如果音符在循环中间结束,我该如何停止 processReplace 循环?
最佳答案
我不确定我是否理解你的问题,但这里有一个问题。
当您确定从传入的 Midi 音符事件中在 processEvents 中生成什么声音时,下一次调用 processReplace 必须实现这一点。因此,您需要内部状态来记住在 processEvents 中检测到的注释,并且需要在 processReplace 期间输出。
当样本的持续时间(在您的情况下)长于缓冲区可以容纳的时间(sampleFrames)时,您需要记住您在做什么以及您在哪里。在您的示例中,样本的 2/3 已播放,下一个 processReplace 需要播放样本的最后 1/3。
如果 (Midi) 音符尚未关闭(您没有收到 Midi 音符关闭事件),作为 VSTi 插件,您必须决定如何处理它。因此,您可能想要重复相同的样本并在第二次 processEvents 调用中播放它的前 1/3 - 请记住您必须稍后播放该样本的其余部分。
如果您在这种情况下的任何地方收到 Midi note-off 消息 - 您将必须存储内部状态(数据),告诉插件的 processReplace 逻辑在正确的时间停止播放该样本。许多插件采用快捷方式,将在等于 processReplace 缓冲区的 sampleFrames 的样本 block 中处理此信息。但是,如果您想要精确,则必须检查传入的 Midi 音符事件的 deltaFrames,并在 processReplace 处理中考虑该偏移量。
主机 (DAW) 决定何时调用您的 processEvents 和 processReplace 方法。它通常会在您的插件(实例)的整个生命周期内继续这样做。因此,保持插件正在执行的内部状态是关键。如果它什么都不做——你无论如何都不要改变输出缓冲区(归零)。
希望对您有所帮助。马克
关于c++ - VST SDK 2.4 乐器 - processReplace 和 processEvents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19004868/
示例:如果我想在我即将自制的 VST 乐器中播放一个声音,并且音序器中的这个音符有 15000 个样本长,并且该音符被 processEvents 设置为 ON,则 processReplace 函数
我是一名优秀的程序员,十分优秀!