通过应用代码,我实现了线性ADSR包络,用于整形振荡器输出的幅度。可以在包络上设置攻击,衰减和释放持续时间以及延音水平的参数,一切都会按预期进行。

但是,我想将包络的斜坡形状调整为与大多数合成器用于更自然响应的方式相似:反指数适用于攻击,指数适用于衰减和释放。我无法正确计算公式来计算这些类型的斜坡形状的包络输出值。为了计算线性斜率,我使用两点形式,插入从攻击/衰减/维持/释放输入参数值得出的开始/结束$ x $ / $ y $值。我似乎无法使用相同的开始/结束$ x $ / $ y $点值来计算指数(标准和反向)斜坡的正确公式。

我保存了一个Desmos Graphing Calculator会话,演示了我上面描述的线性斜坡方法。

如果有人可以帮助我指出正确的方向,将不胜感激。

#1 楼

我认为让您感到困惑的是,递减的指数($ e ^ {-x} $)永远不会达到0,因此具有真正指数段的ADSR生成器将保持不变;因为它永远不会达到目标值。例如,如果生成器处于攻击阶段的高峰(例如$ y = 1 $)并且必须降落到$ y = 0.5 $的维持值,则它不能以真实的指数去,因为真正的指数不会衰减到0.5,它只会渐近地变为0.5!

如果您看一个模拟包络发生器(例如大家似乎都在使用基于7555的电路),您会看到在攻击阶段,当电容器正在充电时,它“指向高于”用于指示攻击阶段结束的阈值。在由+ 15V供电的基于(7)555的电路上,在启动阶段,电容器以+ 15V的步长充电,但是当达到+ 10V的阈值时,启动阶段结束。这是一种设计选择,尽管2/3是许多经典信封生成器中发现的“魔术数字”,而这可能是音乐家熟悉的一个数字。



因此,您可能要处理的函数不是指数函数,而是移位/截断/缩放的版本,您将不得不选择如何使其“压缩”。
无论如何我还是很好奇,为什么要尝试获得这样的公式-也许是因为您使用的合成工具有限;但是,如果您要尝试使用通用编程语言(C,java,python)来实现这些代码,并为信封的每个示例运行一些代码,并使用“状态”的概念,请继续阅读...,因为这样做总是更容易表示“这样的段将从它刚刚达到的任何值变为0”。

关于实现信封的两点建议。

第一个是不要尝试缩放所有的斜率/增量,以使包络线准确地达到起始值和终止值。例如,您希望信封在2秒内从0.8变到0.2,因此您可能会想计算-0.3 /秒的增量。不要那样做相反,将其分为两步:在2秒内获得从0到1.0的渐变;然后应用将0映射到0.8和将1.0映射到0.2的线性变换。以这种方式工作有两个优点:首先是它简化了相对于包络时间到0到1的任何计算;第二个问题是,如果您在中途更改包络参数(增量和开始/结束时间),一切都会保持良好状态。如果您正在制作合成器,那就很好了,因为人们会要求将包络时间参数作为调制目标。它在计算上更轻巧,它消除了许多肮脏的细节(例如,您不必费心不完全达到0的指数-随心所欲地截断并重新缩放它,以便将其映射到[0,1]),并且为每个阶段提供一种更改包络形状的选项非常简单。

这是我描述的方法的伪代码。

评论


$ \ begingroup $
我似乎通过采用y =((y2-y1)/(x2-x1))*(x-x1)+ y1的线性比例/两点方程式来解决我的问题,用x个变量,其中e ^ x到y =((y2-y1)/(e ^ x2-e ^ x1))*(e ^ x-e ^ x1)+ y1。我在链接上的计算器会议演示了这种方法。我应该注意他们的任何陷阱吗?结果对我来说似乎是正确的。
$ \ endgroup $
–加里·迪里斯(Gary DeReese)
2012年6月8日15:51



$ \ begingroup $
这不是其他合成器上的信封形状。根据开始和结束位置的时间/相对位置,它可能变得非常线性。
$ \ endgroup $
–小食
2012年6月8日19:01

$ \ begingroup $
@pichenettes,您是否愿意粘贴生成这些信封的脚本?
$ \ endgroup $
– P i
2014-02-28 13:32

#2 楼

这是一个很老的问题,但我只想强调小插图回答中的要点:例如,您希望信封在2秒内从0.8变到0.2 [。 ..]将其分为两步:在2秒内获得从0到1.0的渐变;然后应用线性变换,将0映射到0.8,将1.0映射到0.2。


此过程有时称为“缓动”,其外观类似于

$ $ g \ left(x,l,u \ right)= f \ left(\ frac {xl} {ul} \ right)\ left(ul \ right)+ l $$

其中$ l $和$ u $是下限和上限(可能的值为$ 0 $,$ 1 $和维持水平),$ f(x)$类似于$ x ^ n $。请注意,在攻击阶段不需要它,因为它的范围从$ 0 $到$ 1 $。

这是原始的Desmos会话,已更新为使用此方法。我在这里使用了立方形状,但是只要$ f(x)$产生的输出范围从零到一,给定的输入范围从零到一,您就可以使用任何喜欢的形状。

*我想OP可能早已不复存在,但这也许对其他人有所帮助。

评论


$ \ begingroup $
谢谢你,我正在为我开发的DAW编写一个采样器,并插入了Desmos会话中提供的公式,它们运行良好。不再有la脚的线性信封了! :)
$ \ endgroup $
–道格拉斯
19年8月12日在16:42

#3 楼

关于pichenettes的评论,“在攻击阶段,电容器以+ 15V的步长充电,但是当达到+ 10V阈值时,攻击阶段结束。这是一种设计选择,尽管2/3是“魔术数字“可以在许多经典的包络发生器中找到,而这可能是音乐家所熟悉的。” 。只是15v是容易获得的最高渐近线,它足够接近线性。就是说,没有什么“魔术”可以使它们线性化。

我不知道有多少经典合成器使用15v,我怀疑通常一两个二极管压降。我以前的Aries模块化产品使用13v的10v信封,而我只是查找了Curtis ADSR芯片,该芯片等效地使用6.5v的5v信封。

#4 楼

这段代码应生成与小插图类似的图: (确定三个阶段中每个阶段的陡度)在0和1之间变化,其中0.5为直线。但是我看不到如何做到这一点。