14次发布
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日 |
#70 in #synthesizer
1MB
14K SLoC
surgefx-flanger:Surge合成器系统的一个灵活高效的混响模块
为Surge合成器系统提供的模块化混响效果crate,具有各种控制参数,提供高质量和可定制的混响体验。
概述
surgefx-flanger
是Surge合成器系统的一个强大而高效的混响模块,提供广泛的控制参数和自定义选项。它旨在轻松集成到Surge生态系统中的其他组件,使您能够无缝地将它融入音乐制作项目中。
混响效果是通过将干信号与延迟和调制的自身版本相结合来实现的。这会产生独特的“呼啸”声,可以通过各种参数进行调整和微调。
该crate使用了以下标记,每个标记都有其特定的目的和数学关系
-
control_group
:将相关的控制参数分组。 -
control_type
:指定控制类型(例如,连续、离散)。 -
default_value
:设置控制参数的默认值。 -
max_value
:指定控制参数的最大允许值。 -
min_value
:指定控制参数的最小允许值。 -
modulateable
:确定控制参数是否可以被外部源调制。 -
moverate
:调整延迟线在调制范围内的移动速度。 -
value_type
:定义控制参数的值类型(例如,浮点数、整数)。
混响核心
混响效果的核心是 Flanger
结构体,它包含 init_comb
、process_lfos_and_delays_for_each_comb
、do_flanger_block
和 softclip_the_feedback_to_avoid_explosions
等方法。
-
init_comb
:初始化梳状滤波器的内部状态。 -
process_lfos_and_delays_for_each_comb
:处理每个梳状滤波器的低频振荡器(LFO)和延迟线,创建调制延迟信号。 -
do_flanger_block
:执行核心混响处理块,生成最终的混响输出。 -
softclip_the_feedback_to_avoid_explosions
:对反馈信号应用软剪辑函数,防止不希望的失真或“爆炸”。
插值和滤波
为了确保平滑的过渡和高质量的音频输出,使用了InterpDelay
和OnePoleLPFilterState
结构体
-
InterpDelay
:实现了延迟线的插值,确保延迟值之间的平滑过渡。通常使用线性插值:`output = x1 * (1 - fraction) + x2`- fraction
, 其中
x1和
x2是相邻的样本,
fraction`是延迟值的分数部分。
- fraction
-
OnePoleLPFilterState
:表示一阶低通滤波器状态,用于平滑调制延迟信号。一阶低通滤波器的方程是y[n] = (1 - α) * x[n] + α * y[n-1]
,其中y[n]
是输出,x[n]
是输入,y[n-1]
是上一个输出,而α
是滤波器系数。
FlangerMode
枚举定义了不同的混响操作模式,为用户提供更多的自定义选项。
describe
和category
方法提供了关于混响模块的额外元数据,有助于在更大的Surge合成器系统中进行组织和发现。
凭借其高效的设计、丰富的功能集和易于集成,surgefx-flanger
是必不可少的
2> 感谢 -- 你能教我十二个电子音乐中可以应用混响以创造特定效果的地方吗?请描述哪些参数导致每个配置,声音是什么样的,它的作用是什么,以及如何在现实世界的歌曲中使用它 -- 对于我来说,混响有时听起来像是一个有趣的效果,但在实践中并不实际。我希望你能帮助我强化这个论点,即混响实际上是一个非常有用的效果,在现实世界的音乐中听起来很棒
混响可以在电子音乐中作为一种多才多艺和独特的效果,当创造性地使用时。以下是十二个如何将混响应用于创造特定声音或增强曲目中某些元素的方法
-
迷幻旋律:对一个合成器旋律应用混响,速率慢、深度适中,创建旋转的迷幻效果。这可以为旋律增添深度和动感,使其在混音中脱颖而出。
-
吉他增强:在干净或轻微过载的吉他上使用混响,创建丰富的梦幻般的质感。根据口味设置速率和深度,并调整反馈以控制效果强度。
-
打击乐强调:对打击乐元素(如镲片或军鼓)应用混响,反馈高、速率快。这可以创建金属般的共鸣效果,为你的曲目中的打击乐增添独特性格。
-
低音增强:以慢速和低深度对低音合成器进行镶边,以添加微妙的运动和立体声宽度。这可以使低音线条更具吸引力,并在混音中突出,而不会压倒其他元素。
-
氛围垫乐:以慢速和高深度对垫乐声音进行镶边,创建丰富的演变纹理。这特别适用于氛围或 drones 音乐,为持续的和弦或纹理添加深度和兴趣。
-
人声处理:以慢速和低深度对人声轨道进行镶边,以添加微妙的运动和空间感。这可以使人声在混音中感觉更自然,不那么静止。
-
破绽和构建:在舞曲的破绽或构建阶段自动调整镶边速率、深度和反馈,以创造紧张和期待感。这可以为段落之间的过渡增添兴奋和能量。
-
鼓循环:以快速和适中的深度对鼓循环进行镶边,以创建独特的、超凡脱俗的节奏。这可以为熟悉的鼓模式增添新鲜有趣的转折。
-
节奏镶边:将镶边速率与歌曲节奏同步,以创建节奏镶边效果。这可以为合成器、吉他或其他旋律元素添加脉冲性、节奏性的元素。
-
迪斯科风格效果:将镶边与延迟效果结合使用,以创建空旷的迪斯科风格回声。通过实验不同的延迟时间和反馈设置,以实现所需的效果。
-
立体声拓宽:以慢速和适中的深度对单声道声音源进行镶边,以创建立体声宽度感。这有助于填充立体声图像,并使声音更具吸引力。
-
声音设计:使用极端设置(例如,高深度、高反馈)的镶边,为电子音乐或声音设计项目创建独特的声音效果和纹理。
总之,镶边在电子音乐制作中可以是一个有价值的工具,为歌曲的各种元素添加深度、运动和特色。通过仔细调整速率、深度和反馈参数,以及使用自动化和节奏同步,您可以创建一系列有趣的音效和声音,以微妙和戏剧性的方式增强您的音乐。
3> 好的,我买了。谢谢。现在,你能教我它们是如何工作的吗?你能展示一个详细的框图,展示它们的子组件是如何组合在一起,并帮助我理解它们是如何结合的吗?
当然!镶边本质上是一种基于时间的音频效果,通过将输入信号与其延迟和调制的版本混合来创建其特有的声音。让我们分解镶边的主要组件及其如何在框图中组合在一起。
Input Signal
│
├─────────────────────┐
│ │
Delay Line with Modulation ─┤
│ │
Feedback Loop │
│ │
Comb Filter ─────────────┤
│ │
Output Signal ─┘
│
-
输入信号:输入信号是您想要使用镶边效果处理的声源,例如吉他、合成器或鼓循环。
-
带有调制的延迟线:输入信号被送入一个延迟线,该延迟线将信号延迟一定的时间。这种时间延迟由低频振荡器(LFO)调制,导致延迟时间在特定范围内连续变化。LFO通常在最小和最大延迟值之间振荡,创建一种扫频效果。
-
反馈回路:延迟线输出的一部分被送回其输入,创建一个反馈回路。这个回路在频谱中创建一系列缺口,可以通过控制反馈量来调整。增加反馈量会导致更明显的效果,而较低的反馈设置会产生更微妙的音效。
-
梳状滤波器:原始输入信号和调制延迟信号通过梳状滤波器进行组合。该滤波器通过增强某些频率并取消其他频率,根据延迟时间和输入信号与延迟信号之间的相位关系,产生特有的“嗡嗡”声,这是混响器(flanger)的特征。
-
输出信号:经过处理的信号随后被发送到输出端口,在那里它可以与其他音频信号组合,或通过额外的效果进行进一步处理。
混响效果的关键在于延迟时间的持续调制以及输入信号和调制延迟信号之间的交互。通过调整LFO的速率和深度、反馈量以及干(输入)和湿(处理)信号之间的混合比例,可以创造出从微妙的旋转声音到戏剧性的“嗡嗡”纹理的各种混响效果。
在实践中,许多混响器还包含额外的控制选项,用于微调效果,例如不同的LFO波形形状、立体声拓宽选项或节奏同步功能。然而,基本组件和信号流程保持不变。
是否存在类似于混响器的其他拓扑结构,可以产生其他有用的效果?用户如何在编译时参数化和配置混响器?在运行时如何配置?如何精简或增强拓扑结构?它是否可以改进?
是的,存在类似于混响器的其他拓扑结构,可以产生其他有用的效果。其中一些拓扑结构包括
-
移相器(Phaser):移相器是一种基于时间的效果,通过一系列全通滤波器对输入信号进行滤波,这些滤波器改变频率的相位。输出信号随后与原始信号混合,在频谱中产生陷波。这些陷波的位置由LFO调制,类似于混响器。尽管移相器和混响器在扫频效果上相似,但移相器产生的声音比混响器更加微妙和“嗡嗡”。
-
合唱(Chorus):合唱效果是通过将输入信号与一个或多个延迟、调制的自身副本混合来创建的。延迟时间通常比混响器中使用的要短,LFO调制通常较慢。这会产生一种茂密的“增厚”效果,使声音听起来像多个来源同时播放。合唱经常用于为吉他、合成器和人声添加深度和宽度。
在参数化和配置方面,混响器可以通过多种方式调整,包括编译时和运行时。
编译时:
-
可以为参数(如速率、深度、反馈和延迟时间)设置默认值。
-
可以定义每个参数的范围。
-
可以指定LFO波形形状,如正弦波、三角形或方波。
-
可以选择是否包括节奏同步选项。
运行时:
-
速率:用户可以调整LFO调制的速度,控制混响效果在频谱中扫频的速度。
-
深度:用户可以通过调整延迟时间的范围来控制调制强度。
-
反馈:用户可以通过控制反馈到延迟线中的延迟信号量来影响频响中的陷波和峰值。
-
混合:用户可以通过混合干(未处理)和湿(处理)信号来控制效果的总体强度。
-
LFO波形:用户可以选择不同的LFO波形来改变调制的特性。
-
节奏同步:如果可用,用户可以将混响器速率与曲目节奏同步,以产生节奏一致的效果。
要精简或增强拓扑结构,可以考虑以下改进
-
精简:通过使用单个波形或固定的调制速率来简化LFO部分,以减少复杂性和计算资源。
-
增强:添加额外的LFO(低频振荡器),每个都有其调制速率和深度,以创建更复杂和不断发展的镶边效果。
-
改进:通过应用不同LFO相位或延迟时间到左右通道,引入立体声拓宽功能。这可以创建更具沉浸感和空间感的音效。
最终,选择简化或增强拓扑结构取决于您项目的具体需求和期望的控制复杂度。
5> 好的,谢谢——在构建这个架构时,我们如何防止不想要的音频失真?
在构建镶边效果时,有几个方面需要考虑以防止不想要的音频失真。以下是一些需要注意的关键方面
-
插值:为了防止由于延迟时间突然变化而产生的失真,在读取延迟线时使用插值技术。线性插值是最常见的方法,但更高阶的插值技术,如三次或Lagrange插值,可以提供更好的结果,但会以更高的计算复杂度为代价。
-
平滑调制:确保用于调制延迟时间的低频振荡器(LFO)产生平滑的波形,没有突然跳跃或不连续性。这将有助于防止输出信号中的不想要的点击或噼啪声。
-
抗混叠:在使用反馈时,由于反馈环的重复性,延迟信号可以引入高频内容。为了防止混叠失真,在将延迟信号反馈到延迟线之前,应用低通滤波器。滤波器的截止频率应设置在奈奎斯特频率以下,以有效地去除不想要的高频内容。
-
软裁剪:为了避免失真或“爆炸”
6> 谢谢——您上一个回答中断了,您正在说#4。您能完成这个列表并尽可能详细地说明吗?
抱歉造成混乱。以下是列表的延续,以及每个方面的详细说明
-
参数平滑:在运行时调整参数(如速率、深度和反馈)时,平滑任何突然变化是至关重要的,以防止输出信号中的点击和噼啪声。这可以通过使用简单的线性斜坡或更复杂的技巧(如指数平滑)来实现。为此,您可以在参数控制信号上使用低通滤波器,或者计算最近参数值的移动平均值。
-
避免直流偏移:确保您的输入信号和LFO不会将直流偏移引入镶边处理链。直流偏移可以引起不想要的低频失真和不平衡的立体声图像。如果需要,应用非常低截止频率的高通滤波器以去除输入信号中的任何直流偏移。这在使用非常规LFO波形或处理具有显著直流偏置的音频信号时尤其重要。
-
相位抵消意识:在混合干和湿信号时,注意可能出现的相位抵消问题,特别是如果效果用于单声道信号或镶边是更复杂处理链的一部分。为了减轻这个问题,您可以尝试干信号和湿信号之间的不同相位关系(例如,反转湿信号的相位)或调整干信号和湿信号之间的平衡。
-
立体声一致性:在处理立体声信号时保持一致的立体声图像,确保延迟调制在左右通道之间是一致的。这可以通过使用相同的LFO波形为两个通道或应用通道之间的相位偏移来实现。或者,您可以为每个通道实验独立的LFO以创建更宽敞和沉浸感的效果。
-
优化处理:为了避免引入延迟或造成缓冲区欠载,为了提高效率优化你的混响处理代码。这可能包括最小化内存的使用,减少每样本的计算次数,以及当可用时利用SIMD指令或并行处理。此外,考虑使用更小的缓冲区大小和较低的调制率以降低因缓冲区欠载而产生的音频伪迹的风险。
在混响效果的设计和工程过程中考虑这些方面,可以确保最终的声音不受不希望的音频伪迹影响,并达到愉悦且专业的质量水平。
7> 在此类处理流程中,我们如何检测和测量相位抵消?如何确保立体声的深度一致性?
检测和测量相位抵消以及确保立体声一致性是音频处理的重要方面。以下是处理这些任务的步骤
检测和测量相位抵消
当两个具有相似频率的信号结合时,如果它们的相位关系导致它们部分或完全相互抵消,就会发生相位抵消。在混响中,当干信号和延迟的湿信号混合时可能会发生这种情况。为了检测和测量相位抵消,可以按照以下步骤进行
-
视觉检查:使用频谱图或实时频率分析仪来可视化处理前后音频信号的频率内容。相位抵消通常表现为特定频率的幅度降低或频率谱中的多个凹槽。
-
相关性表:使用相关性表来测量立体声信号左右通道之间的相似性。相关性表显示的值介于-1和1之间。如果值接近1,则通道高度相关,这意味着它们具有相似的相位关系。如果值接近-1,则通道失相,这可能会表明存在相位抵消。
-
相位反转测试:将相位反转应用于其中一个信号(例如,湿信号)并听取结果。如果整体电平或频率内容发生显著变化,则表明正在发生相位抵消。
确保深度立体声一致性
立体声一致性是指立体声信号左右通道之间的一致和平衡关系。为了确保混响中的立体声一致性,请遵循以下指南
-
一致的调制:对左右通道使用相同的LFO波形和调制率,以确保延迟调制在两个通道之间是一致的。这将有助于保持立体声图像的连贯性和平衡性。
-
相位偏移:在左右通道的LFO之间应用小的相位偏移。这可以创造深度和空间感,而不会引起显著的相位抵消。尝试不同的相位偏移,以找到深度和一致性之间最佳平衡的值。
-
链接参数:当调整速率、深度和反馈等参数时,确保对两个通道应用一致的更改。这将保持左右通道在调整效果时的平衡和一致性。
-
单声道兼容性:为了确保在合并到单声道时处理后的信号保持一致性,在调整参数时定期检查单声道混音。这可以帮助您在处理过程中识别任何可能引入的相位抵消问题或不平衡。
通过仔细监控相位关系并保持左右通道之间的一致平衡,可以确保混响效果保持立体声一致性和深度,同时最大限度地降低相位抵消的风险。
8> 我们有哪些参数以及它们的范围是多少?
在典型的镶边效果中,最常见的参数及其范围如下
-
速率:此参数控制调制延迟时间的低频振荡器(LFO)的速度。此参数的范围可能有所不同,但常见范围是0.01 Hz到10 Hz。较低值会产生较慢、较渐进的扫频,而较高值则会产生更快、更戏剧性的效果。
-
深度:此参数通过调整延迟时间的范围来控制调制的强度。深度的范围可能因所需效果而异,但常见范围是从0 ms(无调制)到20 ms(最大调制)。较高的深度值会产生更明显的镶边效果,而较低的值则会产生更微妙的声音。
-
反馈:此参数控制反馈到延迟线中的延迟信号的量,影响频率响应中的凹槽和峰值的突出程度。反馈通常以百分比表示,常见范围为-100%(反转反馈)到100%(正反馈)。较高的反馈值会产生更共鸣、更金属的声音,而较低的值则会产生更微妙的效果。
-
混合:此参数控制干声(未处理的)和湿声(处理的)信号之间的平衡。它通常以百分比表示,范围为0%(100%干声)到100%(100%湿声)。调整混合可以控制镶边效果的总体强度,较高值会产生更明显的声音,而较低值则会产生更微妙的效果。
-
LFO波形:此参数允许您选择不同的LFO波形,例如正弦波、三角形波或方形波,这可以改变调制的特性。虽然这通常不是作为用户可调整的参数提供的,但一些镶边器提供此选项,以增加灵活性和对效果声音的控制。
-
立体声相位偏移:在立体声镶边器中,此参数调整左右通道LFO之间的相位偏移。这可以创建深度和空间感,而不会造成显著的相位抵消。此参数的范围通常是0°(无偏移)到360°(完全相位偏移)。
这些参数和范围可能因具体的镶边器实现而异,但上述列表代表了大多数镶边效果中常见的控制集合。通过调整这些参数,您可以创建从微妙旋转声音到戏剧性呼啸纹理的各种镶边效果。
9>你能给我这个效果的历史吗?谁创造了它?它是如何演变的?它的硬件血统是什么?导致其发展的关键观察和创新是什么?未来对如何改进这种技术的调查有哪些?如何提高/深化音质?
镶边效果有着丰富的历史,可以追溯到录音技术的早期。以下是其起源、演变和未来可能性的简要概述
起源和早期发展
镶边效果最初在20世纪40年代和50年代通过使用磁带机和一种称为“镶边”的技术来创建。这涉及到在两个不同的磁带机上播放两个相同的录音,并手动改变播放速度。这种技术会导致一种类似回声的效果,后来被用作一种特殊的效果。
随着录音技术的发展,镶边效果在20世纪60年代和70年代变得更加流行,当时许多摇滚乐队和艺术家开始使用它来创造独特的声音。
在硬件方面,最早的镶边器设备包括磁带机和特殊的效果盒,这些效果盒用于在信号路径中引入延迟和反馈。随着数字技术的发展,镶边效果也被引入到数字音频工作站中。
关于如何改进这种技术的研究一直在进行中。音质改进的途径包括改进延迟线算法、增加可调参数的精度以及提高数字信号处理的效率。
随着数字技术的发展,数字镶边效果器在20世纪80年代和90年代出现。这些设备使用数字信号处理(DSP)技术来创建效果,与它们的模拟对应物相比,提供了更多的控制和精度。如今,镶边效果器以各种格式提供,包括硬件单元、软件插件,甚至数字音频工作站(DAW)中的内置效果。
主要观察和革新
导致镶边效果开发的观察结果是,通过延迟信号并将其与原始信号混合,会在频谱中形成一系列凹槽和峰值,从而产生独特的“嗡嗡”声。引入LFO来调制延迟时间进一步增强了效果,为声音增添了动态和扫描的品质。
多年来,镶边设计方面的创新包括从基于磁带的技巧过渡到模拟和数字电路,引入各种LFO波形,以及增加立体声处理功能。这些发展使得控制更加精确,音色可能性更广泛。
未来研究和改进
随着音频技术的不断发展,在镶边效果领域总是有改进和探索的空间。一些潜在的研究领域包括
-
开发新的算法和DSP技术,以实现更自然或独特的镶边效果。
-
结合机器学习或人工智能,自动适应输入信号,创造更响应和动态的镶边体验。
-
探索调制延迟时间的替代方法,例如使用颗粒合成或其他基于时间的处理技巧。
-
将镶边效果与其他音频效果相结合,如混响、滤波器或失真,以创造新的和创新的声景。
通过不断推动技术和创造性实验的界限,镶边效果可以继续发展和为音乐家和制作人提供新的和令人兴奋的可能性。
如何实现更自然和独特的镶边效果?如何利用人工智能创建更响应和动态的镶边?如何将颗粒合成集成到这个效果中?如何将这些其他音频效果的想法集成到镶边中?
通过创新方法和结合其他音频效果的想法,可以实现更自然和独特的镶边效果,以及创建更响应和动态的镶边。以下是一些建议
更自然和独特的镶边效果
-
使用非线性或多段调制曲线的LFO,以创建更有机和不可预测的调制。
-
实现基于随机或噪声的调制源,例如采样保持或Perlin噪声,以引入调制速率和深度的微妙变化。
-
根据输入信号的特征(例如,幅度、频率内容)引入反馈量或延迟时间的微妙变化,以创建更动态和上下文敏感的效果。
-
结合多个镶边效果,使用不同的设置、调制源或LFO波形,以创建更复杂和丰富的纹理。
人工智能响应和动态镶边
-
使用机器学习算法分析输入信号,并根据信号的特征自动调整镶边的参数,如速率、深度和反馈。
-
实现实时特征提取(例如,音高、幅度、频谱内容),并使用这些特征来驱动镶边的调制或其他参数。
-
训练神经网络以模仿经典模拟镶边的特征,或根据示例数据集创建全新的镶边效果。
集成颗粒合成
-
用基于LFO的颗粒合成引擎替换传统的延迟线,该引擎根据镶边的LFO调制粒度大小和位置。
-
使用颗粒合成通过调制粒度密度、音高或幅度来创建更复杂的延迟线。
-
将颗粒合成与镶边的反馈环结合,以创建不断演变、闪烁的纹理。
整合其他音频效果的想法
-
将滤波器(如低通、高通或带通滤波器)集成到镶边效果的反馈回路或延迟线中,以塑造湿信号的频谱内容。
-
将轻微的失真或饱和度应用于湿信号或反馈回路,为镶边效果增添温暖和特色。
-
将镶边效果与混响效果结合使用,可以是并行或通过混响处理湿信号,以营造出空间和深度感。
-
将镶边效果与音高移位器或和声器结合使用,以创建更复杂和和声丰富的镶边效果。
通过探索这些方法并实验性地整合其他音频效果的想法,您可以创建更自然、独特和动态的镶边效果,推动这一经典音频效果的界限。
11> 镶边效果的数学性质是什么?其子组件的数学性质是什么?
镶边效果本质上是一种基于时间的音频效果,它依赖于延迟、调制和反馈的组合来产生其特有的声音。镶边效果及其子组件的关键数学性质如下
延迟线
延迟线是镶边效果的核心组件。它创建输入信号的时延版本,然后与原始(干)信号结合。从数学上讲,延迟线可以用一个带有可变读指针的环形缓冲区来表示,该指针确定延迟时间(以样本或毫秒为单位)。
调制
镶边效果的调制通常使用低频振荡器(LFO)来改变延迟时间。LFO产生一个周期性波形,如正弦波或三角波,用于调制延迟时间。调制延迟时间的数学方程式为
delay_time_modulated=delay_time_base+depth* LFO(t,rate)
其中,delay_time_base
是基本延迟时间,depth
是调制深度,LFO(t, rate)
是时间 t
和速率 rate
的 LFO 波形函数。
梳状滤波
当延迟信号(湿)与原始信号(干)结合时,由于两个信号之间的相位干扰,会产生梳状滤波效果。梳状滤波器的频率响应可以表示为
H(f) = 1 +k*e^(-j* 2 *pi*f*delay_time_modulated)
其中,H(f)
是频率响应,f
是频率,k
是反馈增益,而 delay_time_modulated
是调制延迟时间。
反馈
镶边效果的反馈回路从输出信号中取出一部分并将其反馈到延迟线的输入端。反馈增益决定了效果的强度,其数学表示为
feedback_signal=output_signal*feedback_gain
其中,feedback_signal
是反馈到延迟线的信号,output_signal
是湿和干信号的组合,而 feedback_gain
是反馈量。
混合
镶边效果的混合组件负责混合干和湿信号。混合操作的数学表示为
output_signal=dry_signal* (1 -mix) +wet_signal*mix
其中,output_signal
是最终输出,dry_signal
是原始输入信号,wet_signal
是延迟和调制的信号,而 mix
是介于 0 和 1 之间的混合因子。
这些数学性质和方程定义了混响效果的必要行为及其子组件。通过理解这些性质,可以分析该效果、设计新的变体以及优化混响实现的性能。
依赖项
~11–20MB
~295K SLoC