Controlling Max/MSP with a Wireless Xbox One Controller
I find Max/MSP to be a unique and interesting software suite, with great potential for rich and interactive multimedia projects. It displays great potential, but that which is seemingly limited by its lack of widespread use and community. Iโm not entirely confident that this really is the case โ and sure, the Cycling74 Forumsare about as active as I could reasonably expect โ but I often seem to run into issues or ideas that arenโt widely experienced.
One of these issues is finding pre-made patches and components. It is common to find a forum post describing a synthesizer or audio effect, but these posts are often over 10 years old and pertain to older versions of the software. Not to mention the chances of finding a link that actually lead to a file download, rather than a 404 or Mediafire account termination, can be slim. I find it incredibly useful to load someoneโs patch to see what creative ideas they have implemented โ something that is particularly helpful for this type of software.
By publishing this, I hope to alleviate some of these issues for those who wish to work with controller input in Max. This post details both the technical aspects of the input handling, as well as how to use this patch in a greater project.
The primary use for Max that appeals to me is interactive, real-time control. Its audio and visual tools are plentiful, but the real magic is found in combination with logic and data processing. You can create an interactive experience โ where you are playing with a dynamic musical instrument, or a visual/spatial playground where your movements become manipulated geometry โ but where Max shines is its capacity to combine these types of experiences.
I have found that game controllers are very effective devices for interfacing with these programs. They’re already ergonomically designed for familiar input without needing to glance at the controls. Wireless connectivity allows for greater immersion and flexibility, such as within VR applications. The drivers are also readily available for almost any host system and input device.
For example, with the Wireless Xbox One controller, the binary input methods include:
four generic buttons (A, B, X, Y)
two shoulder buttons (L1, R1)
directional pad (N, S, E, W directions)
select and start buttons
And the dynamic input methods include:
two analog triggers (L2, R2)
two analog sticks
In total, this controller gives you fourteen binary switches, two X/Y coordinate pairs (limited within a radius), and two linear pressure-sensitive values. This is plenty of input for controlling some complex patches, especially so if creative interface design is taken into consideration.
It is also very convenient that Microsoft decided to use Bluetooth as the connectivity protocol for the Xbox One S controllers, rather than a more proprietary solution as was true with the Xbox 360. I have been able to use wireless Xbox 360 controllers with Max in the past, but not requiring an adapter is a definite advantage.
The patcher is based on a post by vincentrieuf in the Cycling 74 forums. I wasn’t able to use it immediately, as my button presses wouldn’t register correctly, but it is simple enough to modify it into something useful for my purposes.
My revised patch is designed in such a way that it can be adapted to another arbitrary controller, by changing the ‘route’ codes to the values appropriate to a given controller. When the ‘hi’ object is given a valid device as input, a bubble will appear within the patch, and the same output will be logged in the Max console.
Something that I found to be productive when creating this patch is the ability to create ‘proxy’ patch cords in Max. That is, instead of linking two objects as you normally would by connecting patch cords, you create ‘send‘ and ‘receive‘ objects. This means that while the total object count of the patch might be higher than necessary, the amount of headache is substantially reduced once your projects become more complex.
2 Hz sinusoidal oscillator connected to a scope with patch cords2 Hz sinusoidal oscillator connected to a scope with ‘r’ and ‘s’ objects
The patcher additionally contains descriptions next to the appropriate object groups for the given input method.
A benefit of this patcher is its ability to quickly call a given input, by creating an ‘r’ object with the corresponding input code.
These codes are given below. The code column is how the input is identified; to use it, create an ‘r’ object with the code as the first and only argument.
Input Code Type
dpad N dp_n bang
dpad E dp_e bang
dpad S dp_s bang
dpad W dp_w bang
dpad NE dp_ne bang
dpad SE dp_se bang
dpad SW dp_sw bang
dpad NW dp_nw bang
left analog X ls_x float, 0-65535
left analog Y ls_y float, 0-65535
right analog X rs_x float, 0-65535
right analog Y rs_y float, 0-65535
left bumper l_bm bang
right bumper r_bm bang
bumper reset bm_r bang, reset
left trigger l_t float, 0-1023
right trigger r_t float, 0-1023
button A b_a bang
button B b_b bang
button X b_x bang
button Y b_y bang
button reset b_r bang, reset
button select select bang
button start start bang
button ss reset ss_r bang, reset
This organizational structure allows the input-handling components of a given project to be mostly hidden. Max allows the creation of subpatchers, or encapsulations. This is helpful, as it allows the controller input logic to be hidden.
I hope this is a useful tool for some creative Max projects, and it certainly will be for mine going forward.
I can’t download the file, can you upload it again, please?
Sorry about that. I’ve updated the blog post to include up-to-date links including an archive.org mirror. Here’s a link to the mirror: https://archive.org/details/xbox-one-controller-input.maxpat
link is not working,
thanks!
Good day, well put together web site you possess here.
Awesome Web site, Continue the wonderful work. Thanks a lot.