约 1358 字

约 7 分钟

#节拍器

节拍器

这是一个功能完整的网页版节拍器,拥有视觉化的单摆动画和可调节的节拍设置。下面我将从几个方面为你详细分析它的工作原理。

#整体功能概述

这个页面模拟了一个真实的机械节拍器。它通过一个左右摆动的单摆和同步的提示音,帮助音乐练习者掌握稳定的节奏。用户可以自由调整速度(BPM)和每小节的拍数。

#核心功能模块分析

#1. 视觉界面

  • 单摆动画:页面顶部有一个带摆锤的摆杆,它会随着节拍左右摆动。摆动的幅度固定为40度。
  • 节拍指示灯:下方有一排圆点,数量等于“每小节拍数”。每个节拍响起时,对应的圆点会高亮(第一拍为红色,其余为蓝色),直观地显示当前是第几拍。
  • 控制面板:包含速度滑块、拍数输入框和开始/停止按钮。

#2. 核心逻辑与代码亮点

节拍调度器

  • 代码使用Web Audio API高精度的 audioContext.currentTime 来安排声音的播放时间。scheduler 函数会提前0.1秒计算并安排好未来需要播放的节拍,确保声音稳定、不卡顿,即使在后台标签页也能相对准确地运行。

动画同步

  • 为了实现声音与动画的精确同步,代码在 scheduleNote 函数中,根据声音计划的播放时间 (time) 和当前时间,计算出精确的延迟 (timeUntilPlay),然后使用 setTimeout 来触发动画。这确保了摆锤每次摆到中心点(也就是发出“滴答”声的瞬间)时,动画恰好开始。
  • 动画本身使用了现代、流畅的 Web Animations API。摆锤的运动曲线被设置为“减速-加速”,模拟了真实单摆受重力影响的效果。

节拍声音

  • 声音通过Web Audio API动态生成。第一拍(强拍)使用1000Hz的高音,其余拍使用700Hz的低音,通过音高来区分重音。
  • 每个声音都很短(0.05秒),并带有渐弱的效果 (exponentialRampToValueAtTime),听起来清脆不刺耳。

状态管理

  • 点击“开始”按钮,会初始化音频上下文、重置节拍计数器、启动调度器,按钮变为“停止”。
  • 点击“停止”会清除所有待执行的定时器、取消动画、将摆锤归零,并熄灭所有指示灯。

#3. 用户交互与数据流

  1. 调整速度:拖动滑块时,bpm 变量实时更新,但只有在下次开始或下一轮调度时,新的速度才会生效。
  2. 调整拍数:改变“每小节拍数”后,下方的指示灯数量会立即变化。节拍器在运行时改变此值,也会在下一小节按新规则循环。
  3. 启动/停止:这是整个程序的主开关,控制着所有核心循环的运行与销毁。

#源码

更新: 2026/3/12

作者: PlanC

创建: 2026/3/12