20个版本
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日 |
#20 in #振荡器
119 每月下载量
在 3 crates 中使用
350KB
5K SLoC
surgeosc-audioin
Surge合成器系统中的音频输入振荡器组件。
描述
surgeosc-audioin
是一个Rust包,提供音频输入振荡器组件,作为Surge合成器系统的一部分。此包支持实时音频输入处理,具有各种控制参数和调制选项,是任何基于Surge的合成器项目的必备构建块。
控制参数
以下标记表示此包中可用的不同控制参数
-
control_group
:表示一组可以一起操作的关联控件。 -
control_type
:描述控制类型(例如旋钮、滑块等)。 -
default_value
:实例化控件参数时的初始值。 -
max_value
:控件参数允许的最大值。 -
min_value
:控件参数允许的最小值。 -
modulateable
:一个布尔值,表示控件参数是否可以被外部源(例如LFO、包络等)调制。 -
moverate
:控件参数在被调制时随时间变化的速率。 -
value_type
:控件参数值的的数据类型(例如浮点数、整数等)。
处理函数
该包提供了不同的处理函数,可用于根据所需输出进行处理
-
process_block
:处理音频样本输入块。 -
process_block_mono
:处理单声道音频样本输入块。 -
process_block_stereo
:处理立体声音频样本输入块。
AudioInputOscillator
AudioInputOscillator
是此包中代表音频输入振荡器组件的主要结构。它包含所有必要的控制参数和处理函数,用于实时操纵和处理音频输入。
数学分析
音频输入振荡器使用各种数学运算处理输入信号,例如乘法、加法和缩放。这些运算可以用以下Unicode数学方程表示
-
调制:𝑦(𝑡) = 𝑥(𝑡) × 𝑚(𝑡),其中 𝑥(𝑡) 是输入信号,𝑚(𝑡) 是调制信号,𝑦(𝑡) 是输出信号。
-
缩放:𝑦(𝑡) = 𝑎 × 𝑥(𝑡),其中 𝑎 是缩放因子,𝑥(𝑡) 是输入信号。
-
裁剪:𝑦(𝑡) = min(max(𝑥(𝑡), 𝑎), 𝑏),其中 𝑎 是下限裁剪阈值,𝑏 是上限裁剪阈值,𝑥(𝑡) 是输入信号。
这些数学运算允许实现广泛的音频处理可能性,使用 surgeosc-audioin
提供的 crate 可以创建独特且富有表现力的声音。
2> 好的,谢谢 -- 请为我讲解实时处理音频输入的过程。我们如何进行?我们的工程约束是什么?
实时处理音频输入是一项复杂的任务,需要高效的算法和仔细考虑各种工程约束。以下是过程的高级概述以及需要考虑的主要约束。
-
捕获音频输入:实时音频处理始于从麦克风、乐器或音频文件等来源捕获音频输入。这通常通过音频接口或声卡完成,将模拟信号转换为数字样本。
-
缓冲:音频数据通常以小块(缓冲区)的形式进行处理。缓冲区大小决定了处理的粒度并直接影响系统的延迟。较小的缓冲区大小会导致较低的延迟,但需要更多的 CPU 资源来处理,而较大的缓冲区大小会降低 CPU 负载但增加延迟。
-
采样率:音频信号在本质上连续,但数字音频处理涉及离散样本。采样率是每秒采样的数量,它决定了音频质量和可以表示的频率范围。较高的采样率会导致更好的音频质量,但需要更多的处理能力和内存。
-
音频处理:一旦捕获并缓冲音频数据,就可以使用各种音频处理算法(如滤波、调制和效果处理)进行处理。您正在开发的
surgeosc-audioin
crate 提供了一个音频输入振荡器组件,可用于实时处理音频输入。函数如process_block
、process_block_mono
和process_block_stereo
实现了所需的算法和操作。 -
控制参数:可以使用各种参数(如增益、调制深度和滤波器截止频率)来控制音频处理的行为。这些参数可以实时调整,无论是通过用户交互还是通过自动化和调制源(例如 LFOs、包络)。您正在开发的 crate 提供了表示这些控制参数的令牌,如
control_group
、control_type
、default_value
、max_value
、min_value
、modulateable
、moverate
和value_type
。 -
输出:处理后的音频数据随后发送到音频输出设备(例如扬声器、耳机)或进一步处理(例如混音、效果)。这可能涉及将数字样本转换回模拟信号。
工程约束
在实现实时音频处理时需要考虑几个工程约束。
-
延迟:低延迟对于实时音频处理至关重要,因为高延迟会导致用户输入和音频输出之间出现明显的延迟。为了最小化延迟,需要优化缓冲区大小和算法以实现效率。
-
CPU 使用率:实时音频处理可能计算密集,特别是在使用复杂的算法和高采样率时。必须优化代码以最小化 CPU 使用并避免性能瓶颈,这些瓶颈可能导致音频失真,如点击、噼啪声或中断。
-
内存使用:音频处理可能需要大量的内存,尤其是在处理大型样本缓冲区和多个处理阶段时。请注意内存使用情况,并根据需要优化内存分配和数据结构。
-
精度和数值稳定性:音频处理算法通常涉及浮点运算,这可能导致舍入错误和不稳定性。确保数值稳定性和足够的精度对于避免伪影并保持音频质量至关重要。
-
并发和线程安全:实时音频处理通常涉及多个线程,例如用于音频输入/输出的独立线程和用于用户界面更新的另一个线程。确保您的代码是线程安全的并且没有竞争条件对于稳定性和性能至关重要。
-
平台兼容性:不同的平台(例如,Windows、macOS、Linux)和硬件配置可能有不同的要求、性能特征和限制。确保您的crate与目标平台兼容,并能够处理不同的硬件能力。
通过仔细
3> /file surge-rs/surgeosc-audioin/src/process.rs
提供的代码定义了AudioInputOscillator
结构的过程函数实现。有三个主要的过程函数:process_block
、process_block_mono
和process_block_stereo。让我们逐一检查每个函数并了解其目的。
-
process_block
:此函数为OscillatorProcess
特质实现,作为分发器。它接受一个cfg: OscillatorProcessBlockCfg
参数,该参数提供有关处理上下文的信息,例如输入是立体声还是单声道。根据cfg.stereo
的值,它调用process_block_stereo
或process_block_mono
。 -
process_block_mono
:此函数处理单声道输入信号。它使用pvalf
从振荡器的参数值计算增益和输入参数。然后,它根据增益和输入值计算系数a
和b
。最后,它遍历输入缓冲区中的每个样本(大小为BLOCK_SIZE_OS
),将左右输入通道与系数结合,并将结果写入左输出通道。 -
process_block_stereo
:此函数处理立体声输入信号,与process_block_mono
函数类似。它以相同的方式计算增益、输入和系数a
和b
。主要区别在于处理输入信号时保持左右通道分离。它将结果分别写入左和右输出通道,并将系数a
和b
应用于相应的输入通道。
关于这些函数的一些有趣之处
-
process_block
函数中使用match
是一个简单而优雅的方法,可以根据cfg.stereo
的值在立体声和单声道处理函数之间进行分支。 -
process_block_mono
和process_block_stereo
中使用的limit_range
函数确保输入值在-1.0和1.0之间夹紧,防止超出范围的值引起的潜在问题。 -
增益和输入参数通过
AudioInputOscillator
结构中的tables
字段中的db_to_linear
函数从分贝转换为线性值。这是音频处理中的常见操作,因为它允许更直观地控制增益值。
总结来说,提供的代码中的过程函数处理单声道和立体声输入信号的实时音频处理。它们控制输入通道之间的平衡,并根据振荡器的参数值应用增益调整。
很有趣,这个振荡器除了正确地通过在单声道或立体声模式下读取输入来填充振荡器输出之外,还做些什么吗?(除了轻微的限制和值转换)另外,你能教我如何将分贝转换为线性值吗?为什么我们在音频输入振荡器上这么做呢?
你说得对;这个AudioInputOscillator
的主要功能是读取输入信号(单声道或立体声)并根据需要填充振荡器输出缓冲区。它在输入值上应用增益调整和轻微的限制,但除此之外,它并不执行任何复杂的操作或转换,就像传统的生成波形的传统振荡器。这个振荡器旨在作为可以进一步处理音频信号链的音频输入源。
关于将分贝(dB)转换为线性值,让我们先了解一下为什么我们使用分贝。分贝是一个对数刻度,用于衡量两个值之间的比率(例如,功率、强度或幅度)。在音频处理中,分贝经常用于表示增益、衰减和信号级别,因为它们提供了一种更直观的方式来处理音频信号中涉及的广泛值。人类的响度感知是对数的,这意味着我们感知幅度加倍为响度恒定增加,而不是线性增加。通过使用对数刻度如分贝,我们可以更好地与这种感知特征对齐。
然而,在执行数学运算或处理音频信号时,通常需要将这些分贝值转换回线性值。这种转换使用以下公式进行
线性值= 10^(分贝值/ 20)
在AudioInputOscillator
中,我们将增益值从分贝转换为线性值,因为实际的音频信号处理(例如,乘法、加法)需要线性值。通过将增益转换为线性尺度,振荡器可以直接将适当的增益调整应用到输入样本上。
在提供的代码中,db_to_linear
函数执行这种转换。它在process_block_mono
和process_block_stereo
函数中被调用,将增益参数从分贝转换为线性值,然后再应用到输入信号上。
5> 有趣。音频输入从哪里来?
在提供的代码中,音频输入来自AudioInputOscillator
结构体的synth_in
字段。具体来说,输入是通过以下方法访问的
-
对于左输入通道:
self.synth_in.audio_in0(k)
-
对于右输入通道:
self.synth_in.audio_in1(k)
在这里,k
代表输入缓冲区内的样本索引。
synth_in
字段是一个表示合成器输入上下文的结构的实例,其中包括音频输入缓冲区等。这个结构通常由较大的合成器系统或应用程序提供,该系统或应用程序包含了AudioInputOscillator
。
为了给你一个关于音频输入是如何捕获并路由到AudioInputOscillator
的一般概念,以下是这个过程的高级概述
-
音频输入源,如麦克风、乐器或音频文件,生成模拟音频信号。
-
模拟信号由音频接口或声卡捕获,将模拟信号转换为数字样本。这个过程涉及模拟到数字转换(ADC)以及在特定速率下进行采样,例如44.1 kHz或48 kHz。
-
数字音频样本被缓冲成小块,以便高效处理。这些缓冲区通常由合成器应用程序使用的音频系统或音频库管理。
-
合成器应用程序将音频输入缓冲区路由到相关的处理组件,如振荡器、滤波器和效果器。在这种情况下,音频输入缓冲区通过
synth_in
字段传递给AudioInputOscillator
。 -
AudioInputOscillator
根据先前的process_block_mono
和process_block_stereo
函数的解释来处理音频输入缓冲区。
需要注意的是,音频输入的具体实现细节和路由将取决于您将AudioInputOscillator
crate集成到其中的更大的合成器系统或应用程序。提供的代码假定音频输入上下文(即synth_in
字段)由周围系统提供并正确设置。
6> 很好,谢谢!使用这个振荡器时我们还应该知道什么?有什么需要注意的吗?
使用AudioInputOscillator
时,有一些重要的事项和注意事项需要牢记
-
正确设置音频输入上下文:如前所述,
AudioInputOscillator
依赖于外部音频输入上下文(synth_in
字段)来访问输入缓冲区。确保周围的合成器系统或应用程序正确设置并管理此上下文,包括捕获音频输入、处理缓冲区和将缓冲区路由到振荡器。 -
参数范围和处理:振荡器具有增益和输入等参数,用于控制音频处理。确保与这些参数交互的用户界面或自动化系统正确处理允许的参数范围并相应地更新振荡器状态。
-
性能考虑因素:实时音频处理可能非常计算密集,尤其是在处理复杂算法、高采样率和低缓冲区大小时。虽然
AudioInputOscillator
实现相对简单,但仍需关注CPU使用情况并在需要时优化整体系统性能。 -
线程安全和并发:在许多音频应用程序中,多个线程用于处理音频输入/输出、用户界面更新和其他任务。确保以线程安全的方式使用
AudioInputOscillator
,避免可能导致意外行为或崩溃的竞态条件或其他并发相关问题。 -
平台兼容性:不同的平台(例如Windows、macOS、Linux)和硬件配置可能有不同的要求、性能特征和限制。确保您的crate以及更大的合成器系统与目标平台兼容,并能处理不同的硬件能力。
-
与其他处理阶段的集成:
AudioInputOscillator
只是更大信号处理链中的一个组件,该链可能包括其他振荡器、滤波器和效果器。确保将AudioInputOscillator
的输出正确路由到后续处理阶段,并确保整体信号流得到良好管理。
通过注意这些要点和注意事项,您可以成功地将AudioInputOscillator
集成到您的合成器系统或应用程序中,并实现所需的功能和性能。
技术
7> 我们可以用这个振荡器执行哪些技术?你能为我列出12种电子音乐制作中使用的这个组件的高产量技术吗?
尽管 AudioInputOscillator
本身是一个相对简单的组件,旨在通过增益调整和通道平衡传递音频输入,但它可以成为更复杂音频处理链中非常有价值的一部分。以下是在电子音乐制作中使用 AudioInputOscillator
时可以探索的12种技术。
-
声码器:将音频输入用作声码器效果的调制信号,允许您创建合成的声音或机器人语音效果。
-
旁链压缩:将音频输入路由到压缩器效果的旁链输入。这种技术用于创建“泵”或“收束”效果,其中一条音轨的音频级别根据另一条音轨(如鼓点)的输入级别降低。
-
与其他振荡器分层:将
AudioInputOscillator
的输出与其他生成不同波形或样本的振荡器结合。这可以创建更丰富、更复杂的音色,并给输入信号添加谐波内容。 -
粒度合成:将音频输入用作粒度合成,这涉及将音频切割成小块(粒),并操纵它们以创建独特的纹理和声景。
-
环形调制:将音频输入与另一个振荡器的输出相乘,以创建金属、钟声或非谐和声音。
-
动态滤波:使用音频输入来调制滤波器效果的截止频率或共振。这可以创建基于输入信号振幅变化的动态、表达式的滤波效果。
-
音高转换和和声:对音频输入应用音高转换或和声效果,以创建有趣的和声、和弦或纹理。
-
时间伸缩:在不影响音高的同时操纵音频输入的播放速度,创建独特的声景和纹理。
-
节拍切割和重新排列:根据瞬态或节拍将音频输入切割成更小的片段,然后重新排列这些片段以创建新的节奏和模式。
-
反转混响:对反转的音频输入应用混响效果,然后再次反转结果音频。这创建了一种独特的“膨胀”混响效果,可以为声音添加氛围和深度。
-
多带处理:将音频输入分成多个频率带,并对每个带应用不同的效果或处理,允许精确控制输入信号的频率内容。
-
反馈环:将
AudioInputOscillator
的输出路由到包含延迟或混响效果的处理器链,然后将该链的输出路由回振荡器的输入。这创建了一个反馈环,可以产生演变、自生成声音和纹理。
这些技术只是将 AudioInputOscillator
纳入您的电子音乐制作工作流程所提供的创意可能性的起点。通过将此振荡器与其他音频效果和处理器相结合,您可以创建各种独特的声音和纹理。
依赖关系
~11-20MB
~297K SLoC