Modder turns Steam Controller trackpad haptics into stereo speakers with custom HID tool — Wired connection transmits 16-bit audio that sounds surprisingly full
Valve’s second-gen Steam Controller has been a major hit with the community thanks to the company’s open approach to its hardware. Modders have already used the haptic motors inside to move it across a desk and charge automatically, while others have built their own open-source pucks. Now, a new project from Pixel1011, called “Steam Haptics Player,” can turn these motors into a stereo speaker capable of playing music both wired and wirelessly.
For context, the Steam Controller doesn’t have a speaker; there are two linear actuators under each trackpad that vibrate to provide haptic feedback. Previous projects have leveraged these components to make the controller vibrate in a certain way. Since vibrations are the basis of sound, Valve itself built a secret easter egg into the controller that randomly makes it do a Wilhelm scream when dropped from certain heights.
Pixel 1011 discovered that the haptic motors inside can be targeted with low-level HID (Human Interface Device) feature commands using HIDAPI. As such, Steam Haptics Player takes an audio file, downsamples it through FFmpeg, splits it into chunks of a PCM stream, and sends those packets directly to the controller, bypassing high-level software like Steam Input. The controller’s firmware then feeds this raw data to the motors, at which point they vibrate to produce sound.
Because of the DIY nature of this process, bandwidth is an issue, especially wirelessly, since the puck isn’t designed to carry audio data over its radio signal. This means the audio has to be compressed, and there’s a limit to the overall quality the motors can transmit — 8-bit 8kHz (μ-law) over the puck and 16-bit 8kHz PCM over a wire.
Still, the 16-bit audio is enough to produce a surprisingly loud and balanced result that can deceive you as if it’s coming from a speaker. The video at the start features Pixel1011 playing the song “Want You Gone” from the end credits of Portal 2, and you can hear the quality for yourself. There’s a genuine low-end that you would never expect from a jerry-rigged setup like this, even if it’s sitting on top of a towel on a flat surface to give it its best chance.
The wireless audio quality is rough in comparison; it crackles and pops and even cuts off in between because of the bandwidth limitations. Pixel1011 is using 8-bit mu-law companding here, which actually offers dynamic range similar to 14-bit audio while keeping the byte footprint of an 8-bit stream. Even through this compression, the puck is struggling, but the fact that this is even possible is still very impressive, and perhaps there’s room for improvement down the line.
You can try Steam Haptics Player yourself on your own second-gen Steam Controller with pretty much any audio file in any format. Just download the archive from the GitHub repo, install FFmpeg (for transcoding, if you don’t have it already), and run the program via a PowerShell window in the original directory. Detailed steps are on the linked GitHub page, but we don’t know how this affects the controller’s battery life. Just don’t go all out with your Spotify playlist on these haptic motors.