4

我正在编写一个简单的汇编合成器作为一个学习项目,我想实现现代合成器上的一些更高级的功能,即 ADSR 包络和使用正弦波的脉冲宽度调制。目前,我基本上是手动生成样本并将它们推送到音频输出,它有一个样本缓冲区,当缓冲区接近空时它会产生一个中断。

我坚持的是如何生成“连续”波形。目前,我为单个波实例(无论是锯齿波还是脉冲波)生成样本,然后简单地循环该波以生成连续输出。正如您可以想象的那样,这不能很好地扩展到 PWM 和 ADSR 包络。因此,我需要按需生成波形,并对其进行动态调整,例如调制脉冲宽度或音高(例如,用于连奏),但我不知道如何在内存中有效地表示它,以及如何在缓冲区已满时“暂停”波形生成,以及如何在中断出现时“恢复”。

我不是在寻求解决方案,而是在推动正确的思考方向:-)

谢谢!

4

2 回答 2

2

按需生成 wave 将适用于简单的 wave,但如果您以后想要添加额外的功能/dsps,您仍然需要某种缓冲区。

幅度的 ADSR 相当简单,因为您只是缩放波形,对于频率调制它有点复杂,这是一篇解释它的文章链接

你也可以查看farbraush github,应该有一些不错的灵感给你。

于 2012-11-04T00:15:04.543 回答
1

看来您生成波形的方式是减法合成的合适方法。如果要调整波形的 PWM,则必须重新生成样本(或检索存储在内存中的预先计算的波形)。

在大多数情况下,如果音高发生变化,您还需要重建波表。您可以通过计算相对于波基波的读取指针增量来以更快的速度读取波,但这需要在波表中的值之间进行插值,并且可能会引入更复杂的波的混叠。

当然,在大多数情况下,生成的波不太可能恰好是 2^n 个样本。因此,在处理例程开始时,首先从前一个波形中复制样本,然后再将当前波形复制到输出缓冲区。

您不希望再生过程破坏您的 DSP 处理例程,因此我会在单独的内存位置构建更新的波形,并在准备好时将其复制过来。

ADSR 包络(减法)应在波生成后作为移动增益系数应用,而不是影响波本身。

希望有帮助:)

于 2012-11-03T19:17:50.783 回答