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.
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.
| Goal | Target | Class | Target from |
|---|---|---|---|
| Bounced double strokes (diddles), 100-220 BPM | stated in words | mandatory | a working assumption |
| Buzz / press strokes | stated in words | secondary | a working assumption |
| Alternating sixteenths at 200 BPM | 6.7 strokes/s per stick | mandatory | derived |
| Strike timing precision | ≤ 4.3 ms 1-sigma onset scatter | mandatory | measured from human players |
| Hard-stroke envelope, tip speed | 14 m/s tip speed | aspirational | measured from human players |
| Matched loudness across the two notes of a double | stated in words | mandatory | a working assumption |
| Human-like stick heights | 3/6/9/12 in tip lift | mandatory | derived |
| Finger mechanism friction budget | ≤ 0.02 N·m | mandatory | derived |
| Every note in the score is played | 100 % of written notes struck | mandatory | derived |
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.