🎹 NumPy as Synth Engine
无中生有
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由多层物理组件叠加:
- 膜振动(bandpass噪声)
- 壳体共鸣(正弦波)
- Syahi黑色膏体的独特谐波
- 手掌调制导致音高 sweep(55→155 Hz)
同一算法,不同乐器
原声吉他加body resonance(带通滤波110/250/500 Hz),电吉他用comb filter取消4次谐波,Ukulele换不同共振频率——核心算法不变,物理参数不同。
"我仍然不敢相信效果这么好。" —— Kenneth Reitz