ZPWNED: a DIY MIDI filter/router

As regular readers will know, I’m on a mission to remove my laptop computer and DAW from my performance setup. In this post, I’ll show how a bit of DIY electronics has helped me to take another step on that journey.

One of the most useful features of Ableton Live that (I suspect) many users take completely for granted is the hugely powerful MIDI management toolset that it places at the user’s disposal. Incoming MIDI notes can be routed to a plethora of instruments (both virtual and hardware) and, with the addition of a few devices, can be filtered, transposed and manipulated in a variety of ways. The availability of the MaxForLive programming extensions makes this even more powerful.

Almost a year ago, I made use of MaxForLive to create my ZPWNED plugin (pronounced “ZONED”, the name being a derivative of the term “pwned“). ZPWNED’s feature set was simple but very powerful:

  • Filter incoming MIDI to a set range of notes (a “zone”)
  • Optionally octave-shift the zone’s notes
  • Specify whether Pitch Bend, Mod Wheel, Sustain and Expression messages are allowed through to the instrument

I built this little piece of software because I got really frustrated with the menu/tiny screen/multiple buttons/impenetrable manual that I’d have to deal with to do this with my MIDI controller hardware. Although this was largely achievable with pre-existing Ableton devices, I also  found it convenient to have this in a single plugin with simple controls that covered just the specific features that I wanted. Being able to control which instruments reacted to pitch bend, mod wheel, expression and sustain across a stack of layered synths was especially useful.

The ZPWNED MaxForLive device

However… as is the case with any useful piece of software, I soon came to rely on it being there and it became a fundamental part of my performance setup. I’d inadvertently created a problem that I’d now need to solve in hardware, if I wanted to get rid of my laptop. Sometimes, yes, I can be too clever for my own good.

SO… how to resolve this? And how to get free of the rest of Ableton’s MIDI routing capabilities? And add more useful stuff at the same time?

I was pretty sure that a hardware solution could be built around the Arduino microcontroller and its very capable MIDI Library, however the challenge of how to make the control surface work gave me a headache for a long time. If I were to include switches for, say, 8 zones, each configurable for note range, output channel and filtering options I’d need either

  • A massive shed-load of buttons, knobs and LEDs in a huge enclosure
  • A menu-based control system with a LCD display – which I’d originally written the MaxForLive device to get away from

With no obvious resolution to this presenting itself, I wrote the whole thing off as “too hard for now” and shelved the concept.

And then one day, while I was breadboarding another MIDI-capable, Arduino-based project, the solution just presented itself. I noticed that the Arduino MIDI library had a callback function for handling System Exclusive (SysEx) messages; could I use that to configure the device and save myself a whole load of effort and knobs and switches?

This fundamental re-think proved to be the key that unlocked the project. I’m a software developer by trade, so putting together a Windows application to handle the device configuration and fire it out as a SysEx message was basic bread-and-and butter work. OK, it means that a laptop is still a necessary part of my studio, but once the device was configured, I wouldn’t necessarily have to wait for a computer to boot in order to use it. I decided that this was a compromise position that I could live with.

Up until now I’d been switching my MaxForLive ZPWNED devices on and off using the sliders on my Axiom MIDI keyboard and a bit of MIDI-mapping in Ableton. Why not just continue doing the same thing? The Axiom was going to be plugged into my hardware ZPWNED, after all…

It took just a couple of days to finalise the specification for the device and write the Windows software.

  • 8 zones. Each zone reads a specific range of notes from a specific MIDI input channel
  • Each zone can be switched on/off in real time by a specific MIDI CC on a specific MIDI input channel (which can be a different channel to the one it’s reading notes from)
  • Each zone can output to any combination of MIDI output channels
  • For each zone/output channel:
    • The note range can be shifted by +/- 5 octaves
    • Pitch bend can be allowed or filtered out
    • Mod wheel can be allowed or filtered out
    • Expression can be allowed or filtered out
    • Sustain can be allowed or filtered out
    • All other CC messages can be allowed or filtered out

I decided to expand on this by adding some configurable footswitches, too

  • 4 footswitches
  • Each footswitch can send a MIDI note or a MIDI CC message to a specific channel
  • Each footswitch works as a “toggle” – first press sends a MIDI NOTE ON or a specified CC value, second press sends MIDI NOTE OFF or another specified CC value

In just a few days, I’d taken the project from a cluttered nightmare of controls and menus to a simple box with a few connection jacks. In doing so, I was able to make the device do so much more than I’d originally intended, because the Arduino could be dedicated entirely to processing MIDI messages rather than reading interrupts from knobs and buttons.

A screenshot of the Editor software shows just how much flexibility and functionality is available to the user. I honestly can’t think of any way I could have done this purely in hardware.

The finished Zpwned Editor software for Windows

Having gotten the specification nailed down, writing the Arduino code was surprisingly straightforward. Coding and breadboarding took just a couple of evenings and before I knew it, I had a working prototype. I decided along the way to add a status LED (just so that I could visualise when a SysEx update had been successfully received) and to use a 5-pin DIN for the footswitch connection (1 channel for each switch + GND = 5 pins!) I also added a 3.5mm jack to allow me to daisy-chain 9V power out to my MIDI Thru box.

The schematic and board design came off the back of the breadboard work. The board build was easy (all stuff that I’ve done on other projects and very few components). I ordered an aluminium box from my local parts supplier and made the enclosure and panel label in the same way that I make my modular panels. The finished device looks great and performs extremely well.

So there you have it. Connect any number of MIDI-note-producing devices to one end, hang all of your MIDI instruments off the other, and make any part of any controller talk to any combination of the outputs. Dead useful, and around £25 to build. All of the necessary documentation and software to build this can be found below.

All I need to do now is build myself a nice 4-way footswitch. Oh, and order a whole bunch of new MIDI cables!


Build Documents

Schematic (Board)


Schematic (Panel)


Stripboard layout

Zpwned board

Stripboard layout (flipped)

Zpwned board flipped


Arduino Source Code

My panel design and cutting guide are available below as 600dpi PDF files.


Windows software

You’ll need Microsoft Windows and the .NET Framework to use this software. The .NET Framework is usually already in place on most current Windows PCs and laptops.

The editor application can be downloaded here. Just unzip the files to a folder on your machine and run the executable (.exe) file. It’ll create a folder in your Documents folder which it will use to store it’s data file and backups. The software automatically makes a backup every time you close it.

Your data file is in \Documents\ZpwnedEditor\Data\, your backups are in Documents\ZpwnedEditor\Data\Backups. If you need to restore a backup, just copy the backup file to the \Data\ folder and rename it to “Zpwned.data“.

The application automatically deletes backups that are more than 10 days old.

Please note that I can’t offer any support, assistance or training with this software – you’re pretty much on your own with this!

The editor software was developed in Microsoft C#.NET using Microsoft Visual Studio  Community Edition, which is available for free from Microsoft. I am making the source code freely available for anyone who wants to work with it, all that I ask is that you share your work with me and others. Download the complete source code here.

If you found this article useful…

…please consider donating a small amount to help me to create more projects and content like this!

Donate with PayPal



7 Comments Add yours

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s