我正在组装一个简单的合成器作为学习项目,我想在现代合成器上实现一些更高级的功能,即使用正弦波进行ADSR包络和脉冲宽度调制。目前,我基本上是手动生成样本并将它们推送到音频输出,它有一个样本缓冲区和缓冲区接近空时产生的中断。
我坚持的是如何生成“连续”波形。目前,我为单个波形实例(无论是锯齿还是脉冲)生成样本,并简单地循环该波形以生成连续输出。可以想象,这不适合PWM和ADSR包络。因此,我需要根据需要生成波形,并在运行中对其进行潜在调整,例如调整脉冲宽度或音高(例如对于连音),但我很难过如何在内存中有效地表示,以及如何在缓冲区填满时“暂停”波形生成,并在中断到来时“恢复”。
我不是在寻求一个解决方案,而是在正确的思维方向上轻推: - )
谢谢!
答案 0 :(得分:1)
似乎您生成波的方法是减法合成的合适方法。如果要调整波形的PWM,则必须重新生成样本(或检索存储在存储器中的预先计算的波形)。
在大多数情况下,如果音高发生变化,您还需要重建波表。您可以通过计算相对于波基波的读指针增量来以更快的速度读取波,但这需要在波表中的值之间进行插值,并且可能会引入具有更复杂波的锯齿。
在大多数情况下,当然,生成的波不太可能是2 ^ n个样本。因此,在处理例程开始时,在将当前波形复制到输出缓冲区之前,先复制前一波形的样本。
您不希望再生过程破坏您的DSP处理程序,因此我会在单独的内存位置构建更新的波形,并在准备就绪时将其复制。
在生成波后,应将ADSR包络(减法)应用为移动增益系数,而不是影响波本身。
希望有所帮助:)
答案 1 :(得分:1)