怎麼用
- 用「−1、+1、−5、+5」或下方滑桿調整速度,也可以直接輸入 20 到 300 之間的數字。不確定曲子多快時,跟著音樂連續點「點拍測速」,工具會算出大約的 BPM。
- 選拍號。2/4、3/4、4/4、5/4 一拍是四分音符;6/8、9/8、12/8 一拍是附點四分音符。
- 需要的話選「細分」,讓每一拍多出幾個較輕的聲音,方便抓八分音符、三連音或十六分音符的位置。
- 按「開始」。第一拍預設會用較高、較大聲的重音,畫面上的圓點會跟著亮,並可以選擇每拍閃一下畫面。播放中調整速度會立刻生效,不用停下來。
速度術語對照
樂譜上常用義大利文標示速度。目前的 BPM 落在哪個範圍,上方會顯示對應術語;也可以按表格右邊的按鈕,直接套用該範圍中間附近的速度。
| 術語 | 中文 | 常見範圍(BPM) | 套用 |
|---|---|---|---|
| Larghissimo | 極緩板 | 24 以下 | |
| Grave | 莊板 | 24–40 | |
| Lento | 緩板 | 40–60 | |
| Largo | 廣板 | 40–66 | |
| Larghetto | 稍廣板 | 44–66 | |
| Adagio | 慢板 | 44–66 | |
| Andante | 行板 | 56–108 | |
| Moderato | 中板 | 108–120 | |
| Allegretto | 小快板 | 112–120 | |
| Allegro | 快板 | 120–156 | |
| Vivace | 活潑的快板 | 156–176 | |
| Presto | 急板 | 168–200 | |
| Prestissimo | 最急板 | 200 以上 |
這些範圍來自辭典整理的常見數值,不同資料會有出入,也有重疊,只能當參考。不同時代的意思也會變,以樂譜與老師的指示為準。
計時準確度
網頁上最常見的節拍器做法是 setInterval 每隔一段時間就發一聲,但瀏覽器的計時器會受網頁忙碌、分頁節流影響,快慢可能差到幾十毫秒,聽起來就是節奏不穩。本工具改成業界建議的「兩個時鐘」做法:
- 音訊時鐘:Web Audio 的 AudioContext.currentTime 由音訊硬體驅動,非常穩。每一聲「嗒」都用 osc.start(時間) 事先排在這個時鐘的精確時間點上。
- 排程器:每 25 毫秒醒來一次,把未來 0.1 秒內還沒排的拍子補進去。排程器晚醒不要緊,只要在 0.1 秒內醒來,聲音仍會準時發出。
- 每一拍的時間是累加算出來的:下一拍時間=上一拍時間+60÷BPM÷細分數,不是用現在的時間重新抓,所以誤差不會一路累積。
實測數字(用 Chromium 自動化測試,程式碼與原始輸出放在專案的 _test/metronome/):
| 測試 | 條件 | 結果 |
|---|---|---|
| 離線渲染 | 120 BPM、4/4、連跑 60 秒(120 拍),排程器的喚醒時間用 0 到 40 毫秒的隨機延遲模擬;用 OfflineAudioContext 真的渲染成聲音,再從波形偵測每一拍的起點 | 120 拍全部偵測到;每一拍相對理想時間的最大誤差 0.047 毫秒(約 2 個取樣點,44.1 kHz 下 1 個取樣點=0.023 毫秒);排程時間點本身與理想值的誤差為 0 |
| 即時執行 | 120 BPM、4/4、在真實瀏覽器連跑 60 秒,記錄每一拍被排進時間軸的時間點 | 120 拍的排程時間與理想時間誤差為 0(時間用累加算出);每一拍在發聲前 68 到 99 毫秒(中位數 88 毫秒)就已排好,沒有任何一拍來不及 |
這些數字是「排程」的準確度。實際從喇叭出來的聲音,還會加上裝置固定的輸出延遲(內建喇叭通常很短,藍牙耳機可能到 100 到 300 毫秒),這個延遲每一拍都一樣,所以節奏不會變,只是聲音比畫面晚一點點。
手機切到背景、鎖螢幕會怎樣
瀏覽器為了省電,會限制在背景分頁的網頁:計時器降速、甚至暫停音訊。排程器需要每 25 毫秒醒來,一旦被降速,超過 0.1 秒的預排範圍,聲音就會斷掉。桌機上的 Chrome 在分頁有聲音播放時通常不會限制,但手機(特別是 iPhone)鎖螢幕後常會停止,而且行為依系統與瀏覽器版本不同,我們沒辦法保證。因此請把這一頁留在前景使用。回到頁面時,如果節拍已經被系統暫停,頁面會直接告訴你。
常見問題
這個節拍器準不準?會不會忽快忽慢?
很準,不會因為網頁卡一下就變快變慢。做法是:不用「計時器一響就發一聲」,而是由程式提前把接下來 0.1 秒內的拍子,用音訊時鐘(AudioContext 的時間軸,由音訊硬體驅動)排好發聲時間,計時器只負責定時醒來補排。計時器就算晚醒幾十毫秒,已經排好的拍子仍然落在精確的時間點上。我們用程式實測過:120 BPM 連跑 60 秒共 120 拍,在模擬計時器隨機延遲 0 到 40 毫秒的情況下,聽得到的拍點離理想時間最大誤差約 0.05 毫秒(約 2 個取樣點);詳細做法和數字寫在下方「計時準確度」一節。要提醒的是,這是排程的準確度,實際聽到的聲音還會多一段固定的裝置播放延遲(藍牙耳機尤其明顯),但這段延遲每一拍都一樣,不影響節奏。
手機切到背景或鎖螢幕,節拍會停嗎?
有可能會停,而且各家手機不一樣,我們沒辦法保證。網頁在背景時,瀏覽器常會把計時器降速,或乾脆暫停網頁的聲音,iPhone 的 Safari 尤其容易在鎖螢幕後停止。所以用手機練習時,請讓這一頁保持在前景、螢幕開著。我們會在播放時請瀏覽器「不要自動熄屏」,但這只是請求,是否照辦由瀏覽器和系統決定。如果回到頁面時發現節拍停了,頁面會提示,再按一次「開始」即可。需要鎖屏也不中斷的話,建議改用手機內建或專門的節拍器 App。
BPM 是什麼?練琴該從多快開始?
BPM(Beats Per Minute)是每分鐘幾拍。60 BPM 就是每秒一拍,120 BPM 是每秒兩拍。數字越大越快。練新曲子的常見做法是先用慢到能完全彈對的速度,例如 60 到 80 BPM,穩定之後再每次加 4 到 8 BPM。這是一般練習方法,不是硬性規定,實際請依老師的建議和自己的程度調整。
6/8 拍的 BPM 是怎麼算的?
在 6/8、9/8、12/8 這類「複合拍子」,大家習慣把附點四分音符當成一拍,所以本工具選 6/8 時,每小節是 2 拍,BPM 就是「每分鐘幾個附點四分音符」,每一拍預設再細分成 3 個八分音符,聽起來就是 1-2-3-4-5-6 的感覺,第 1 和第 4 下是較強的拍。如果你的樂譜標示的是「八分音符=某某」,請把那個數字除以 3 再填進來。2/4、3/4、4/4、5/4 則是以四分音符為一拍。
Tap tempo(點拍測速)是怎麼運作的?
你跟著音樂的節奏連續點「點拍」按鈕,工具會把最近最多 8 下之間的時間間隔取平均,換算成 BPM(60000 毫秒除以平均間隔)。點的次數越多越穩,至少要點 2 下。如果超過 2 秒沒有點,就會當成重新開始。結果會限制在 20 到 300 BPM 之間,而且會四捨五入成整數。
為什麼沒有聲音?
常見原因有三個:第一,瀏覽器要等你按下「開始」才允許發聲,所以請先按一次按鈕;第二,iPhone 側邊的靜音開關打開時,網頁的聲音可能被靜音,請先關掉靜音並調大音量;第三,音量滑桿被拉到最低,請調整頁面上的「音量」。如果還是沒聲音,換一個瀏覽器試試,或確認裝置的輸出是不是接到沒開的藍牙裝置。
速度術語(Allegro、Andante)對應的 BPM 是標準答案嗎?
不是。速度術語本來是形容「速度與情緒」,不是精確數字,不同辭典、不同年代給的範圍會有出入,同一個詞在巴洛克時期和 19 世紀的意思也不完全一樣(例如 Largo 在巴洛克時期比 Adagio 快,現代則比較慢)。下表的範圍是依 Wikipedia〈Tempo〉整理的常見數值,範圍有重疊是正常的,請當作參考,以樂譜上的標示或老師的指示為準。
會收集我的資料嗎?
不會。節拍器只在你的瀏覽器裡用 Web Audio 產生聲音,沒有用到麥克風,也不會把你設定的速度、拍號傳到伺服器。網站只會記錄你按了哪個按鈕這類匿名使用事件,不含你填的數字。
規格與來源
- 排程方式:Chris Wilson,〈A Tale of Two Clocks〉(Web Audio 節拍器的標準做法,web.dev 收錄):web.dev/articles/audio-scheduling。
- Web Audio API 規格(W3C):w3.org/TR/webaudio。
- 速度術語與 BPM 範圍:Wikipedia〈Tempo〉整理自 Elson《Pocket Music Dictionary》等辭典:en.wikipedia.org/wiki/Tempo;範圍因資料而異。
- BPM 範圍 20 到 300;細分選項:簡單拍子可選每拍 1、2(八分)、3(三連音)、4(十六分)下,複合拍子可選每拍 1、3(八分)、6(十六分)下。
- 全部在瀏覽器內執行;工具本身不載入外部程式庫(全站的統計與廣告腳本除外)。