Drumline Robot

How the robot plays a double stroke

On a drumline, a fast double isn't two strokes. You throw the stick once, let it bounce off the head, and use your fingers to bring it back down for the second note. That's the motion I set out to copy, on two hands.

The hardware

Wrists

Two brushless hub motors from used hoverboards, one per hand, driven by a single ODrive 3.6 on a fork of its 0.5.6 firmware.

Fingers

A GM4108 gimbal motor at each stick's pivot, on a SimpleFOC Mini driver. It holds the stick like a spring, and the controller picks the stiffness for every stroke, from 0.5 to 16 N·m/rad.

Brake

A servo latch at each pivot that can hold the stick in line while the finger motor is off.

Controller

A Teensy 4.1 runs the stroke controller and a planner that turns a score into launch times, heights and stiffnesses. The ODrive runs the wrist motors.

Stick

A marching snare stick, 88.4 g and 429 mm.

Simulation

A MuJoCo model calibrated from bench measurements, plus a build of the robot's own stroke code that runs on a laptop and plays every piece against the bench's measured behaviour before anything moves.

The grip spring

The finger motor holds the stick against a spring it renders in software, τ = −kθ. When the stick bounces off the head, it swings back on that spring and returns after half a period, π√(J/k), where J is the stick's inertia about the grip. A stiffer grip brings the second note back sooner, so the stiffness works as a tempo control, and the energy for the second note comes from the bounce.

A spring by itself didn't work. These three runs on the bench show why.

Three measured strokes at the same grip stiffness. Wrist driving through the head: seven contacts in 250 ms, a buzz. Wrist arrested at contact: four evenly spaced bounces, still going. Arrest then catch: exactly two contacts, 104.5 ms apart.
Three strokes on the bench at the same grip stiffness, k = 1 N·m/rad, 2 September 2026. The line is the stick's angle in the grip from the finger motor's encoder, tip up. The ticks are hits. Left: the wrist keeps pushing, so the stick gets shoved back and buzzes. Middle: the wrist stops at the hit and the spring bounces the stick about every 100 ms. Right: the wrist stops at the hit and lifts the stick away after the second one, which leaves two notes.

So I redesigned the stroke controller around what the bench showed. The wrist stops the moment the stick hits (the arrest). The grip spring brings the stick back for the second note (the bounce). On the last note I want, the grip holds and the wrist lifts the stick away (the catch). At k = 4 the same controller played its two notes 59.1 ms apart, a sixteenth-note double at 254 BPM. The simple model predicts about 120 ms at k = 1, but the stick came back in 104.5, so the bench now calibrates that gap for each hand.

Slow doubles needed something else. The softest spring bounces back in about 115 ms on the right hand and 140 on the left, and anything slower would land early. A drummer playing slow doubles lifts the stick for the second note instead of waiting for the bounce, so the robot does too. After the first note the grip holds the stick in line, and the wrist lifts it and brings it down on the beat. The first pulled double on hardware was written 125.0 ms apart and landed 123.6 ms apart.

Prior work

Hajian and colleagues showed in 1997 that drummers set the bounce rate with their grip, which is how a roll can go faster than the arm could on its own. Most double-stroke robots since then add hardware for the second note: pneumatics, variable-stiffness actuators or a second motor. The closest to mine is Yang and colleagues' Drumming Arm (2021), which also puts a back-drivable motor at the grip under impedance control. None of that work reports how loud the second note is compared with the first. That's the next thing I need to measure.

Recordings

  • A double-stroke exercise at 260 BPM

    Both hands, ending on a rim shot. 49 of 49 notes, onset scatter 3.3 ms.

  • A double-stroke roll from 120 to 260 BPM

    The roll speeds up while the grip stiffens to keep each double on the beat. 49 of 49 notes, onset scatter 4.5 ms. Its first double is the first pulled double played on hardware.

Recorded at the bench on 5 October 2026 with a laptop microphone next to the drum.

Requirements

These are the project's requirements, read from the repository when this page was built. Where a target has a number, the last column says where the number came from.

GoalTargetClassTarget from
Bounced double strokes (diddles), 100-220 BPMstated in wordsmandatorya working assumption
Buzz / press strokesstated in wordssecondarya working assumption
Alternating sixteenths at 200 BPM6.7 strokes/s per stickmandatoryderived
Strike timing precision≤ 4.3 ms 1-sigma onset scattermandatorymeasured from human players
Hard-stroke envelope, tip speed14 m/s tip speedaspirationalmeasured from human players
Matched loudness across the two notes of a doublestated in wordsmandatorya working assumption
Human-like stick heights3/6/9/12 in tip liftmandatoryderived
Finger mechanism friction budget≤ 0.02 N·mmandatoryderived
Every note in the score is played100 % of written notes struckmandatoryderived

What doesn't work yet

  • No listening test. Nobody has compared the robot's doubles with a drummer's by ear in a controlled test, and I haven't yet measured how loud the second note is against the first next to a human recording.
  • Timing on long passages. The double-stroke exercise is inside the 4.3 ms target. The accelerating roll (4.5 ms) and a full drumline cadence (6.4 ms) aren't yet.
  • Buzz strokes. The controller has them planned, but the robot hasn't played one yet.
  • One drum. Snare first. The tenor arm only exists in simulation, and the bass drums and cymbals are still on paper.