#波形 #wavetable #合成器 #调制 #合成 #频率 #wavetables

nightly surge-wavetable

surge合成器 -- 表示wavetable的结构

16个版本

0.2.12-alpha.02023年4月7日
0.2.11-alpha.02022年12月19日
0.2.5-alpha.02022年6月21日
0.2.4-alpha.02022年3月14日
0.1.42-alpha.02021年10月27日

#12 in #调制

Download history 22/week @ 2024-03-12 10/week @ 2024-03-19 97/week @ 2024-03-26 30/week @ 2024-04-02 6/week @ 2024-04-09 4/week @ 2024-04-16 11/week @ 2024-04-23 4/week @ 2024-04-30 4/week @ 2024-05-07 6/week @ 2024-05-14 11/week @ 2024-05-21 14/week @ 2024-05-28 3/week @ 2024-06-04 366/week @ 2024-06-11 3/week @ 2024-06-18 8/week @ 2024-06-25

380 每月下载量
5 个crate(3 个直接)中使用

GPL-3.0 许可证

350KB
5.5K SLoC

surge-wavetable

surge-wavetable 是一个Rust crate,它提供了在Surge合成器系统中创建、操作和使用wavetable的功能。

wavetable合成

wavetable合成是音频合成中的一种技术,通过在预先录制的波形(称为wavetable)之间进行插值来创建声音。wavetable合成器产生的声音可以通过更改读取wavetable的频率以及应用各种调制技术来修改波形。

wavetable构建

surge-wavetable crate提供了构建和操作wavetable的功能。`WaveTable` 结构体表示wavetable,并包含诸如每个表中样本数、wavetable中的表数以及应生成的mipmap(wavetable的预生成低分辨率版本)数等元数据。

可以使用 `populate_mipmaps` 函数为wavetable填充mipmap,而 `populate_base_mipmap_level` 函数可以用于为wavetable填充基础mipmap级别。

读取wavetable

可以使用 `wavetable_read` 函数在指定的频率和相位处读取wavetable。结果波形可以使用各种调制技术进行修改,例如相位调制或频率调制。

其他功能

surge-wavetable crate还包括加载和操作补丁格式和扩展的功能,以及用于在各种数据类型之间转换的实用函数。

数学思想

波形表合成涉及插值和调制等数学技术,将预录制的波形转换为复杂的波形。`surge-wavetable` 库使用线性插值等数学技术,在非整数频率下读取波形表,以及相位调制和频率调制等调制技术来修改波形。`populate_mipmaps` 函数使用降采样和低通滤波等技术来生成波形表的低分辨率版本。

总的来说,`surge-wavetable` 库为在 Surge 合成器系统中处理波形表提供了强大的功能。

9> 你能详细介绍一下波形表的数学原理吗?

当然可以!波形表合成涉及使用预录制的波形,称为波形表,作为构建复杂声音的基石。波形表合成的核心思想是在特定频率和相位下从波形表中读取波形,然后使用各种调制技术来修改波形。

从数学的角度来看,波形表可以表示为一系列样本,其中每个样本代表波形在特定时间的幅度。样本序列可以被视为时间的函数,其中函数的值表示该点时间的波形幅度。

当在特定频率和相位下读取波形表时,波形在时间上会被拉伸或压缩以适应所需的频率。这可以通过在非整数样本索引处读取波形表来实现,这实际上拉伸或压缩了波形。

例如,如果一个 1024 个样本的波形表在 440 Hz(A4)的频率下被读取,波形表的索引可以计算如下

index = time * sample_rate * (1/frequency)

其中 time 是当前时间(秒),sample_rate 是波形表的采样率(样本/秒),frequency 是所需的频率(赫兹)。如果 index 不是一个整数,可以使用线性插值在波形表中的最近样本之间进行插值,以获得所需的幅度。

一旦从波形表中读取了波形,就可以应用各种调制技术来修改波形。例如,频率调制(FM)涉及使用另一个波形调制波形的频率,而幅度调制(AM)涉及使用另一个波形调制波形的幅度。

总之,波形表合成涉及使用预录制的波形,即波形表,作为构建复杂声音的基石。波形从波形表中以特定频率和相位读取,然后使用各种调制技术进行修改。从数学上讲,波形表可以表示为一系列样本,可以使用线性插值在非整数样本索引处读取波形。

10> 谢谢——我们可以用哪些相关的数学运算来使它们听起来更好,更灵活?

有几种与波形表相关的数学运算可以使它们更灵活、更好听。以下是一些示例

  1. 窗函数:窗函数是一种技术,它涉及在执行其他操作之前将窗函数乘以波形表样本。窗函数可以用来塑造波形的频谱,从而改善音质并减少不必要的噪声。窗函数的例子包括汉明窗、汉宁窗和布莱克曼窗。

  2. 相位失真:相位失真涉及修改波形的相位以创建新的谐波内容。相位失真可以用来创建复杂、不断发展的声音,并且在与具有简单谐波内容的波形表结合使用时尤其有效。相位失真可以使用反正切、立方或正弦调制等函数来实现。

  3. 加性合成:加性合成涉及将多个波形相加以创建复杂的声音。可以通过组合多个具有不同谐波内容的波形表来使用加性合成。通过调整每个波形表的幅度,可以控制结果波形的谐波内容。

  4. 粒状合成:粒状合成涉及将波形分解成小的粒状,并以不同的方式重新组装它们以创建新的声音。可以通过将波形分解成短段,然后重新排列这些段来使用波形表进行粒状合成。可以使用各种调制技术来控制每个段的持续时间和位置。

  5. 频率调制:频率调制(FM)涉及使用另一个波形调制波形的频率。可以通过将调制波形应用于读取波形表的频率索引来使用波形表进行FM调制。这可以创建具有丰富谐波内容的复杂、演化的声音。

