Back in the summer, I posted about a project I had recently finished, which involved sending HTTP requests to a server that would then relay a MIDI output message based on the request that was sent.
We’ve been using that software (dubbed midi-relay) since then to be able to control our Chroma-Q Vista lighting desks remotely across vlans by using stream decks running Companion. It works pretty well, especially since the midi-relay software is configured to run directly on the lighting consoles upon startup. We have even set up a few crontab entries to send CURL commands to the light desks to turn them on at certain times when we don’t want to be on-site just to press a button.
In anticipation of completing my most recent project, “LiveCaption“, which takes audio and transcribes it to text in real-time, I started working on midi-relay 2.0: listening to MIDI input and using that to trigger a response or action.

In both auditoriums at my church, we have Avid S6L audio consoles. These consoles can do a lot, and like most consoles, they have GPIO pinouts to allow you to trigger things remotely, whether as an action originating from the sound console, or externally that then triggers something on the console like recalling a snapshot, muting an input, etc.


I started looking at the possibility of using the GPO pins on the console to trigger an external action like sending an HTTP request to Ross Dashboard, Companion, etc. However, there are only 8 GPO pins on this audio board, so I knew that could be a limiting factor down the road in terms of the number of possible triggers I could have.
The S6L also has MIDI In and Out, and through the Events section of the console, it can be used as either a trigger (MIDI In) or an action (MIDI Out) on just about anything.

We already have a snapshot that we load when we go to the sermon/message that mutes things, sets up aux sends, etc. and I wanted to be able to use that snapshot event to automatically start the captioning service via the REST API I had already built into LiveCaption.
In the previous version, midi-relay could only send Note On/Off messages and the custom MSC (MIDI Show Control) message type I had written just for controlling our Vista lighting consoles. With version 2.0, midi-relay can now send MIDI out of all of the channel voice MIDI message types:
- Note On / Note Off
- Polyphonic Aftertouch
- Control Change
- Program Change
- Pitch Bend
- Channel Pressure / Aftertouch
It can also send out:
- MSC (MIDI Show Control), which is actually a type of SysEx message
- Raw SysEx messages, formatted in either decimal or hexadecimal
And, midi-relay can now listen for all of those channel voice and SysEx messages and use it to trigger one of the following:
- HTTP GET/POST (with JSON data if needed)
- AppleScript (if running midi-relay on MacOS)
- Shell Script (for all OS’s)
There are a few software and hardware products out there that can do similar things, like the BomeBox, but I wanted to build something less-expensive and something that could run on a Raspberry Pi, which is exactly how we’ve deployed midi-relay in this case.

Now we can easily and automatically trigger the caption service to start and stop listening just by running the snapshots on the audio console that we were already doing during that transition in the service. This makes it easier for our volunteers and they don’t really have to learn a new thing.
Here’s a video of it in action:
If you’d like to check out version 2.0 of midi-relay, you can download both the source code and binaries from GitHub: https://github.com/josephdadams/midi-relay
The documentation is pretty thorough if you want to use the API to send relay messages or set up new triggers, but you can also use the new Settings page running on the server to do all that and more.

And if you’re a Companion user for your stream deck, I updated the module for Companion to support the new channel voice MIDI relay messages as well! You’ll need to download an early alpha release of Companion 2.0 to be able try that out. Search for “Tech Ministry MIDI Relay” in Companion.
Here’s a list of the Raspberry Pi parts I used, off Amazon:
- Raspberry Pi 4 Model B (2GB) $48
https://www.amazon.com/gp/product/B07TD42S27 - CanaKit Raspberry Pi 4 Power Supply (USB-C) $10
https://www.amazon.com/gp/product/B07TYQRXTK - MazerPi Raspberry Pi 4 Case $9
https://www.amazon.com/gp/product/B07W3ZMVP1 - USB to MIDI cable $17
https://www.amazon.com/gp/product/B07FTJXFLT
I hope this is helpful to you and your projects! If you need any help implementing along the way, or have ideas for improvement, don’t hesitate to reach out!
That looks so cool. I’m still a Raspberry Pi n00b for the most part, but I hope to reach the point where I can do things like that.
LikeLike
Thanks! The biggest motivating factor for me is having a problem I need to solve. Now, the real question is, if I wasn’t looking to solve them, would they be problems?
LikeLike
I am using Tally Arbiter on a Raspberry Pi 4 together with 3 x M5StickC’s for live streaming our church meetings. I love it – thanks so much for producing this! I am building a roadcase and want to make the PI startup and run headless. Can you give me any advice on how I can automate the three steps I currently have to do each time at startup – 1) login 2) change directory 3) start node index.js
Sorry I am not very code savvy! I would be much obliged 🙂
LikeLike
Hey John! I’m so glad my software is valuable to you. I wasn’t sure if you needed midi-relay instructions or Tally Arbiter instructions since you commented on a midi relay post. But both of them can work with pm2 on a raspberry pi and I have instructions posted in each repository on Github that walk you through that process. Try that and if you get stuck, reach out to me via the contact form and we can get it figured out!
LikeLike
Hi. I’m trying to set up MIDI control for a Roland V-1HD through MIDI relay, I can get the Basic CC/PC commands working, but i’m having trouble with the SysEx messages.
There is a short tutorial that i have linked below that shows the examples of the CC/PC and SysEx commands, though the provided SysEx commands do not work for me. Do you have any ideas. I’m fairly sure something is wrong with my formatting, but I cant find any examples of a SysEx message
https://rolandus.zendesk.com/hc/en-us/articles/360031884432-V-1HD-How-to-Control-Your-Switcher-Using-MIDI-Commands
LikeLike
Try typing it in either decimal or hexadecimal with each value separated by commas.
LikeLike
Did that work?
LikeLike
Hi, I managed to get it to work with decimal. Hex was disagreeing.
I’m now starting to work on a derivative of the midi relay companion app that will let me have full control over the V-1HD with state feedback thanks to this. Though even without the state feedback. midi relay has helped with simplifying the process of streaming our church services. So thanks for your work.
LikeLiked by 1 person
Hi, I managed to get it to work with decimal. Hex was disagreeing.
I’m now starting to work on a derivative of the midi relay companion app that will let me have full control over the V-1HD with state feedback thanks to this. Though even without the state feedback. midi relay has helped with simplifying the process of streaming our church services. So thanks for your work.
LikeLike