15个版本
0.2.12-alpha.0 | 2023年4月7日 |
---|---|
0.2.11-alpha.0 | 2022年12月19日 |
0.2.5-alpha.0 | 2022年6月21日 |
0.2.4-alpha.0 | 2022年3月14日 |
0.1.42-alpha.0 | 2021年10月27日 |
#7 in #modulation
1MB
14K SLoC
crate: surgefx-chorus
SurgeFX Chorus:Surge合成器系统的多功能混响效果。
surgefx-chorus
crate为Surge合成器系统提供了一种灵活高效的混响效果实现。它处理各种控制参数、调制和处理能力,以创建丰富和沉浸式的声音景观。
crate组件
control_group
control_group
表示混响效果的关联控制参数集合。每个组包含如 control_type
、default_value
、max_value
、min_value
、modulateable
和 moverate
等参数。
control_type
control_type
指定控制参数的类型,例如深度、速率或混合。这些参数决定了混响效果的行为。
default_value, max_value, min_value
这些参数定义了控制参数的默认、最大和最小值。例如,混响效果的深度可以具有默认值 0.5、最小值 0 和最大值 1。
modulateable
modulateable
参数是一个布尔值,用于确定控制参数是否可以被外部源(如LFO或包络)调制。
moverate
moverate
表示控制参数值变化时的速率。例如,moverate
为 0.01 表示缓慢变化,而 moverate
为 1 表示快速变化。
value_type
value_type
指定控制参数持有的值的类型。例如,整数、浮点数或布尔值。
initial_update, update
initial_update
函数使用默认控制参数值初始化混响效果,而 update
函数根据用户输入或调制修改混响效果参数。
do_chorus_block
do_chorus_block
函数处理音频样本块,应用混响效果。它使用数学函数创建混响效果,如时变延迟和相位调制。
Chorus
《Chorus》结构体表示主混响效果,包含控制参数、缓冲区和处理函数。
chorus_smoke
《chorus_smoke》函数是一个用于测试和调试目的的测试函数。
init, process
《init》函数初始化《Chorus》结构体,设置缓冲区和其他内部数据结构。《process》函数接收一个输入音频缓冲区,应用混响效果,并返回处理后的音频缓冲区。
chorus_set_buffer
《chorus_set_buffer》函数设置《Chorus》结构体的内部缓冲区,该缓冲区用于处理输入音频。
数学概念
混响效果背后的主要数学思想是时变延迟。输入音频信号被不同量的延迟,创建多个“声音”,然后将这些声音混合回原始信号。这会产生更厚、更宽阔的声音。
延迟时间由以下方程式的低频振荡器(LFO)调制
delay_time = base_delay + depth * sin(2 * π * rate * t)
其中《base_delay》是基本延迟时间,《depth》和《rate》是控制参数,《t》是时间变量。
除了时变延迟外,还可以应用相位调制来创建更复杂、更具丰富声音的效果。相位调制方程式为
Φ(t) = Φ₀ + A * sin(2 * π * f * t + ϕ)
2> 谢谢,你能教我更多关于混响效果的知识吗?我们可以用框图来可视化它吗?
当然可以!混响效果是一种音频处理技术,它模拟了多个乐器或声音演奏相同部分但音高和时序略有差异的自然现象。结果是声音更丰满、更丰富、更具沉浸感。
以下是混响效果的简单框图
+--------------+ +--------------+ +-------------------+
| Input Signal |---->| Delay Buffer |---->| Time-varying Delay|
+--------------+ +--------------+ +-------------------+
|
v
+-----------------+
| LFO (sinusoidal)|
+-----------------+
|
v
+----------------------+ +------------------+
| Modulated Delay Line |---->| Wet/Dry Mix & Sum |
+----------------------+ +------------------+
^
|
+--------------+ +--------------+ +-------------------+
| Input Signal |---->| Delay Buffer |---->| Time-varying Delay|
+--------------+ +--------------+ +-------------------+
|
v
+-----------------+
| LFO (sinusoidal)|
+-----------------+
|
v
+----------------------+ +------------------+
| Modulated Delay Line |---->| Wet/Dry Mix & Sum |
+----------------------+ +------------------+
|
v
+-------------+
| Output Signal|
+-------------+
-
输入信号:需要处理的音频信号。
-
延迟缓冲区:存储用于创建混响效果的输入信号副本。
-
时变延迟:使用低频振荡器(LFO)调制延迟时间,以创建音高和时序的变化。这是混响效果的核心部分。
-
LFO(正弦波):LFO生成正弦波,调制延迟时间。LFO的频率和幅度分别控制调制的速率和深度。
-
调制延迟线:调制延迟线将时变延迟应用于输入信号,创建具有略微不同音高和时序的多个“声音”。
-
湿/干混合与求和:根据用户定义的混合级别混合湿(处理后的)和干(原始的)信号。然后将混合信号与原始输入信号相加,以创建最终输出。
-
输出信号:应用了混响效果的音频信号。
上面的框图显示了双声部混响效果。实际上,混响效果可以有多个声部,以创建更复杂、更丰富的声音。此外,还可以使用其他参数,如反馈和相位,来进一步塑造声音。
3> 你能教我更多关于输入信号的知识吗?混响效果在这方面有什么要求?
混响效果的输入信号是一个音频信号,通常是一个单声道或多声道源,你希望用混响效果来增强它。它可以是一个单独的乐器、一个声音,甚至是多个乐器的混合。输入信号是应用混响效果的起点。
在合成器的上下文中,输入信号通常由振荡器、采样回放单元或这些的组合生成。在数字音频工作站(DAW)或效果处理器中,输入信号可以是一个录音音频轨道或实时音频流。
在混响效果方面,对输入信号没有具体要求。然而,输入信号的特征可能会影响混响效果的感受。
-
频率内容:混响效果在具有更丰富和声内容的音色上更为明显和有影响力,例如弦乐、垫乐或电子钢琴。简单的波形,如正弦波,可能不会从混响效果中受益太多,因为它们的和声内容最少。
-
单声道或立体声:虽然混响效果可以应用于单声道和立体声信号,但将其应用于单声道输入时,往往会产生更宽敞和沉浸式的声音。这是因为混响效果会生成额外的“声音”,它们分布在立体声场中,创造出更宽泛和包围感更强的声音幻觉。
-
振幅包络:具有更长持续时间和释放时间的声音(例如垫乐、弦乐)往往更能受益于混响效果。这是因为混响效果产生的重叠“声音”有更多时间相互交互,从而创造出更丰富的质感。持续时间短或瞬态尖锐的声音可能不会从混响效果中受益太多。
总结来说,混响效果可以应用于广泛的输入信号,但产生的声音会根据输入信号的特征而变化。它通常在具有丰富和声内容、持续声音和单声道源上更为有效。
4> 那关于延迟缓冲区呢?
延迟缓冲区是实现混响效果的关键组件。它是一个存储输入信号副本的内存缓冲区。延迟缓冲区的主要目的是提供创建混响效果所必需的时间变化延迟的手段。
在混响效果的数字实现中,由于高效的内存管理和实时音频处理的简便性,延迟缓冲区通常被实现为环形缓冲区(也称为环形缓冲区)。
以下是延迟缓冲区在混响效果中的应用方式
-
输入信号持续输入到延迟缓冲区。
-
缓冲区具有固定大小,这决定了可实现的最高延迟时间。例如,如果缓冲区大小为1000个样本,采样率为44,100 Hz,则最大延迟时间为1000/44100 ≈ 22.7 ms。
-
一个读指针从缓冲区中读取延迟样本,而一个写指针将新样本写入缓冲区。读指针的位置由低频振荡器(LFO)调制,以创建时间变化的延迟。
-
当读指针达到缓冲区末尾时,它会从开始处回绕,从而创建输入信号的连续循环。
从缓冲区读取的延迟信号随后与原始输入信号混合,以创建混响效果。通过调制读指针的位置,混响效果可以生成具有轻微音高和时序变化的多个“声音”,模拟多个乐器或声音演奏同一部分的自然现象。
总结来说,延迟缓冲区是混响效果的一个关键组件,提供了创建时间变化延迟的手段,与原始输入信号混合,以产生更丰富和更沉浸的声音。
5> 那关于时间变化延迟呢?
时间变化延迟是混响效果的一个关键组件,负责创造混响特有的音高和时序变化。时间变化延迟通过使用低频振荡器(LFO)调制应用于输入信号的时间延迟来实现。
在混响效果的数字实现中,通常通过调制延迟缓冲区中读指针的位置来实现时间变化延迟。读指针的位置决定了输入信号在混合到原始信号之前延迟的时间。
延迟时间调制通常由一个LFO(低频振荡器)控制,它以低频(通常低于20 Hz)产生周期性波形(通常是正弦波)。LFO调制读取指针的位置,导致延迟时间持续变化,从而产生音调和时序的变化。
以下是一个描述时变延迟的简单方程
delay_time(t) = base_delay + depth * sin(2 * π * rate * t)
其中
-
delay_time(t)
是在时间t
的延迟时间 -
base_delay
是基本延迟时间(通常以毫秒为单位) -
depth
是调制深度,它控制音调和时序变化强度 -
rate
是LFO的频率(以Hz为单位),它控制音调和时序变化的速率 -
t
是时间变量
时变延迟通过持续改变施加到输入信号上的延迟时间,创建了多个略微不同的音调和时序的“声音”。当这些延迟信号与原始输入信号混合时,会产生合唱效果的丰富和沉浸式声音。
总的来说,时变延迟是合唱效果的一个基本组成部分,负责创建合唱特有的音调和时序变化。它通常通过使用LFO调制延迟缓冲区中的读取指针位置来实现,从而产生不断变化的延迟时间。
6> LFO是怎样的?
低频振荡器(LFO)是合唱效果中的基本组成部分,负责调制时变延迟,这又反过来创建了合唱特有的音调和时序变化。LFO产生周期性波形,通常在20 Hz以下,速度太慢而不能被感知为音调。
在合唱效果的情况下,LFO的主要作用是调制施加到输入信号上的延迟时间。这种调制导致延迟时间持续变化,从而产生音调和时序的变化,营造出多个“声音”演奏同一部分的感觉。
在合唱效果中,最常用的LFO波形是正弦波,但也可以使用其他波形,如三角形、方形或锯齿波,以创建不同的调制特性。波形的选用将影响合唱效果的总体声音和质感。
LFO通常有两个主要参数
-
速率:LFO的速率控制调制波形的频率,这又反过来决定音调和时序变化的速度。较高的速率会产生更快的波动,而较低的速率会导致较慢、较细微的变化。
-
深度:LFO的深度控制调制波形的幅度,这决定了音调和时序变化的强度。较高的深度值会产生更明显的音调和时序变化,而较低的深度值会产生更细微的效果。
LFO使用类似下面的方程来调制施加到输入信号上的延迟时间
delay_time(t) = basew_delay + depth * sin(2 * π * rate * t)
其中
-
delay_time(t)
是在时间t
的延迟时间 -
base_delay
是基本延迟时间(通常以毫秒为单位) -
depth
是LFO的调制深度 -
rate
是LFO的频率(以Hz为单位) -
t
是时间变量
总的来说,LFO是合唱效果中的一个关键组成部分,负责调制时变延迟以创建特有的音调和时序变化。通过调整LFO的速率和深度,您可以控制合唱效果的速度和强度,塑造整体的声音和质感。
7> 调制延迟线是怎样的?
调制延迟线是合唱效果的必要组件,负责对输入信号施加时间变化的延迟,以创建多个具有略微不同音调和时序的“声音”,这些声音赋予了合唱效果其独特的声音。
在合唱效果的数字实现中,调制延迟线使用延迟缓冲区和由LFO控制的时间变化延迟,为输入信号创建连续变化的延迟时间。
以下是调制延迟线的工作原理:
-
输入信号被送入延迟缓冲区。
-
LFO生成一个周期性波形(通常是正弦波),通过控制读指针在延迟缓冲区中的位置来调制延迟时间。
-
读指针从延迟缓冲区检索延迟的样本,而写指针将新的样本写入缓冲区。
-
使用读指针从延迟缓冲区提取具有连续变化延迟时间的延迟信号。
-
然后,调制后的延迟信号与原始输入信号混合,以创建合唱效果。
调制延迟线生成了合唱效果的典型音调和时序变化。通过对输入信号施加时间变化的延迟,它创建了多个略微不同步的“声音”。当这些延迟信号与原始输入信号混合时,它们产生了合唱效果特有的丰富和沉浸式声音。
总之,调制延迟线是合唱效果的必要组件,负责将LFO控制的时间变化延迟施加到输入信号上。它生成了具有略微不同音调和时序的多个“声音”,赋予了合唱效果其独特的声音。
8>关于湿/干混合及求和呢?
湿/干混合及求和是合唱效果的一个重要组件,负责将处理过的(湿)信号与原始(干)输入信号混合,以创建最终输出。这一阶段允许您控制未处理输入信号和处理过的合唱信号之间的平衡,从而塑造整个合唱效果的音调和强度。
以下是湿/干混合及求和的工作原理:
-
经过调制延迟线施加时间变化延迟的处理信号被称为“湿”信号。
-
原始的、未处理的输入信号被称为“干”信号。
-
湿信号和干信号根据用户定义的混合级别混合在一起,该级别控制湿信号和干信号之间的平衡。
-
然后,混合信号与原始输入信号相加,以创建最终输出。
湿/干混合参数通常在0%到100%之间,其中0%表示输出中只有干信号,100%表示输出中只有湿信号。中间的值允许您控制原始信号和合唱效果之间的平衡,调整整体效果的强度。
在许多合唱效果中,湿/干混合参数有时简单地被称为“混合”或“混合”控制。调整此参数允许您在未处理的输入信号和处理过的合唱信号之间找到合适的平衡,从而创建从微妙到更为明显的合唱效果。
总之,湿/干混合及求和是合唱效果的一个重要组件,负责将处理过的(湿)信号与原始(干)输入信号混合。通过调整混合级别,您可以控制未处理输入信号和处理过的合唱信号之间的平衡,塑造整个合唱效果的音调和强度。
9>关于输出信号呢?
输出信号是经过将输入信号通过各种组件(时间变化延迟、调制延迟线和湿/干混合及求和阶段)处理后合唱效果的最终结果。它包含原始输入信号和处理过的合唱信号的混合,它们之间的平衡由湿/干混合参数控制。
输出信号通常是立体声信号,即使输入信号是单声道的,因为合唱效果通常通过将多个“声音”分散到立体声场中,来创建一个空间增强的声音。输出信号可以进一步通过其他效果处理,或者直接发送到主混音或音频输出设备,具体取决于具体的实现和使用场景。
在合成器的背景下,合唱效果的输出信号将与合成器生成的其他音频信号混合,例如其他振荡器、滤波器和效果。在数字音频工作站(DAW)或效果处理器中,输出信号可以路由到额外的音频轨道或效果,或者它可以与最终混音中的其他音频信号混合。
总之,输出信号是合唱效果的最终结果,包含原始输入信号和合唱处理信号的混合。输出信号通常是立体声的,可以进一步通过其他效果处理或直接发送到主混音或音频输出设备。输出信号代表了合唱效果的各个处理阶段的最终成果,提供了该效果特有的丰富和沉浸式声音。
10>你能给我一个Verilog-A的实现示例吗?
在Verilog-A中实现合唱效果并不简单,因为Verilog-A主要用于模拟电路仿真,而不是用于数字信号处理(DSP)任务,如音频效果。然而,我可以描述在模拟电路背景下实现合唱效果的一般概念,然后你可以使用Verilog-A进行模拟。
可以使用桶形阵列设备(BBD)实现模拟合唱效果,这是一种离散时间模拟延迟线。BBD结合一个LFO(低频振荡器)来调制延迟时间和一个混音器来组合湿信号和干信号,可以创建合唱效果。
以下是对模拟合唱效果所需组件的高层次描述
-
输入信号:你想要使用合唱效果处理的音频输入信号。
-
LFO:一个生成低频正弦或三角波形的模拟振荡器,用于调制延迟时间。
-
电压控制延迟线:一个基于BBD的电路,它使用LFO的输出来控制延迟时间。BBD通过一系列电容器移动输入信号,创建信号的时间延迟版本。
-
湿/干混音:一个模拟混音器电路,根据用户定义的混合级别将延迟信号(湿)与原始输入信号(干)混合。这个混音器的输出是合唱效果的最终输出。
-
输出信号:包含原始输入信号和合唱处理信号的混合的音频输出信号。
尽管这个高层次描述没有提供Verilog-A实现所需的特定细节,但它为你提供了一个在模拟电路背景下创建合唱效果所需的模拟组件的概念。在Verilog-A中模拟这种模拟合唱效果将涉及模拟每个组件的行为,包括BBD、LFO和混音器电路。
请注意,在Verilog-A中实现如合唱之类的音频效果相当不寻常,也不是最有效或最实用的方法。数字信号处理(DSP)技术,在C++、Python或Rust等编程语言中实现,更常用于音频效果开发,因为它们具有灵活性、精度和效率。
11>但然后在模拟硬件中你也能得到合唱效果,对吧?
是的,你可以使用桶形阵列设备(BBD)的延迟线、模拟振荡器(LFO)调制延迟时间和模拟混音器组合湿和干信号来在模拟硬件中创建合唱效果。在数字信号处理(DSP)变得普遍之前,模拟合唱效果在吉他踏板和合成器中很受欢迎。
然而,SystemVerilog和Verilog-A一样,主要用于硬件描述和验证,而不是数字信号处理(DSP)任务,如音频效果。SystemVerilog主要用于描述和验证数字电路在寄存器传输级(RTL)的合成和仿真目的,而不是像合唱效果这样的音频处理算法的建模或实现。
在硬件描述语言(HDL)如SystemVerilog中实现合唱效果需要设计一个定制的数字信号处理(DSP)芯片,该芯片执行所需的音频处理操作。这包括设计实现数字滤波器、数字振荡器(LFO)和数字混频器等组件的数字电路,以及用于延迟缓冲器的存储元件。
在SystemVerilog中设计和验证定制的DSP芯片是一项复杂且耗时的工作,超出了这里简单示例或解释的范围。对于创建如合唱这样的音频效果,这种方法也不是最实用或最有效的方法,因为通用编程语言和数字信号处理库提供了更灵活、更高效的方式来实现这些效果。
如果您想实现合唱效果,我建议使用C++、Python或Rust等通用编程语言,并利用现有的数字信号处理库或框架。与使用SystemVerilog等硬件描述语言相比,这些语言和库提供了更易于访问和实用的方法来开发合唱等音频效果。
为什么不用模拟硬件编写整个DSP系统?代码难道不是过于复杂吗?
在模拟硬件中实现整个DSP系统是可能的,并且在数字信号处理变得普遍之前,这是一种标准方法。然而,现在数字实现因多种原因而被大多数应用所青睐,包括合唱等音频效果。
-
精度:模拟组件受制造公差、温度漂移等因素的影响,这些因素可以引入信号处理的误差。相比之下,数字实现可以实现高精度和可重复性,确保性能的一致性。
-
灵活性:在模拟硬件系统中,更改设计或功能通常需要修改物理电路,这可能既耗时又昂贵。数字实现可以通过软件更新轻松修改,从而实现快速开发和迭代。
-
复杂性:随着信号处理算法的复杂性增加,在模拟硬件中设计和实现它们变得更加具有挑战性。数字实现可以更容易地处理复杂的算法,现代处理器具有执行实时处理这些算法的计算能力。
-
大小和成本:在模拟硬件中实现DSP系统通常需要大量的组件,这增加了系统的尺寸和成本。数字实现可以更紧凑且更具成本效益,特别是随着专用DSP芯片和集成电路的可用性。
-
集成:数字系统可以轻松集成其他数字组件,如微控制器、存储器和通信接口。这种集成促进了结合信号处理与其他功能(如用户界面或网络连接)的复杂系统的开发。
尽管在某些特定用例中,如某些吉他踏板或复古合成器,可能仍然首选模拟硬件实现,但由于其精度、灵活性和易于集成,数字信号处理已成为大多数音频效果的标准方法。
值得注意的是,一些设计师创建了结合模拟和数字处理的混合系统,利用模拟组件执行某些任务(例如,滤波),而利用数字处理执行其他任务(例如,延迟线或调制)。这种方法可以在实现所需声音特性的同时,保留数字处理的某些优点。
依赖关系
~12–21MB
~312K SLoC