节拍器
30-300 BPM · 多种拍号 · 视觉 + 音效双重提示 · 钢琴 / 吉他 / 鼓练习
BPM/节拍切换/视觉提示
30-300 BPM · 多种拍号 · 视觉 + 音效双重提示 · 钢琴 / 吉他 / 鼓练习
键盘快捷键:空格键 = 开始 / 停止;←→ 调整 ±1 BPM;上下键 ±10 BPM。
重拍:每小节第一拍音色更明显(金色高亮),便于跟拍。
练习建议:练习新曲先慢速(70-80 BPM)熟悉指法,再逐渐加快到目标速度。每次加速 10-15 BPM。
了解工具定位 · 使用场景 · 对比优势
设定 BPM 和节拍,节拍器在浏览器中直接发出视觉和听觉提示。练习乐器时稳定节奏、录音时校准速度、跑步时匹配步频,无需额外设备。所有运算在本地完成,不产生网络请求。
吉他手在练习 16 分音符扫弦或速弹乐句时,容易越弹越快、节奏不稳。使用本工具设置目标 BPM(如 120),从 60 BPM 开始逐步提速,配合视觉闪光提示,确保每个音符时值均匀。练习 10 分钟后,节奏感明显提升,减少录音时反复重录的挫败感。
健身教练或居家锻炼者做高强度间歇训练(HIIT)时,需要精确控制动作节奏(如 30 秒冲刺 / 15 秒休息)。使用本工具设置 180 BPM 的节拍,每拍对应一次动作,视觉提示帮助同步呼吸与发力,避免因疲劳导致动作变形,提升训练效率。
舞蹈老师教新编舞步时,学员常因听不清音乐拍点而抢拍或拖拍。使用本工具将 BPM 降至原曲的 70%,配合强视觉闪光标记重拍,学员能清晰看到每个动作的落拍点。熟练后再逐步提升至原速,排练时间缩短 30%,动作整齐度显著提高。
录音师在录制人声或器乐分轨时,歌手/乐手需要稳定的节拍参考,但耳机中的节拍器声音可能被伴奏掩盖。使用本工具的视觉提示(屏幕闪烁或进度条),以 80 BPM 的节拍提供无声参考,避免节拍器音轨混入录音,后期剪辑时无需额外对齐。
冥想初学者练习 4-7-8 呼吸法(吸气 4 秒、屏息 7 秒、呼气 8 秒)时,容易数错秒数导致节奏紊乱。使用本工具设置 60 BPM(每秒一拍),通过视觉闪光提示吸气 / 屏息 / 呼气的切换节点,无需分心计数,专注呼吸深度,更快进入放松状态。
| 维度 | 本工具 | 竞品 A (Metronome Online) | 传统方法 (机械节拍器) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,音频和操作数据不上传服务器 | 需加载网页,部分功能可能请求网络资源 | 完全离线,无数据流 |
| 处理速度 | 点击即响应,无网络延迟 | 依赖页面加载速度,通常 1-3 秒 | 手动上发条、调整摆锤,需数秒 |
| 离线可用 | 完全离线(浏览器缓存后) | 需联网加载页面 | 完全离线,无需电力 |
| 声音生成 | 使用 Web Audio API,音色可调 | 通常使用预录音频文件,音色固定 | 纯机械敲击声,音色单一 |
| 节拍范围 | 20-300 BPM,步进 1 BPM | 20-300 BPM,步进 1 BPM | 通常 40-208 BPM,步进受摆锤长度限制 |
| 视觉辅助 | 支持闪光、颜色变化、进度条等自定义 | 通常仅有简单的闪光或跳动图标 | 无视觉辅助,仅靠听觉 |
| 平台兼容 | 任何现代浏览器(桌面/移动) | 任何现代浏览器 | 实体设备,需携带 |
| 成本 | 免费,无广告 | 免费,可能有广告 | 需购买硬件,价格 50-500 元不等 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 120 | BPM: 120 | 节拍: 4/4 | 视觉提示: 每拍闪烁一次,强拍高亮 | 典型场景:中速练习,适合流行歌曲伴奏 |
| 60 | BPM: 60 | 节拍: 4/4 | 视觉提示: 每秒一拍,强拍高亮 | 典型场景:慢速练习,适合初学者或复杂段落 |
| 200 | BPM: 200 | 节拍: 4/4 | 视觉提示: 每拍闪烁一次,强拍高亮 | 边界 case:极速节拍,接近人类演奏极限 |
| 1 | BPM: 1 | 节拍: 4/4 | 视觉提示: 每分钟闪烁一次 | 边界 case:极慢节拍,用于呼吸训练或冥想 |
| 300 | BPM: 300 | 节拍: 4/4 | 视觉提示: 每拍闪烁一次,强拍高亮 | 边界 case:超出常见音乐范围,测试工具上限 |
| 120 | BPM: 120 | 节拍: 3/4 | 视觉提示: 每拍闪烁一次,第一拍强拍高亮 | 易错 case:新手常忽略切换节拍类型(3/4 与 4/4 视觉提示不同) |
| 0 | BPM: 0 | 节拍: 4/4 | 视觉提示: 无闪烁 | 边界 case:BPM 为 0 时无节拍输出,用于静音模式测试 |
BPM 设为 999BPM 设为 120(常见流行歌曲速度)人耳可感知的节拍范围约 20-300 BPM;极端值(如 999)浏览器音频 API 可能无法稳定输出,且听觉上已无节拍感。
BPM 设为 120.7BPM 设为 120 或 121多数前端节拍器基于 setInterval/setTimeout,精度受浏览器事件循环限制(约 4ms 抖动),小数 BPM 的实际间隔与整数无差异。
认为 4/4 拍就是 BPM=44/4 拍表示每小节 4 拍,每拍四分音符;BPM=120 表示每分钟 120 个四分音符BPM 是速度,节拍号是拍子结构;两个独立参数。常见误解是将拍号分母(如 4)当作 BPM。
在 3/4 拍下设置重拍为第 1、2、4 拍在 3/4 拍下重拍通常设第 1 拍(强拍),第 2、3 拍为弱拍节拍号定义了强弱拍模式(如 3/4 为强-弱-弱);自定义重拍若违反基本规律,会误导节奏感知。
用蓝牙耳机练习时,认为节拍器声音与动作完全同步使用有线耳机或外放,或在设置中手动调整延迟补偿(若有该选项)蓝牙音频延迟通常 100-300ms,远超节拍器精度要求(<20ms);导致听觉节拍与视觉提示错位。
关闭声音仅用屏幕闪烁打拍子同时使用声音和视觉提示,或确认视觉延迟可接受浏览器渲染帧率(60fps)下,视觉变化延迟约 16ms;但若页面被后台标签页节流(Chrome 限制 1fps),视觉提示会严重滞后。
练习一段渐慢乐段时保持固定 BPM手动分段调整 BPM,或使用支持速度曲线(tempo mapping)的节拍器本工具为固定 BPM 节拍器,不支持速度渐变;若需渐慢效果,需每隔几小节手动降低 BPM。
锁屏后继续练习,发现节拍器无声保持屏幕常亮(关闭自动锁屏)或使用后台音频支持的工具浏览器在移动端锁屏后,setInterval 会被系统暂停(iOS Safari 约 30 秒后停止),导致节拍器失效。
公式推导 · 流程图解 · 依据出处
t = 60 / BPM
t — 每拍间隔时间(秒)BPM — 每分钟节拍数(Beats Per Minute)设定 BPM = 120,则每拍间隔 t = 60 / 120 = 0.5 秒。节拍器每 0.5 秒发出一次视觉或听觉提示,适合快节奏练习(如 4/4 拍 120 BPM 的流行曲)。
适用于所有基于 BPM 的节拍器。BPM 通常取值 20–300,低于 20 或高于 300 时人耳/眼难以感知,工具可能不提供该范围。公式为定义式,无误差。
3 种主流语言 · 复制即用
import time
import winsound # Windows 系统可用
def metronome(bpm: int, beats: int = 4):
"""
生成节拍器音频信号。
bpm: 每分钟节拍数 (20-300)
beats: 每小节拍数 (2-8)
"""
interval = 60.0 / bpm # 每拍间隔(秒)
for beat in range(beats):
# 强拍(第1拍)用较高频率,弱拍用较低频率
freq = 880 if beat == 0 else 440
winsound.Beep(freq, 100) # 100ms 短音
time.sleep(interval - 0.1) # 减去 Beep 占用时间
# 示例:120 BPM,4/4 拍,播放一个小节
metronome(120, 4)package main
import (
"fmt"
"time"
)
// 使用标准库 time 模拟节拍器视觉提示
func metronome(bpm int, beats int) {
interval := time.Duration(60.0/float64(bpm)*1000) * time.Millisecond
for i := 0; i < beats; i++ {
if i == 0 {
fmt.Println("🔴 强拍") // 第1拍视觉强调
} else {
fmt.Println("⚪ 弱拍")
}
time.Sleep(interval)
}
}
func main() {
// 示例:80 BPM,3/4 拍
metronome(80, 3)
}// 浏览器端节拍器:使用 AudioContext 生成点击声 + 视觉闪烁
function createMetronome(bpm = 120, beatsPerBar = 4) {
const audioCtx = new (window.AudioContext || window.webkitAudioContext)();
const interval = 60 / bpm; // 每拍间隔(秒)
let currentBeat = 0;
function playClick(beatIndex) {
// 生成短促的 click 音
const osc = audioCtx.createOscillator();
const gain = audioCtx.createGain();
osc.frequency.value = beatIndex === 0 ? 1000 : 800; // 强拍音高更高
gain.gain.value = 0.3;
osc.connect(gain);
gain.connect(audioCtx.destination);
osc.start();
osc.stop(audioCtx.currentTime + 0.05); // 50ms 短音
// 视觉提示:控制台输出或 DOM 闪烁
console.log(beatIndex === 0 ? '● 强拍' : '○ 弱拍');
}
function tick() {
playClick(currentBeat);
currentBeat = (currentBeat + 1) % beatsPerBar;
setTimeout(tick, interval * 1000);
}
tick();
}
// 启动:120 BPM,4/4 拍
createMetronome(120, 4);7 个高频疑问