piapia123
zh

节拍器

音视频

所有处理都在浏览器本地完成,数据不上传服务器

节拍器
120 BPM · 500 ms

⚠️ 拍点是**提前排**在音频时钟上的(不是「到点响一声」),所以主线程忙的时候拍子也不会漂;切到别的标签页也照样准。

⚠️ 这个节拍器与大多数在线节拍器的区别在一件看不见的事上:拍点是提前排在音频时钟上的,而不是「用定时器到点响一声」。 后者有三个必然的毛病:定时器会漂(回调被主线程挡住就晚一点,而这一点点延迟会累积,一分钟下来能差几十毫秒,耳朵对节拍器的抖动极其敏感);声音要在未来的某个精确时刻开始,而不是「现在就响」;切到别的标签页时定时器会被降到每秒一次,拍子直接崩掉。所以这里的做法是:一个每 25 毫秒跑一次的定时器只负责把接下来 100 毫秒的拍点排进音频时钟,真正发声的时刻由音频设备定死 —— 定时器偶尔晚一点也照样准。 另外三件事:点按测速(跟着音乐点几下,自动算出 BPM);拍号与重音(4/4 的第一拍重音、3/4 的圆舞曲感);速度术语(庄板 40、行板 76、快板 120……直接点,不用记数字)。全部在浏览器本地完成,不联网。

功能

  • ⚠️ 拍点提前排在音频时钟上,主线程忙或切到后台标签都不会漂
  • 30–300 BPM,滑杆与数字框双向同步
  • 拍号 2/4、3/4、4/4、6/4,重音可指定落在第几拍(也可关掉)
  • ⚠️ 重音高一个八度(1200 Hz 对 800 Hz),小节的第一拍听得出来
  • 点按测速:跟着节奏点几下就得到 BPM;超过 2 秒不点自动重开一轮
  • 点按的不稳定程度会提示出来 —— 你点得晃的时候读数本来就不该信
  • 速度术语一键切换(庄板 / 慢板 / 行板 / 中板 / 快板 / 急板 / 最急板)
  • 键盘:空格开始与停止
  • 全部在浏览器本地合成声音,不加载音频文件、不联网

使用方法

  1. 选一个速度术语,或拖滑杆 / 直接填 BPM
  2. 按需要设拍号与重音落在第几拍
  3. 点「开始」或按空格;跟着点「跟着点」可以让它测出你想要的 BPM
  4. 再按一次空格停止

常见问题

为什么不用 setInterval 直接响?
因为那样一定会漂。`setInterval` 只保证「至少隔这么久」,回调被主线程别的活挡住就晚一点,而延迟会累积 —— 一分钟下来差几十毫秒,鼓手当场就能听出来。正确做法是让定时器只负责「提前把拍点排进音频时钟」,发声时刻由音频设备定死。定时器偶尔晚几十毫秒也没关系,因为它排的是 100 毫秒之后的拍点。
切到别的标签页还准吗?
准。因为发声的时刻已经交给音频时钟了,而浏览器对后台标签的限制主要落在定时器与渲染上。⚠️ 但要注意:后台标签里的声音不会停 —— 这是浏览器的行为(音频播放会让标签页保持活跃),不是这个工具能控制的。不想听就按空格停掉。
重音为什么听起来是「嘀」和「嗒」?
重音用的是 1200 Hz、其余拍用 800 Hz,音高不同而不是音量不同 —— 音量差在小音箱上几乎听不出来,而音高差在任何设备上都清楚。想听小节的第一拍就把重音设在「1」,想更平均就选「不加重音」。
点按测速的读数怎么会飘?
因为它量的是你。读数取的是首尾两次敲击的平均间隔(不是相邻间隔的平均 —— 那个会把每一次抖动都算进去),所以点得越均匀越准。少于三次敲击时不会给「不稳定」的提示,因为样本太少说明不了问题。⚠️ 超过 2 秒没点会自动重开一轮,否则「点两下、想一会儿、再点两下」会被算成一段很慢的拍子。

相关工具