DrumPulse iconDrumPulse

The math

How a wrist flick becomes a score

These are the formulas the app actually runs, with the real numbers, and a worked example for each one. No black box: if a score surprises you, you can check it here.

Reading the symbols

means square root: the number that, multiplied by itself, gives the number under the sign. √9 = 3, because 3 × 3 = 9. √2.25 = 1.5, because 1.5 × 1.5 = 2.25.

means x squared, x multiplied by itself: 3² = 9, and (−3)² = 9 too, since a negative times a negative is positive.

Squaring and square root undo each other. The formulas below square numbers to make them all positive and to weigh big misses more, then take the square root to get back to milliseconds or g.

🥁 1. Detecting a hit

The watch reads its accelerometer about 100 times a second. Each reading is three numbers (x, y, z, in g). DrumPulse turns them into one number, the strength:

strength = √(x² + y² + z²)

In words: square each of the three numbers, add them up, and take the square root. It's the same rule as Pythagoras (a² + b² = c²) in three directions, and it gives the overall size of the jolt whichever way the wrist is pointing.

Example

A reading of x = 2.1, y = −1.4, z = 0.9 gives √(4.41 + 1.96 + 0.81) = √7.18 = 2.68 g.

A hit is a peak in that strength that rises above your threshold. The Sensitivity slider (0 to 1) sets the threshold:

threshold (g) = 1.6 − 1.15 × sensitivity

So sensitivity 0 needs 1.6 g, sensitivity 1 needs only 0.45 g, and the default of 0.8 needs 0.68 g. Calibration does this for you: you strike 8 times, and it sets the threshold to 70% of your softest strike, so even that one clears it.

Cleaning up the peak

⏱️ 2. Metronome timing: distance to the nearest gridline

With the click on, every hit gets a deviation: how far it landed from the nearest gridline, in milliseconds. Early is negative (rushing), late is positive (dragging).

beat length = 60 ÷ BPM
deviation = hit time − nearest gridline

Gridlines are the beats plus the subdivision you're playing: eighths put a line halfway through each beat, triplets at ⅓ and ⅔, sixteenths every quarter beat. On Auto, DrumPulse picks the subdivision from the spacing of your recent hits, so a busy eighth-note groove isn't graded as if you were missing quarter notes.

A hit within ±30 ms of its gridline counts as on time. That's a tight human ±20 ms plus the ±10 ms the sensor itself can't resolve.

Example at 120 BPM, eighth notes

A beat is 60 ÷ 120 = 500 ms, so the gridlines are every 250 ms: 0, 250, 500, 750…

A hit at 1,482 ms is nearest the 1,500 ms line: 1,482 − 1,500 = −18 ms. That's 18 ms early, inside ±30, so it's on time.

A hit at 1,535 ms: +35 ms, outside ±30, so it's dragging.

The grid is timed to when you hear the click, not when the watch sends it to the speaker. Audio output has its own delay (Bluetooth headphones add a lot), and you play to what reaches your ears, so the watch measures that delay and shifts the grid by it.

🎶 3. Free Play timing: you against your own groove

With no click there's no grid to measure against, so Free Play asks a different question: is your beat getting shorter or longer than the groove you set?

Step 1: your current tempo

DrumPulse looks at the gaps between your hits. Each gap is matched to a note value (16th, triplet, eighth, quarter, dotted quarter, half, whole) and converted into the beat length it implies. Your current tempo is the median of the last 8. A median shrugs off the odd missed or extra hit, which an average can't.

Step 2: your groove (the baseline)

Your groove is a slow running average of that tempo. Each new reading nudges it 10% of the way:

groove = 0.9 × groove + 0.1 × current tempo

So a few fast hits barely move it, but a steady push shows up over about 20 hits.

Step 3: the deviation
deviation = (60 ÷ current BPM − 60 ÷ groove BPM) × 1000 ms

That's the difference in beat length. On time is within 3% of your groove's beat.

Example: groove settled at 120 BPM

The groove's beat is 500 ms, so on time is within ±15 ms (3% of 500).

You speed up to 123 BPM: a beat of 487.8 ms, so the deviation is −12.2 ms. That's inside ±15, so it's on time.

You push to 126 BPM: a beat of 476.2 ms, so −23.8 ms, and that's rushing.

Guard rails

🎯 4. Mean, jitter, and the groove score

Every graded hit has a deviation d. Over the session, DrumPulse rolls them into three numbers:

mean = (d₁ + d₂ + … + dₙ) ÷ n
RMS = √((d₁² + d₂² + … + dₙ²) ÷ n)
jitter = √(RMS² − mean²)

RMS stands for root mean square, which is the recipe read backwards: square every deviation, take the mean (average) of those squares, then the square root. Squaring stops early and late misses from cancelling out (−20 and +20 both become 400), and it makes one 60 ms miss count for more than three 20 ms ones.

