Max Guitar Processor, Part 5
In this, the final episode of our guitar processing extravaganza, we are going to step away from making effects and focus on performance support. For a system as complicated as this, performance support means two things: patch storage and realtime control. Thus, we will learn to create a preset system and manipulate the various on-screen controls with an inexpensive MIDI footpedal system.
Tutorials in this series:
- <a href="http://cycling74.com/2008/07/28/max-5-guitar-processor-part-1/">Part 1</a>
- <a href="http://cycling74.com/2008/09/03/max-5-guitar-processor-part-2/">Part 2</a>
- <a href="http://cycling74.com/2008/11/25/max-5-guitar-processor-part-3/">Part 3</a>
- <a href="http://cycling74.com/2009/01/27/max-5-guitar-processor-part-4/">Part 4</a>
- <a href="http://cycling74.com/2009/01/29/max-5-guitar-processor-part-5/">Part 5</a>
The "pattr" objects manage the basics of preset handling for complex patches. This subsystem revolves around an object called pattr, which maintains the state of a control and allows it to be saved or remotely controlled. In our patch, we won't use the pattr object directly; rather, we will use the autopattr object (which creates a virtual pattr for all named objects) and the pattrstorage object (which provides for preset storage and remote dispatching).
In order to make autopattr work, we need to name all of the controls that we want maintained by the pattr system and we also must make sure that controls we want left "untouched" are unnamed. If you select a control and bring up the Object Inspector, you will see that I've named all of the appropriate controls, using a naming convention that identifies the module and control function for each UI element.
In addition to naming all of the controls (so they can be seen by autopattr), I've also added a textedit object that will be used as a preset name. This "no-nothing" field isn't connected to anything, but it is named – therefore acting as a place to put our patch name. Gotta have a patch name…
Once the autopattr object is in place, we also need to handle the selection and storage of preset data. That is what the pattrstorage object does. We can use a number box (in this case, with an up/down control) to select patch slots, and create messages that will store the current settings as a preset. We also need to add controls for saving and restoring the contents to a file. With remarkably little patching, we've created a complete device preset system.
Another important aspect to a usable live guitar rig is MIDI control – specifically, control from a MIDI pedal board. I happen to have a Behringer FCB1010 MIDI Foot Controller, and I've integrated its use into this custom patch. I've created a simple set of functions to create a list of MIDI inputs and to select a set of control functions, then manage the MIDI input within the subpatcher called midi_handler.
Incoming MIDI information is parsed (using the midiparse object), with program changes used to set the current preset slot. In addition, I use the program change command to act as a tap tempo button, since I have set the FCB1010 to produce the appropriate messages.
The most important section of this patch, however, is the routing of MIDI control messages. I have a subpatch that compares incoming MIDI CC messages with our selected controller numbers, and only outputs valid control messages. This is then sent to a gate object, which routes the value to the correct message box (and, in some cases, a scale object that scales the values). These message boxes prepend the pattr name of a control to the value, then send this set back to pattrstorage.
The result is an automatic update to the control, based on pattrstorage's message handling! This is a little known way of controlling pattr'd controls; we use pattrstorage as a "dispatcher" of messages, and let it update the control (and the current patch setting).
One thing to watch out for, though, is that these changes overwrite the current setting in the pattrstorage preset slot. So, if you load a preset file, change a setting with the foot pedal, then save the preset file, your changes will become the new setting for that control. It's a good idea to always review your current patch when working with pattrstorage, and to separate preset creation from live performance!
I hope that this series have been inspirational to you. The design and execution of the final patch is particular to my performance needs, but should be easy enough to modify into a system that will work for you. I've included a file (mypresets.xml) with a few of the preset I use with this rig – you may want to start your customization by making presets of your own. But best result would be for you to take this patch, rip it apart, and create your dream guitar processor!
Thanks for following the series, and feel free to email me with any questions or comments: <a href="mailto:email@example.com">firstname.lastname@example.org</a>. Hope to hear from you soon!</div>