打开网易新闻 查看精彩图片

一个Python库,零字节预录音频,靠NumPy数组实时算出西塔琴的拨弦和塔布拉鼓的敲击。开发者用1983年的Karplus-Strong算法,把数学变成了乐器。

这不是采样器,是物理模拟器。每个音符都是当场「长」出来的。

1983年的算法,2025年的印度古典乐

1983年的算法,2025年的印度古典乐

Karplus-Strong算法的发明人大概没想到,四十年后有人用它合成塔布拉鼓。这个算法的核心几乎简单到可笑:一段随机噪声,循环播放,每次取相邻两个样本的平均值。0.999的衰减系数控制延音,平均过程本身就是低通滤波——高频谐波比低频衰减更快,和真实琴弦的物理行为一致。

开发者给出的代码片段干净利落。44.1kHz采样率下,目标频率决定缓冲长度,噪声缓冲自我平均,输出数组就是一段可播放的波形。没有波表,没有采样层,没有MIDI音色库。

同一段代码,换参数就是不同乐器。木吉他加三个带通滤波器模拟琴体共振:110Hz空气腔、250Hz面板、500Hz背板。电吉他换成梳状滤波器模拟拾音器位置,抵消第4谐波、增强第2谐波,出来就是中频的「鼻音」。尤克里里缩小琴体尺寸,共振峰移到350/700/1200Hz,初始噪声调软模拟尼龙弦。

物理建模的精髓:不是录下声音,而是模拟发出声音的东西。

打开网易新闻 查看精彩图片

塔布拉鼓的六层声音

塔布拉鼓的六层声音

真正让这个项目出挑的是印度打击乐。塔布拉鼓由两只鼓组成:右手的小木鼓dayan,左手的大铜鼓bayan。鼓皮上的黑色音膏syahi创造了标志性的金属泛音,这种声音被印度古典音乐家打磨了几个世纪,和西方打击乐完全是两个物种。

开发者建了六种敲击法。以「Na」音为例:山羊皮膜的冲击声用200-800Hz带通滤波噪声,syahi的金属泛音靠调谐到特定谐波的正弦波簇,bayan的低频轰鸣用指数衰减的低频振荡器,最后加一层高频噪声模拟指尖摩擦。六个参数控制包络,每个敲击法都是独特的物理配方。

「Tin」音更薄更亮,滤波器移到600-1800Hz,去掉bayan的低频成分,泛音结构重组。「Dha」音需要双手同时响应,dayan的高频泛音和bayan的压音变化实时混合。这些不是预设音色,是运行时根据音符参数重新计算的物理过程。

Claude当助教,DSP现学现卖

Claude当助教,DSP现学现卖

开发者坦承:合成引擎是和Claude一起写的,DSP边做边学。这个细节很有意思——不是用AI生成最终音频,而是把AI当技术文档和调试助手,核心算法自己手敲。

整个项目叫PyTheory,仓库里找不到一个.wav或.mp3。西塔琴的弯音用低频振荡器调制延迟线长度实现,坦布拉的持续低音是叠加多个失谐振荡器制造拍频,所有效果器(混响、合唱、均衡)都是NumPy运算。

打开网易新闻 查看精彩图片

最终输出是一首完整的印度古典乐风格曲目。你可以打开代码,看到每个音符对应的函数调用,看到滤波器系数怎么算出,看到包络发生器的时间参数。这比任何DAW的「冻结轨道」都更透明。

开源音乐制作通常走两条路:要么用现成采样器,要么用SuperCollider这类专门的语言。PyTheory选了第三条:用数据科学生态系统做实时合成。

NumPy的向量化运算在这里成了优势。Karplus-Strong的循环实现是教学版本,实际可以用数组操作批量处理。SciPy的信号处理模块提供滤波器设计,Matplotlib可以可视化波形,整个Python数据栈变成了乐器制造车间。

这个项目最迷人的不是技术难度——物理建模合成在学术圈已经成熟几十年——而是执行层面的「不合时宜」。2025年,谁还手写振荡器?采样器CPU占用更低,音色库更真实,商用项目没有理由这么做。

但开发者证明了另一件事:一个中等复杂度的合成器,一个愿意啃DSP文档的程序员,加上现代AI助手的辅助,可以在几周内从零造出能听的乐器。门槛比想象中低。

代码即乐器。不是比喻,是字面意思。

如果你打开那个生成塔布拉「Na」音的函数,会看到注释里写着对syahi物理特性的近似描述,会看到开发者如何权衡「真实」和「可计算」。这些注释比任何产品说明书都更诚实——它承认了哪些是准确模拟,哪些是听起来差不多的妥协。

下一个被NumPy合成的,会是什么乐器?