Quick Links
GitHub: featherbear/bitfocus-companion-module-presonus-studiolive-iii
Research, API, Documentation, Examples: featherbear/presonus-studiolive-api
PreSonus StudioLive III
Around two years ago, my church bought a PreSonus StudioLive 16 Series III and StudioLive 24R Series III console.
After getting confident with knowing how to operate it, I wanted to automate some of its functionality - for example unmuting a channel when a video switcher changes to a specific source. However PreSonus offered no sort of third-party remote control integration, other than its Universal Control / UC Surface application.
Bummer.
Thankfully though, since they had created their own remote control application that works both on a computer, as well as on a phone or tablet - surely it must be possible to write our own software to control it!
So that’s what I did a year and a half ago.
I set out to analyse the network packets coming out of, and into my Windows laptop running Universal Control.
PreSonus StudioLive III API
The remote protocol primarily uses TCP packets for control, with UDP packets sent for device announcement (broadcast) as well as metering data.
I won’t bore you about that here, though if you are interested, you can check out the details
Originally written in Python, I eventually decided to turn it into a Node.js library, as thinking into the future I would probably have some sort of web interface to interact with the library. Having partially reverse engineered the protocol, I was able to get my code to connect to the console, and receive metering data as well as control events.
Cool. And then I abandoned the project.
PreSonus StudioLive III API - Again
Fast-forwards to recently, I actually realised that there were people who had taken an interest in my API! [Source 1] [Source 2] [Source 3] [Source 4].
Given that the consoles were not being used, since COVID-19 lockdowns were a thing, I decided to once again investigate the remote control protocol.
I reworked my code, and also threw in some TypeScript magic to make integrating my API much easier.
I also implemented channel muting1 - which will probably the most used function for such an API. I don’t envision researching to reverse engineering the entire protocol, rather to just achieve the functionality I desire.
I’ve centralised all my research, documentation and examples at this site, do check it out!
Bitfocus Companion
If you’re uncultured/have professional gear/don’t care/all of the mentioned, you probably haven’t heard of Bitfocus Companion. It’s a free (open source) piece of software that allows you to extend the functionality of the Elgato Streamdeck hardware (a glorified numpad) - and is tailored towards production and broadcast environments.
Since I own one, and some people asked for it too, I decided to create an integration with my API.
Note: You don’t need to own a Streamdeck in order to use Bitfocus Companion, it has a web and mobile interface too!
GitHub: featherbear/bitfocus-companion-module-presonus-studiolive-iii
It seems to work pretty well to mute and unmute channels, so I’m quite pleased with how that turned out! I’m yet to figure out how to get the initial channel mute state however, which I think would be awesome if I could figure that out.
I actually discovered how to mute channels since the very start of my research. But I had only implemented it in the original Python library. ↩︎