The groove score comes from RMS:

score = 100 − (RMS − 15) ÷ 75 × 100, kept between 0 and 100

An RMS of 15 ms or less scores 100. That's about the limit of what a wrist sensor sampling every 10 ms can resolve, so tighter than that can't be measured. The score falls in a straight line to 0 at 90 ms.

100500 015306090 ms RMS distance from the beat example: 22.7 ms → 90

Example: five hits

HitDeviationVerdict (±30 ms)
1−35 msrushing
2+10 mson time
3−25 mson time
4+20 mson time
5−15 mson time

Mean = −45 ÷ 5 = −9 ms (leaning early).

RMS = √((1225 + 100 + 625 + 400 + 225) ÷ 5) = √515 = 22.7 ms.

Jitter = √(515 − 81) = √434 = 20.8 ms.

Score = 100 − (22.7 − 15) ÷ 75 × 100 = 90.

Why RMS, not jitter

A drummer who lands every hit exactly 40 ms late has a jitter of 0, perfectly steady. But they're never on the beat. Their RMS is 40 ms, so they score 67, not 100.

RMSScore
15 ms or less100
20 ms93
30 ms80
40 ms67
52.5 ms50
90 ms or more0

Two more counts ride along: the rushing / on-time / dragging split (from the verdicts above), and your best on-time streak, the longest run of consecutive on-time hits.

💪 5. Dynamics: ghost, body, accent

DrumPulse keeps a running "normal" strength for you, a slow average where each hit counts 5%. Every hit is then sorted against it:

Example

If your normal is 2.0 g, a ghost note is anything under 1.2 g and an accent anything over 3.2 g. A player whose normal is 4.0 g gets 2.4 g and 6.4 g. Everyone is measured against their own touch.

Dynamic range is your average accent strength divided by your average ghost strength. "2.9× soft → loud" means your accents hit almost three times as hard as your ghosts. It's shown once each tier has at least 5 hits.

📈 6. Accent lag

Using the same ghost/accent split, DrumPulse averages the timing deviation of each group separately:

accent lag = mean deviation of accents − mean deviation of ghosts

Example from a real gig

Accents averaged +2.11 ms, ghosts +1.36 ms: lag = 2.11 − 1.36 = +0.75 ms. That's an even touch.

If accents averaged +12 ms and ghosts +2 ms, the lag would be +10 ms: your big hits sit behind your little ones, a common habit that the overall score hides because the two average out.

It needs at least 5 graded ghosts and 5 graded accents. It covers the whole session, not a sample of it.

🎼 7. Songs, set arc, and in-song drift

Splitting a set into songs (Free Play)

Example

Pieces at 124, 125 and 120 BPM with short gaps: 124 → 125 differ by under 1%, so they merge into one song. 125 → 120 differ by 4%, so a new song starts.

In-song drift

Within each song, DrumPulse fits a straight line through your tempo over time (least squares). The slope is how many BPM you gained or lost per minute: "pushes +2/min" means the song got about 2 BPM faster every minute. Within ±1 BPM/min counts as steady. It needs a song of at least 90 s, and implausible fits (steeper than ±30 BPM/min) are discarded rather than shown.

Set arc

The session is cut into one-minute slices, and each slice gets its own mean deviation, tempo and strength. The captions describe the range where most of the set lived (the 10th to 90th percentile), so one odd minute can't claim "tempo ranged 82–149" when every song sat at 110–120. The chart still draws that odd minute.

Playing time

Any gap under 5 s between hits counts as playing; longer gaps count as rest. "Playing 78% of set" is the playing time divided by the session length.

🔥 8. Calories and heart rate

Calories use the standard MET formula, with your weight and the Intensity setting (MET):

kcal per minute = MET × 3.5 × weight (kg) ÷ 200

Example

A 226 lb (102.5 kg) drummer at MET 5.7: 5.7 × 3.5 × 102.5 ÷ 200 = 10.2 kcal a minute, or about 614 kcal for an hour of playing.

Paused time isn't counted. This is an estimate from time and intensity, not from your hits, so set Intensity to match how hard you play (the app's default is 4.0).

Heart-rate zones use percent of max heart rate (220 − age): Zone 1 under 60%, Zone 2 60–70%, Zone 3 70–80%, Zone 4 80–90%, Zone 5 90% and up.

Heart-rate recovery is your median heart rate over the 30 s before your last hit, minus your median from 50 to 70 s after it. A drop from 120 to 95 is a recovery of 25 bpm. Wrist readings can glitch, so a result is shown only when it's believable (no more than 60 bpm).

Hit power is simply the average strength of your hits, in g.

← How it works Read the FAQ →