PeriodicWave的核心是频域建模,通过real/imag数组精准控制各谐波幅度与相位,配合OscillatorNode及实时调制(如包络、LFO、波表切换)实现动态音色演化。

用 PeriodicWave 创建复杂合成器音色,核心不是“堆谐波”,而是**精准控制频谱相位与动态演化**。它本身不发声,只定义一个周期波形的频域描述,必须配合 OscillatorNode 使用,且真正有表现力的部分在于实时调制——比如用包络改变谐波权重、用LFO扫频、或通过 AudioBufferSourceNode 拼接多个 PeriodicWave 实现波形切换。
理解 PeriodicWave 的本质:频域建模,非时域绘图
PeriodicWave 接收两组浮点数数组:real(余弦分量,对应幅度×cos(相位))和 imag(正弦分量,对应幅度×sin(相位)),共同构成复数频谱。第 n 个索引对应基频的 n 次谐波(n = 0 是直流分量,通常设为 0)。关键点:
- 数组长度决定最高谐波数(如长度为 32,支持 DC + 31 次谐波)
- 相位信息由
real/imag比值隐含:幅值 = √(real² + imag²),相位 = atan2(imag, real) - 要生成方波?设奇次谐波 real = 1/n,imag = 0;锯齿波?所有谐波 real = 0,imag = −1/n
- 避免直接手算——用 FFT 分析真实采样或用数学函数(如傅里叶级数)生成初始谱
构建可调制的合成器架构:不止于静态波形
静态 PeriodicWave 只是起点。真正乐器感来自变化。典型做法是用多个 OscillatorNode 或动态替换波表:
- 创建两个
PeriodicWave:一个基础波形(如带泛音的脉冲波),一个强调高频的“明亮”版本 - 用
GainNode对两个振荡器输出做交叉淡入淡出,由 ADSR 包络或鼠标拖拽控制比例 - 对
real/imag数组做实时缩放:例如将高次谐波(索引 >10)乘以一个随时间上升的系数,模拟“滤波开启”效果 - 注意:不能直接修改已传入
OscillatorNode的PeriodicWave;需调用oscillator.setPeriodicWave(newWave)切换
进阶技巧:相位塑形与非线性叠加
仅靠幅度调制仍显单薄。加入相位扰动和频谱混合能极大提升有机感:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
立即学习“前端免费学习笔记(深入)”;
- 在生成
real/imag时,给每个谐波加微小随机相位偏移(±0.1 弧度),避免数字声的“过净”感 - 把两个不同基频的
PeriodicWave振荡器混音后送入WaveShaperNode,用非线性函数(如 tanh)产生新组合频谱 - 用
ScriptProcessorNode(或现代替代方案如AudioWorklet)在音频回调中按帧重算部分谐波权重,实现颤音式频谱抖动 - 避免谐波全开:保留 2–3 个主导谐波,其余设为极低幅值(如 1e−6),让滤波器和效果器有操作空间
实用建议:从简单出发,逐步叠加
别一上来就写 64 谐波+相位动画。推荐路径:
- 先用
createPeriodicWave复现一个经典波形(方波/三角波),用示波器验证波形形状 - 添加一个
GainNode控制总输出,并用AudioParam.exponentialRampToValueAtTime做简单起音衰减 - 引入第二个
PeriodicWave,仅含 5–7 次谐波,用滑块控制其混合比例 - 最后接入
BiquadFilterNode(类型"peaking"),用包络调制中心频率,模拟共振峰扫频 - 所有参数暴露为 HTML range 输入,实时监听变化——耳朵比公式更可靠
Web Audio 的灵活性在于它不预设“乐器规则”,PeriodicWave 是你亲手雕刻声音DNA的刻刀。重点不在谐波数量,而在哪些谐波何时以何种相位出现。动手试错比理论推导更快找到那个“对”的音色。


















