oscillatornode创建正弦波是web audio api最基础的声音合成方式,需四步:获取audiocontext、创建振荡器、设置type和frequency、连接destination并调用start();它不加载音频文件,仅实时生成周期信号,且必须在用户手势后激活,start()不可重复调用。

用 OscillatorNode 创建正弦波是 Web Audio API 最基础、最直接的声音合成方式。它不依赖任何音频文件,纯靠代码实时生成纯净的周期性信号,适合做音高测试、提示音、教学演示或合成器底层模块。
创建并启动一个正弦波振荡器
核心步骤只有四步:获取上下文 → 创建振荡器 → 设置参数 → 连接并启动。注意所有操作必须在用户手势(如点击)触发后执行,否则现代浏览器会因策略限制静音。
- 先初始化 AudioContext:
const audioCtx = new (window.AudioContext || window.webkitAudioContext)(); - 创建振荡器:
const osc = audioCtx.createOscillator(); - 指定波形与频率:
osc.type = 'sine'; osc.frequency.value = 440;(440Hz 是标准 A4 音) - 连接输出并启动:
osc.connect(audioCtx.destination); osc.start();
为什么必须手动调用 start()?
OscillatorNode 默认处于“未激活”状态,即使已连接也不发声。这是浏览器防止自动播放的强制机制。start() 不仅开启声音,还绑定时间戳(audioCtx.currentTime),后续所有定时操作(如频率变化、包络控制)都以此为基准。
- 不能省略
osc.start(),否则听不到任何声音 - start() 只能调用一次;若需重复播放,应新建振荡器或改用 AudioBufferSourceNode
- 若要停止,调用
osc.stop(),但停止后该节点不可复用
让正弦波更实用:加个音量控制
直接连到 destination 声音太大且无法调节。推荐插入 GainNode 控制响度,并用 setTargetAtTime 实现平滑启停,避免爆音。
- 创建增益节点:
const gain = audioCtx.createGain(); gain.gain.value = 0; - 连接链路:
osc.connect(gain).connect(audioCtx.destination); - 点击时“淡入”发声:
gain.gain.setTargetAtTime(0.3, audioCtx.currentTime, 0.01); - 0.5 秒后“淡出”停止:
gain.gain.setTargetAtTime(0, audioCtx.currentTime, 0.01);
常见问题与避坑提醒
初学者容易卡在这几个地方:上下文被挂起、重复 start 报错、忘记连接、或误以为能加载 MP3。记住关键事实:
- AudioContext 在页面加载后默认“挂起”,需用户交互(如 click)后调用
audioCtx.resume() - OscillatorNode 是一次性节点:start 后 stop,就不能再 start;要再次发声,必须 new 一个
- 它只能生成波形,不能播放 wav/mp3 —— 那是 AudioBufferSourceNode 的事
- type 属性可动态修改(如从 'sine' 改成 'square'),但只在运行中生效;已 stop 的节点改了也没用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











