🎹 NumPy as Synth Engine

来源: kennethreitz.org · 评分: ★★★★★ · 2026-03-31

无中生有

Kenneth Reitz(requests库作者)用NumPy从数学生成完整印度古典音乐。没有一个音频文件——每个声音都是运行时计算的。

Karplus-Strong 算法

1983年发明的拨弦合成算法,简单得惊人:

import numpy as np
SAMPLE_RATE = 44100

def plucked_string(hz, n_samples=SAMPLE_RATE):
    period = int(SAMPLE_RATE / hz)
    buf = np.random.uniform(-1.0, 1.0, period)  # 噪声填充
    out = np.zeros(n_samples)
    for i in range(n_samples):
        out[i] = buf[i % period]
        next_idx = (i + 1) % period
        buf[i % period] = 0.5 * (buf[i % period] + buf[next_idx]) * 0.999
    return out

平均是低通滤波,高频谐波衰减更快——正是真实弦乐的效果。

Tabla 建模

六种打击乐:Na( rim strike)、Tin(open ring)、Ge(deep bayan)、Dha(双鼓)、Tit(rapid tap)、Ke(muted slap)。每个stroke由多层物理组件叠加:

同一算法,不同乐器

原声吉他加body resonance(带通滤波110/250/500 Hz),电吉他用comb filter取消4次谐波,Ukulele换不同共振频率——核心算法不变,物理参数不同。

"我仍然不敢相信效果这么好。" —— Kenneth Reitz

Python DSP 音乐 NumPy