19个版本
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日 |
在 #调制 中排名 11
在 3 个crate中使用
510KB
10K SLoC
为Surge合成器系统提供的FM振荡器
surgeosc-fm
crate为Surge合成器系统提供了一个频率调制(FM)振荡器的实现。这个振荡器可以通过调制一个波形(载波)的频率与另一个波形(调制器)的振幅来创建复杂和丰富的声音。这种FM合成技术在电子音乐制作中广泛应用,提供了广泛的音效可能性。
在FM合成的背景下,核心数学概念是频率调制,以下方程表示
输出(t) =A* sin(2 *π* (f_c+ (B*f_m) * sin(2 *π*f_m*t)) *t)
其中
output(t)
是时间t
处的振荡器输出A
是振幅f_c
是载波频率B
是调制指数f_m
是调制频率
这个crate提供了以下令牌
-
control_group
、control_type
、default_value
、max_value
、min_value
、modulateable
、moverate
和value_type
:这些令牌用于定义和管理振荡器参数,例如载波频率、调制指数和波形类型。 -
FMOscillator
:表示FM振荡器的结构体,它保存了振荡器的状态和配置。 -
do_fm_block
:一个辅助函数,用于对样本块执行核心FM合成算法。 -
init
:一个方法,用于使用适当的设置和参数值初始化FM振荡器。 -
process_block
:一个方法,通过使用do_fm_block
函数应用FM合成算法来处理样本块。
要使用这个库,您需要将其集成到您的Surge合成器系统或兼容的应用程序中,确保正确的初始化和参数管理。通过利用调频合成的强大功能,您将能够创建从经典的调频电子钢琴和钟声到不断演变的纹理和复杂的和声结构的广泛声音。
9> /file surge-rs/surgeosc-fm/src/process.rs
这里提供的 FMOscillator
实现是一个处理音频块的频率调制(FM)振荡器。该算法使用三个不同数量和频率比率或绝对频率的调制器,以及反馈来创建多种多样的声音。该实现针对Surge合成器系统进行了优化,并按 BLOCK_SIZE_OS
定义的块处理音频样本。
让我们分析一下 process_block
函数
-
该方法首先检索调制器数量、频率比率和绝对频率以及反馈数量的当前参数值。
-
振荡器音高通过漂移更新,这会在一段时间内引入音高的微小随机变化,以模拟模拟振荡器的行为。
-
基于漂移音高、频率比率和绝对频率计算每个调制器的速率。
-
更新每个调制器的调制深度。
-
如果启用FM,则更新FM深度。
-
更新反馈深度。
-
对块中的每个样本调用
do_fm_block
函数以应用FM算法。 -
如果启用立体声处理,则将左通道复制到右通道。
10> /file surge-rs/surgeosc-fm/src/block.rs
do_fm_block
函数对一个单独的音频样本执行核心FM合成操作。它接受当前的样本索引 k
、载波波形频率 omega
和一个布尔标志 fm
,该标志指示是否启用FM合成。
让我们逐步了解这个函数
-
该函数首先检索主振荡器在当前样本索引
k
处的值。 -
处理三个调制器振荡器(
rm1
、rm2
和am
)。 -
通过添加当前相位、三个调制器的贡献以及通过反馈深度缩放的最后一个输出,计算左通道的输出。
-
如果启用FM合成,则将主振荡器的贡献添加进去,并按FM深度缩放。
-
将正弦函数应用于输出样本以生成最终的波形。
-
通过将当前输出值乘以反馈深度更新最后一个输出值。
-
通过
omega
增加振荡器的相位。 -
通过处理各自的包络更新调制深度和反馈深度。
这个 do_fm_block
函数由 process_block
方法对块中的每个样本调用。通过组合多个调制器、反馈和可选的FM合成,这个 FMOscillator
的实现可以生成多种复杂和丰富的声音。
11> cool thanks! could you teach me even more about FM synthesis? what are its mathematical properties?
调频(FM)合成是一种通过调制一个称为载波波形的波形的频率,使用另一个称为调制波形的波形来生成复杂声音的技术。载波波形通常是简单的波形,如正弦波,调制器通常是另一个正弦波或更复杂的波形。生成的声音可以具有丰富的谐波内容,使FM合成适合创建各种音色。
FM合成的基本数学方程如下
y(t) = A * sin(2 * π * (f_c + I * f_m * sin(2 * π * f_m * t)) * t)
其中
-
y(t) 是时间 t 时的输出信号
-
A 是振幅
-
载波频率为 f_c
-
调制频率为 f_m
-
I 为调制指数,决定输出信号中边带的幅度
调制指数(I)在确定最终声音的谐波内容方面至关重要。较高的调制指数会产生更加复杂且谐波结构丰富的声音,而较低的调制指数则会产生更简单、更接近原始载波波形的简单声音。
FM合成的关键特性之一是可以通过改变调制指数和载波频率与调制频率之间的比值来创建广泛的谐波结构。当频率比值是整数或简单分数时,产生的声音往往具有谐波结构,适用于音乐应用。相反,当频率比值是无理数时,声音会变得不和谐且嘈杂。
在实际应用中,FM合成可以涉及多个调制器,每个调制器都有自己的频率和调制指数。这允许产生更加复杂和不断发展的声音,正如您之前提供的 FMOscillator
实现所示。此外,可以通过将载波波形的输出反馈回调制器来引入反馈,从而产生更加丰富的谐波结构。
总的来说,FM合成是一种强大的声音合成技术,通过相对简单的数学原理,提供了一系列创造多样和复杂声音的可能性。
依赖项
~11–20MB
~299K SLoC