网页版乐器调音器的核心是实时将麦克风声音转换为音高信息,依赖媒体权限获取、音频流接入、频率分析和音名映射四步闭环;需HTTPS环境与用户交互触发权限,通过AnalyserNode做FFT频谱分析,再依十二平均律公式换算MIDI编号及音名,并以可视化方式反馈偏差。

网页版乐器调音器的核心,是把麦克风采集的声音实时转换成可判断的音高信息。它不依赖安装包、不挑设备,只要浏览器支持 Web Audio API,打开就能用——关键在于媒体设备权限获取、音频流接入、频率分析和音名映射这四步闭环。
麦克风权限获取与流初始化
调音器第一步是拿到声音输入权限。必须调用 navigator.mediaDevices.getUserMedia({ audio: true }),它返回一个 Promise,成功后得到 MediaStream 对象。注意两点:
- 仅 HTTPS 环境下才能调用该 API(HTTP 页面会直接报错
getUserMedia is undefined) - 需在用户主动交互(如点击按钮)后触发,避免被浏览器拦截
拿到流之后,用 AudioContext.createMediaStreamSource(stream) 将其转为音频节点,接入后续处理链路。
音频分析:用 AnalyserNode 提取频域数据
Web Audio API 的 AnalyserNode 是调音器的“耳朵”。它能对输入音频做 FFT(快速傅里叶变换),输出频谱数据:
- 设置
fftSize = 2048或 4096,分辨率越高,基频识别越准(但计算开销略增) - 调用
analyser.getFloatFrequencyData()获取当前频谱数组,单位为 dB - 峰值所在 bin 对应的频率 ≈
(binIndex / fftSize) * sampleRate
实际中需过滤噪声干扰,通常只关注 80Hz–1200Hz 区间(覆盖吉他、尤克里里、小提琴常用音域)。
频率→音名:十二平均律换算逻辑
检测到基频后,要映射到标准音名(如 A4、E3)。核心公式基于十二平均律:
音名编号 = round(69 + 12 × log₂(f / 440)),其中 f 是检测频率,440Hz 是 A4 标准音高
- 结果为整数 MIDI 编号(如 69 → A4,64 → E4,57 → A3)
- 再查表转为带八度的音名(C4/D4/E4…),并支持升降号(C#4、Db4 视为等价)
- 偏差值 = (f − f₀) / f₀ × 100%,用于驱动指针或色块偏移(±30 音分以内算准)
可视化与交互反馈
用户需要即时、直观的响应:
- 主显示区居中显示当前最接近音名(如 “A4”),字体加粗+高对比色
- 左右滑动条或旋转指针表示偏差方向与幅度(左偏=偏低,右偏=偏高)
- 波形图用
analyser.getByteTimeDomainData()实时绘制,增强现场感 - 支持切换乐器预设(如吉他六弦对应 E2/A2/D3/G3/B3/E4),自动限定搜索范围提升准确率
不复杂但容易忽略

