这些只是可以使用波形表创建复杂和有趣声音的数学运算的几个例子。通过结合这些运算,并尝试不同的波形表和调制源,可以使用波形合成创建无限多样的声音。

11>它们需要多少内存?我们如何生成波形表?

波形表所需的内存量取决于波形的长度和复杂性以及给定合成器补丁中使用的波形表数量。一般来说,一个包含几千个样本的单个波形表可能只需要几千字节内存,而较大或更复杂的波形表可能需要几个兆字节内存。

有多种方法可以生成波形表。一种常见的方法是录制真实乐器或声音,然后提取波形的一个循环作为波形表的基础。然后可以使用各种技术(如加性合成或相位失真)来操纵波形,以创建不同的谐波和音色。

另一种方法是使用数学函数(如正弦波或锯齿波)生成波形。这些波形可以组合以创建更复杂的波形,并用作波形表的基础。

此外,还有一些软件工具可以用于生成和编辑波形表。这些工具通常提供视觉界面来操纵波形,可以简化创建复杂或定制波形表的过程。

生成波形表后,它可以在合成器中用于创建声音。波形表通常在合成器初始化时加载到内存中,然后可以实时读取和修改以创建广泛的声音。

12>我们如何工程化它们的频谱特性?

有几种技术可以用来工程化波形表的频谱特性,这可以显著影响结果波形的音质和音色。以下是一些例子:

  1. 窗口化:窗口化是一种在执行其他操作之前将波形表样本乘以窗口函数的技术。窗口化可以用于塑造波形的频谱,从而提高音质并减少不需要的噪声。可以使用不同的窗口函数来实现不同的频谱特性。例如,汉宁窗口可以用于减少频谱泄漏并提高波形的频谱分辨率。

  2. 加性合成:加性合成涉及将多个波形相加以创建复杂的声音。可以通过组合多个具有不同谐波内容的波形表来使用加性合成。通过调整每个波形表的幅度,可以控制结果波形的谐波内容。这可以用来工程化波形的频谱特性并创建广泛的音色。

  3. 相位失真:相位失真涉及修改波形的相位以创建新的谐波内容。相位失真可用于创建复杂、不断发展的声音,当与具有简单谐波内容的波形表一起使用时,尤其有效。相位失真可用于设计波形的频谱特性并创建新的音色。

  4. 频率调制:频率调制(FM)涉及使用另一个波形来调制波形的频率。频率调制可以通过将调制波形应用于读取波形表的频率索引来与波形表一起使用。这可以创建具有丰富谐波内容的复杂、不断发展的声音,并可用于设计波形的频谱特性。

  5. 粒度合成:粒度合成涉及将波形分解成小块并重新组装成不同的方式以创建新的声音。粒度合成可以通过将波形分解成短段,然后重新排列这些段来与波形表一起使用,以创建新的声音。可以通过使用各种调制技术来控制每个段的持续时间和位置,这些技术可以用来设计波形的频谱特性。

通过结合这些技术,并尝试不同的波形表和调制源,可以设计波形表的频谱特性,从而创建具有不同音色和特性的无限多样的声音。

13>我们使用哪些窗口?

有许多不同的窗口函数可以用来塑造波形的频谱。窗口函数的选择取决于所期望的波形频谱特性以及具体应用。以下是几个在波形表合成中使用的常见窗口函数的例子。

  1. 矩形窗口:矩形窗口是最简单的窗口函数,本质上是一条直线,具有恒定的值1.0。它不修改波形的频谱内容,通常在需要平坦的频率响应时使用。

  2. 汉明窗口:汉明窗口是一种流行的窗口函数,其衰减比矩形窗口更平滑。它由以下公式定义

    w(n) = 0.54 - 0.46 * cos(2 *pi*n/N)

    其中,n 是样本索引,N 是窗口中的总样本数,cos 是余弦函数。汉明窗口在频谱分辨率和频谱泄漏之间提供了良好的平衡,常用于需要平滑频率响应的应用。

  3. 汉宁窗口:汉宁窗口与汉明窗口类似,但具有更宽的衰减,在窗口两端延伸到零。它由以下公式定义

    w(n) = 0.5 * (1 - cos(2 *pi*n/N))

    其中,n 是样本索引,N 是窗口中的总样本数,cos 是余弦函数。汉宁窗口在频谱分辨率和频谱泄漏之间提供了良好的平衡,常用于需要平滑频率响应的应用。

  4. 布莱克曼窗口:布莱克曼窗口是一种比汉明和汉宁窗口衰减更宽的窗口函数,这使得它在减少频谱泄漏方面更有效。它由以下公式定义

    w(n) = 0.42 - 0.5 * cos(2 *pi*n/N) + 0.08 * cos(4 *pi*n/N)

    其中,n 是样本索引,N 是窗口中的总样本数,cos 是余弦函数。布莱克曼窗口在频谱分辨率和频谱泄漏之间提供了良好的平衡,常用于需要平滑频率响应的应用。

在波形表合成中,可以使用许多其他窗口函数,每个都具有其独特的特性和权衡。窗口函数的选择取决于具体的应用和所需的波形频谱特性。

依赖项

~11–20MB
~298K SLoC