Controling Logic Synths knobs with Max/MSP
I got Logic Pro 8, but I’m unable to control Logic with Max/MSP. I want to send control messages to, lets say, an EFM1 Logic software instrument, controling its knobs like FM,modulation,etc. in real time. Anyone knows how to configure Logic in order to do this?
Theres a couple ways to do this. One is to laboriously program some transformer object in the environment and wire them between the output off the Max Midi Input and the audio track containing the instrument you want to control. This involves transforming the midi input data into Logics metadata format. This is the way I used to do this sort of thing, and it is very tedious.
The easier way is to take advantage of Logic’s control surface learning functions.
Set up a max patch that will send midi controller data with the controller and channel numbers you need. Have your instrument set up in logic and have the plugin window open.
Now, go to Logic Pro -> Preferences -> Control Surfaces -> Controller Assignments. Make sure it is in expert view.
In the bottom right hand corner of the assignments window is a button that says ‘learn mode’. Turn learn mode on, and fiddle with the knob of the parameter you want to control. It should show up in the assignment window. Now, just send some midi ctrl information from Max and logic will assign that port/control #/channel # to the plugin parameter you selected. To set another controller, click on its knob and send a different midi controller message.
If I just send controller data from a number box as in the example patch below, everything typically comes out okay. I’ve found that if I try setting everything up using data from a midi LFO or something like that, logic might set some of the Value parameters incorrectly. If for some reason your controller data doesn’t get the effect you want (for example values from 0 – 127 from max only work as an off/on switch on the plugin parameter) try messing with the Format and Mode options in the plugin assignments. Format: Unsigned and Mode:Scaled (or direct) tends to translate the midi data from Max linearly.
So I recommend using a number box to send data to set up everything, but after you have all your parameters set you should be able to use any automated midi generators in max and it will work fine. You can turn Learn Mode off and send data to logic and see if it responds the way you expected.
The main problem with setting up max midi controllers this way is that Logics controller assigments are global. They are the same from project to project. If you want a different set up in a different project, you have to erase the previous contoller assigments and set up new ones. If you use transform objects, it is saved within the project.
If you really want to know more about Logic’s metadata, try swiftkick.com. Under downloads -> Logic Environments -> Swiftkick -> Environment Toolkit. It has a pdf with everything you ever wanted to know about manipulating Logic’s environment. The pdf is old (from the 4.0 days) but the environment still works the same way.
Here is a very simple example patch of what I would use to send midi data for the set up.
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P comment 22 34 37 196617 value;
#P comment 87 34 37 196617 ctrl #;
#P hidden newex 220 56 63 196617 loadmess 1;
#P number 147 49 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 85 49 35 9 0 0 0 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P number 23 49 35 9 0 127 3 3 0 0 0 221 221 221 222 222 222 0 0 0;
#P newex 23 73 134 196617 pack 0 1 1;
#P newex 23 97 85 196617 ctlout;
#P comment 147 34 53 196617 channel #;
#P hidden connect 6 0 4 0;
#P hidden connect 6 0 5 0;
#P connect 5 0 2 2;
#P connect 4 0 2 1;
#P connect 2 0 1 0;
#P connect 3 0 2 0;
#P window clipboard copycount 9;
Quote: Nick Inhofe wrote on Tue, 11 December 2007 11:57
> If I just send controller data from a number box as in the example patch below, everything typically comes out okay. I’ve found that if I try setting everything up using data from a midi LFO or something like that, logic might set some of the Value parameters incorrectly.
I had been trying to use dials, which you would think just send int values 0-127, but Logic gets this wrong every time and sets it us as 2′s complement format and it doesn’t work at all. Stupid…
Number boxes seem to work consistently. Thanks for the tip, Nick! I think there will be a little less swearing now.
> The main problem with setting up max midi controllers this way is that Logics controller assigments are global. If you want a different set up in a different project, you have to erase the previous contoller assigments and set up new ones.
This is a huge problem for me. I guess I should look into using the environment, but as you said it is very tedious. I desperately need a controller assignment import/export feature. In the meantime, I am trying to use a different combination of channel and virtual MIDI ports ("from Max/MSP 1" vs "from Max/MSP 2") for each project’s controller setup. Not ideal, but at least I don’t have to setup everything again each time I switch projects.
Another gotcha is Logic likes to use unreasonable channel strip settings for the controller assignment. Mine often get set to "Selected Track" which is not what I want because I have many software instruments and I want to control them all from Max simultaneously. But with "Selected Track" only the software instrument whose track is highlighted will respond to its controller assignment. Depending on what you are trying to do, this might be appropriate. But I usually change this setting to "index" or "software instrument" and set the value to the track number. Of course, this means the assignment will stop functioning if I rearrange the track ordering (probably the Environment could fix this).
Maybe these features work well with control surfaces, but when trying to do custom controller setups with Max, Logic is extremely frustrating IMO :(
I forgot to mention that sending a fast stream of MIDI messages (including non-CC data like notes) while Logic is in Learn Mode is a great way to crash Logic. Be careful…
Thanks for this info, it was very helpful. Do you happen to know if there is a way to control a Logic audio track’s inputs from Max?
For instance, if I wanted to change a Logic audio track’s inputs from 1 & 2 to 3 & 4 using a max patch, is this possible? The logic manual vaguely made it seem like it could be done, but there wasn’t much explanation.
Also, how do I make the ctlout object control the volume of a specific logic audio track? I tried the learn mode in the controller assignments box as mentioned, but my max patch only seems to be controlling whichever logic track is selected rather than a specific one.