Quickly switching MIDI Mappings
Hello,
I have developed a max for live device with 32 knobs :
I have a Midi controller with 16 physical knobs (Midi Fighter).
I would like the following to happen :
When I click on "One", I want my 16 physical knobs to be mapped on the first 16 knobs in the device.
When I click on "Two", I want my 16 physical knobs to be mapped on the last 16 knobs in the device.
"Activating" "One" and "Two" would be done with a keyboard shortcut so that it's quick and convenient to switch.
For example, hitting keyboard key "1" would map to the first 16 knobs, hitting keyboard key "2" would map to the last 16 knobs. This is the end result that I'm trying to achieve. I'm ok if there is a solution without a "live.tab" object like in my screenshot. This is for illustration purpose.
I am a developer so I'm looking for a solution that I can code myself instead of buying a mapping software.
I looked at ableton remote scripting but there is no official documentation and I couldn't find what I was looking for in "hacker" blogs. I'm kind of hopping I can achieve this behavior within max, with the visual editor or in javascript, instead of fiddling with closed-source python code.
Thanks for your help.
i don't think it's possible to do this using abletons manual midi mapping, but it's possible using the LOM
Thanks for your help.
Would you elaborate how one would use the LOM to implement such a feature?
not sure this is the best way but I've done something similar by using Max in parallel to Ableton Live:
- 1 in Max, get the notein from your midi fighter
- 2 add a menu that let's you increment the midi pitch of these incoming values, let's say +0, +16, +32...
- 3 recombine pitches and velocities out to a noteout "from Max 1"
- 4 in Ableton make sure "from Max 1" is enabled as an input in the Midi preferences
- 5 assign the Midi mappings to your M4L device
and if you want to make things super slick, you can use the shell object to automatically open the max patch from within your Ableton project, and the thispatcher object to make it a floating window that's always on top
Thanks for the help.
User "chapelier fou" gave a good simple solution without using a separate instance of max : https://forum.ableton.com/viewtopic.php?f=1&t=236041&p=1764110#p1764110
great, glad you figured it out!
It's working great so far.
The only remaining issue is that my "physical knobs" (the first 16 knobs that I use to conditionally control the other 32 "virtual ones") are automated when I record automation.
I need a way either to disable automation on those knobs, which I didn't find without disabling MIDI mapping : https://cycling74.com/forums/parameter-mappable-but-not-stored-and-not-automatable
Or a way to delete automation after recording stops, which I did not find either : https://cycling74.com/forums/is-it-possible-to-trigger-%22delete-automation%22-in-max-for-live
If you know of any tricks..
sorry I've never heard of a mappable parameter that is not stored as an automation, but I could be wrong!
I guess you wouldn't have this issue running Max as a separate instance
good luck!
bad cop´s intervention, part 7351.
or dont use the new midi mapping options at all and write your own "midi mapping" code. custom code will always look like you need it to be.
dont use the new midi mapping options
what are you referring to with the "new midi mapping options"?
write your own "midi mapping" code. custom code
are you referring to the python files control surface vendors provide or is this something I don't know? I'm interested.
no. i mean that assigning controller numbers to GUI elements using regular max objects would have made switching them to another hardware controller - or the other way round - really easy.
it was only an opinion-driven comment against misleading features such as midi mapping via contextmenu, which is relatively new in max. while it can be great for a live coding session, i would not recommend to use that when building software for re-use.
requires to patch 3 objects and you dont even need to open the inspector or use the right mouse button.
#P window setfont "Sans Serif" 9.;
#P window linecount 1;
#P newex 343 317 130 9109513 route 1 2 3 4;
#P newex 103 320 130 9109513 route 1 2 3 4;
#P newex 102 206 50 9109513 t 2;
#P newex 27 205 50 9109513 t 1;
#P newex 215 253 50 9109513 gate 2;
#P user dial 548 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 492 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 436 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 380 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 288 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 232 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 176 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P user dial 120 388 40 40 128 1 0 0 159 270 1 1. 170 170 170 221 221 221 120 120 120 225 225 225 0 0 0 0 0 0;
#P button 93 112 35 0;
#P comment 96 95 42 9109513 two;
#P button 26 112 35 0;
#P newex 207 179 50 9109513 zl rev;
#P newex 204 144 50 9109513 pack 0 0;
#P newex 206 95 50 9109513 ctlin;
#P comment 29 95 42 9109513 one;
#P connect 19 3 14 0;
#P connect 19 2 13 0;
#P connect 19 1 12 0;
#P connect 19 0 11 0;
#P connect 18 3 10 0;
#P connect 18 2 9 0;
#P connect 18 1 8 0;
#P connect 18 0 7 0;
#P connect 15 1 19 0;
#P connect 15 0 18 0;
#P connect 3 0 15 1;
#P connect 16 0 15 0;
#P connect 17 0 15 0;
#P connect 6 0 17 0;
#P connect 4 0 16 0;
#P connect 2 0 3 0;
#P connect 1 0 2 0;
#P connect 1 1 2 1;
#P window clipboard copycount 20;
If I'm not mistaken, using "ctlin" means that my controller needs to be set-up and controlled by Max and not by Ableton (ie. input & output "Remote" must be disabled in Ableton), right?
Except for that bit, it does look like it would solve the issues I'm facing.