Does anyone know how to make a Max Patch that will intercept MIDI between Ableton and the APC40, but still allows the handshake through so that the default behaviour of the APC40 is available if nothing is actually changed?
I’ve been trying to do this all morning: and while I can get standard MIDI to/from the APC40 through Max, I can’t get all the automatic functionality to work.
I dont think you are going to be able to intercept the midi from the APC to Live. Here are the issues and resolutions I have run into when building my control interface patch in Max:
The APC itself functions pretty similarly when it is synced to control live and and not (im talking about actually having it setup as a control surface in Live’s preferences). Unfortunately when it is in Control Surface setup, I havent found a way to change any of the assignments of knobs, faders, etc.
My solution to this problem is to build the entire control patch in Max, and CC assign the parameters I want to keep with ctlout (which are track faders, solo..) I dont want to use clip triggering so I havent ported the grid buttons to clips, although im sure it would be fairly simple.
Its easy to setup because all the buttons are Midi notes, and the knobs and faders are CC. If you do a search there was a thread not long ago with much more info on the note mappings and such.
Hmm. It’s definitely possible: I’ve got it working in Bome’s with no problen, but I prefer Max.
Essentially, you route the APC’s MIDI to Bome, then inside Bome you route APC MIDI-in to Bome MIDI-out, and vice-versa.
Then you select Bome’s MIDI translator In/Out as an APC40 control surface inside Ableton: and it successfully performs the handshake through Bomes and has full functionality.
The idea then is to intercept specific MIDI notes and use them to toggle MIDI translation presets within Max: like the NativeControl folks do.
Could you not change the assignment of the controls inside Max, by writing two-way mappings? E.g mapping 1/17 to 9/17?
I’ve looked through the MIDI schema for the APC, and it looks like channels >= 9 are free for the taking.
This patch should do the trick.
All the ‘control’ communication happens via midi notes and cc, so can be extracted from a midiin object via midiparse for you to store/re-route as you see fit.
The handshake communication is sent via sysex so can be sent directly through the patch unchanged.
Obviously you’ll need to load the patch/set the midi IO ports appropriately before selecting the apc40 as a control surface in live.
----------begin_max5_patcher---------- 1255.3oc6Z00aaaCE8YWf9efvO6VnKoHoTeqnEaH.qXCKCnXXXnPQlNVKVRF RxcIqX+2G+PVNo0VlxVzxNqODIXdoDu7ny8CcT9xKewnw2jeunbL5Mn+.MZz WjiLROlZjQqGXz3zn6iWDUpm3337zTQV03I0FqD2WoM7SIeVf9sbza+k2460 XdVdVUVTpPOk2VjDsnwTxT8f427WuhPaFMaUZR1BQkd0f0itrPTJW0npj7rO UHhqLNMmxds2DDAqN5Ue.8mOdwKS9G8hCp4rYMxWUsdQZFdYTU77jra20BDx UGw5kPeI+6Keg5r7zjiG+z3lB.U.YWwO+8feGORfC03KIz8HwGRllbnLIf6b jfGn4D3.MTXN5Jn35GJE2iREkkQ2JJQyhhSVHiBDn4QYSKmGc2FlxhjLQb9p L8Eh6HpE3dTC6q.JfQzm.plM46PFzOTjmdHASPnyACJUG.EDXvBVOPgVIQhU 1rSqdX45b9axTJyuNKQe+GuLunZavB1a+4nk2iOklOUb.vEoE3hEZPHZngBA avq0Wk4No1alKYbhhWfFq+ayzRpDo0adIIItHuLeVE55GxplKT9XgZ9STG1X 8GuF8wnOKphtYg.c8GMytYd+7pJUtpOb06uB8642IdCBAsYD2lQRaF8ayHsM ir1LxayXv3ifRlI9aIw4aiNSkQmIYyx6XbIF1NAD2MhFXAQinYXTrE7LW.PK xildST1scEfv8RhKa.HOcxblmE.jdi3hj7+pnPtXBzqPyDBIdEeGZtnPfhJQ SkAyEho8RsQLw4kC7WS6vl7ad8Psw1B9VFUT10ph39oESdaUEM8Ff8znA3YC 6pIG+jlT9e6IGAiRmoqfH08sVXZHk.5NL76itS2EFTpZNMIqqX.y8Yo3ZpCv Mowsscgy5tu3CV2W9glzRfee180UYlFz2diSayJtUqjVs52pUZqVYsZk2pUG 1+TWC6BbdXWc9avD84iceXWe2gYny6vrNXhGbI1fIwy8bHLcScqgs+x0xPcH RHvNL8LITirHFPvEBZRvviDuhyeNHd0AJdLwqd2ycEXiMx7.rfSplWGjtotW A4PMyqtYBO5kflWvgp40Nnb3v.iH5rigx0VyZXroiel+2kJ6+uRkA6Spr8vO YdGC+DrfeRXWhM.A3CrTiQPw5StDW8BOmDlKVtuJxWT5Dg4BOAeySCW0TEm5 eFJKG24pxUqMI.OWEki4bdDfwl15wmoZxQc960g8p0Ff8rQRN+ASQNyqGBP3 2Ej6xUPNhyi4LYtAN8RUNNmqFmIPJfbQ1Kp60hyHR4o6S8tLJSr8Xk8sY6Ps XymFRuo7g5V5nGUs3c61G3qK3yLJS4u82VnCeX4Zkm36c2Zt659w+5+gP02W kguBCJyWUDu9Q+Z4gQOxOkM6Wkjo2bOZVJQ1QvlYMOY5TQ1S1Ix7EKyk4hZp Ju6GMV6b5kc+NG+oy5T4b7mhI6v4BNmcNVWcNJG+ZpJTTyvY7vle0OtcfUOv 8GFLkYkyQ6pyUih3PcgMZXPyu5G2Frxs8FFLEakyACiy4YUPTmefykuPkCef CV41cNzm3oooDiZB.AZ9U+30VwDfggI.VECACSLD0FeqyOtw.1kOtI13zCSg ceaBe5bPu5qmoqUZ9HZ.t4WmNmlLLoQs4Q8vTR2tRiGcuupAjm9O.Y5tC0. -----------end_max5_patcher-----------
how can you re-route messages going to Live from this? Whenever the APC is setup as a control surface, the messages seem to go directly from the APC to Live without any way to control which ones get through. Your patch seems to just display what is coming from the APC which is done purely from a Midiin object.
Printing the sysex information sent to the APC from Live when connecting it as a control surface seems useless since there are no lists, only a lot of numbers sent individually.
Is there anything non-obvious about what I have to do to get the MIDI I/O ports configured correctly?
The crux of this is that rather than Live communicating to/from the APC directly you are doing it THROUGH a max patch. As an Os X user I would do the following:
In Live select "APC40" as a control surface with ‘input’ as "from MaxMSP 1" and ‘output’ as "to MaxMSP 1"
Then in the Max patch on the ‘Live to APC 40′ side:
– select "to MaxMSP 1" as the input
– select "APC40" as the midi output
In the Max patch on the ‘APC40 to Live’ side:
– select "APC40" as the input
– select "from MaxMSP 1" as the output
The patch will now pass all sysex data used by Live/APC40 for the handshake. Any ‘control’ data (midinotes/cc etc) can be intercepted via the midiparse objects for you to use as you wish. You need to connect up the midiin/midiout objects on each side to restore ‘normal’ operation….
If you are a windows user you will have to use something like MidiOx to perform the inter-application midi routing.
Hope that helps.
I got it now, thanks for clarifying that. Now lets see if I can de-code some of the sysex messages to build my own APC templates.
Awesome! There are a few things in this patch I don’t follow, but it looks fairly simple.
Question: does the APC use Sysex for anything but the handshake?
I guess max for live will solve any questions like that
and I guess you’ll wait for it too.
with my protodeck, I’ll use python live door in order to control and get feedback from live.
it isn’t finished/adapted to my hardware cause I’m just finishing wiring in my box
blog is here: http://www.julienbayle.net/diy/protodeck/blog/
I juste hope max for live will be released SOON !!!
I got this working: one thing to watch out for. If you’ve got a default MIDI routing that just routes MIDI in to MIDI out, this will include sysex. Ableton is precious about its magical handshake and refuses to recognise the APC40 if the sysex gets passed twice.
Make sure *not* to pass through any sysex MIDI outside the locked-down sysex in/out path or it won’t work.
where did you get these informations?
are there some API/specifications infos available ?
Yes. People have mapped out the APC in great detail. Look at nativecontrol.com
On the Ableton forums if you search you can find info on the MIDI mappings for the APC40.
nativecontrol.com doesn’t work here (?!)
but the most great things is the Live side.
I mean, the Live API that everyone could use with all controller that work with midi and/or OSC.
Live API will be official with max for live.
Python inspection has been done for 7.0.16 and it drives us to use python interface instead of max patches.
BUT max for live will bring us to easier days
I’ve been using a similar workaround involving virtual Midi ports to change the default clip launch pad colors using Midi Pipe. Have you all tried this with the new 8.0.5 betas to see if this breaks your functionality?
I ask because there has been a change that seems to bar us from using virtual Midi ports with an APC40. Check out the following post on Ableton’s forums and please chime in if this is a problem for you.
So then, the Live/APC40 handshake.
Anyone getting anywhere with that? Here is my contribution to figuring it out and opening up the ‘red box’ for use from a Max Patch….
The handshake consists of 5 sysex strings exchanged between Live and the APC when it is selected as a control surface.
String 1 (From Live) – ‘APC40 discovery’ message:
240 126 0 6 1 247 240
String 2 (From APC40) – ‘APC40 present’ message:
240 126 0 6 2 71 115 0 25 0 1 0 0 0 127 127 127 127 0 75 2 0 9 0 3 0 2 3 8 0 0 5 6 3 247
After the inital bytes of this message (including the Akai sysex manufacturers code) are a load of digits (all those after ’115′) that ‘could’ be serial number/firmware number etc…. I do not know
If an ‘APC present’ message is not sent to Live no further communication occurs. You can ‘manufacture’ an APC40 present message that will cause Live to send it’s subsequent two sysex strings; the shortest legal ‘APC40 present’ I can produce is:
240 126 0 6 2 71 115 0 0 0 0 0 0 0 247
String 3 (From Live) – ‘Live acknowledgment’ message:
240 71 0 115 96 0 4 65 xx xx xx 247
Live responds to confirm it has recognised the presence of an APC40, including the Live version number (xx xx xx) in the message (e.g. 7 0 16)
String 4 (From Live) – ‘Handshake Query’ message:
240 71 0 115 80 0 16 0 0 mm nn nn nn nn nn 0 0 nn nn nn nn nn nn 247
Where mm is always either 0 or 1, and the "nn" bytes are always between 0 and 15. The rest of the message is ALWAYS the same; only the mm/nn bytes differ. It is from these values that the APC40 must generate a correct response…
From the midi specification we know that ‘data bytes’ in a sysex message must have a zero as their msb. This leaves 7 bits available for data. If only the four lsb’s are used for data values between 0-15 are obtained.
I hypothesise that in this case the four lsb’s from two subsequent "nn" bytes are being combined to produce a full (8-bit) byte (with value between 0 and 255).
This means the ‘handshake query’ message transfers SIX bytes (between 0 and 255) to the APC.
String 5 (from APC40) – ‘Handshake Response’ message:
240 71 0 115 81 0 16 rr rr rr rr rr rr rr rr rr rr rr rr rr rr rr rr 247
Every ‘handshake response’ from the APC40 is identical except the 16 "rr" bytes returned (which differ each time). Again rr is always between 0-15. This supports the hypothesis that TWO ‘sysex data bytes’ are being used to transfer a single numerical byte (by combining the four lsb’s of two "rr" bytes).
The APC40 therefore uses some algorithm to convert the SIX bytes (between 0-255) sent by LIVE into EIGHT bytes (between 0-255) which it returns. If these match the bytes Live expects the lovely red box appears….
That concludes my observations.
Anybody want to chime in with potential algorithms for turning six bytes into eight???
|Anybody want to chime in with potential algorithms for turning six bytes into eight???|
I guess you could use padding.
YOu can check it too:
my protodeck says "hello" to Ableton Live via a python script interface like that:
check the function NotifyReceivedByte
you can check the python script too:
basically, the framework is:
protodeck < ==> python script interface < ==> Ableton Live
hope it will help!
(asap Max for live will be released I’ll translate the python in a big patch, more maintenable)
I have made a patch that ‘emulates’ Live and communicates directly with an APC40. The patch will produce a "handshake" in the format Live uses EXCEPT with the critical ‘handshake bytes’ user defineable.
The idea is you can ‘invent’ a handshake, perform it with an APC40 and see what ‘handshake bytes’ it returns.
By sensibly using different ‘invented handshakes’ the handshake algorithm could theoretically be figured out.
Alas I do not have an APC40, so hand over this to another willing participant.
Here is the patch. Though it is untested (not owning an APC40) I am confident it should work. I would be interested in hearing back from anyone who tries this out….
The goal of course is to figure out the handshake so that a Max patch can be made that ‘emulates an APC40′, opening up the red grid/clip launching etc.
Obviously this then opens up this functionality to monomes/custom midi hardware…..
----------begin_max5_patcher---------- 3592.3oc6cs+iaabD9mu.j+G1JflG.NtbeSFDj.ijlFCzf5FWffhXiCTR6cG qkHEHoNamz9+dWxkTh7NRpkT7wJZ6GR2wkOl8alclgK24i+wm9IWsXYv6DQK .eM32.Wc0eH2xUoaKYKWkugqVr08cq13FktiKVErcqvOdwSxZLV7t3zFdw9X vN23U2A77AuHTDI2K2Xu.evOGrV7mR9ygCZimuXUvd+ziDmu0aB7i8c2JROc OKzycygCvac5FCV9e9J9gM5ueqm+FQbpfAKdVh798zyBx5oVE16f8w469gMm Jxd92dcnXUrBJvND4gAvvjOgjzu3zmZAdc5w7+9zOI4a4WO47Qs+t28h+xyd w2Sr.+jq+5n6bei.7W2teiabPX03E5fnW.jut5cQSH04DXZoqzQfB4j.MofL .xR+B6jfSEu723tRTqBBR5hBBkpRPb00E93qaQ4M8xz+JNxqA+hXmvMFDEK1 EAPeFF7Vu36.26F5ErOB74hTsnXM3tbEazm+Tvudm7Pjckfa88hbWtQjLnIV D5GAbCk+RXv58qjGjbPT7cB4dFsKvORj9KJ6jaklLQeG3GCC1J2pWDXkqO3s BvZg7zH0dp88vEE3t41fPojs86p1dx9z1SjVZOw6l8D1I0fBpF4gUpYF5gVT GLdPcw3wFhSNsjrg2Tk0KjOx1O3WC9Iu3TU0RuaAKc8kerONV5uLN.rSDdSP 3VfTyVgczmCVJheqP3CdUpCjWsPtiqOZhTsdlz+9MXmkdNyMqRMiI8qZFRS0 xN1EzxkMkFAkL50fuOT5iPNHDv.KeebwwkRE7Q8mTmKElB5PvW3GjdbGOffa j6uE3vekGVzcA62rF71fv27kUq0o8uVmdVZcJWo0IChVGkp0gJ+HTzwP2inV G9ZvKEwe09cfsdq8.6BBkBdKwXxYgwXZgQVIwm6ULNKPOtvHqxWi9CiUdDqD gfcDgXDUZCJGC37OOJ8kQBXSHg5jfbrNlGTYjPchhe+Ng5HVj3mewPfTaEQQ t2JZocFqlL+Pm.EgjrjuXo8YkyVnc6x8qVquFwbUzBZloM7wW3Gg4Mg24Mr7 1UAajYbmdDVO0Am7mmH+IHhRbJ7Cvy59.7EuUB6O1kwNPz6iDu650twtWmDm 3ZYKgtqhaq9jzh6NpaJ.pxjOazOVCa9h3ex4SDlAQ4XjTr71HtWDF8.0xUKJ bcUiasRGkQgY2hVwz9SzhaBV8Fw5htvtZwZwMs6zDrS3e7HR2yRe7fc0y+gl Ukt1t62DecM3d4cHe3R0sVs1+pE2F5sNvOQPJerIaO+RlmODjVR5S2Ee2cUc 3wAAaV5FduWjm7tTJqUjV4t9dakI1D6sM6NsOdjda2E5oRsvp3gbbpFJp6KM nobCMN3o7.nu4a.jRsz.h8fwLXdoVpzOXSicZX7ScigHH0vGF5Xz5RChpdfT Jn95C6QlCnre7ICBt9e6JnZOYfpiJGP9SolJndNFqNiNth4yci0i2w7nCpyZ iUBb7w0bOq3YqwJZx.UUReyUiU7niqH9r2XkLYf5r1XEOAFq4dVIy1bVISFn plJ74pwJczwUHe1arxlLPcdarN94rBy8rRmsFqnICTcnyXiU33arxm61proB RMeK0896bW8FfUy+si3dCII.6HtyzC3g1pGnIoEH+SFquFYU7uuAHV4sIRBd c8V958wOnSkDc5y71NMqDFVSORI36zAtcMN5DgsT1wUtgghsU4YpqQUqGksG xH.H0JH.ybzEmG.LNsuVqO5FbReN2ErpCmN.FQy+7zc9hsmuZbRD0E8Npnt5 0BKLMicU8hr4DVEYK0gZvEc52EdhuIK7q5dLrohPxNTChDErObUN7maN.df7 rVDE64e3Ig+aGbb8vc7Nu0qevybNE18VuKPF3KSHaiEdqkerthOwHE+DoBpi 3SMRwO4lWzC9Ylo7qq3SMS4moq7CMyAuZi+Iy9fI1APsQA.MO4Wa2mXyz+IV +vWl4HXbqFBiLO4mzF4Gadxui1IPXYlFPbsGAXalo.ocP.hYFDfneNnFZRns ZLLw7j+VEElZdxuUajel44BxtMxO23jesyg.ZloQS08lHYFYRnohOU6HXFZG fnUGfatFPHs5.NlaG.qcVbFpIjd4PXv9ffZmEmYpAr0R9wFqBvQ6jPMS7mok KHyE+4ZOSJlI9qWLLpwh+TsmHHyD+0KDr4F..q8T41u3edCIckrpTMx8dw5q kWOwp3qciiC8VtOV8XyJW0pMTUlmeccV8QVagjd6lfktaxJv1CmyEmrRTOz6 68hZdaJaPgHV.NTZzAk4oam9CLfue69GhvOAYHoY8QiGo5iFqdj1X7iY4hZe L98KAIvPmnqpeWB4nJy+iKtFc44f9mbMd1K99DhWZy6kN79hWs3HoY8KYLkz qV7kssn4s5FUR.IJNjPwEBHjyPv1FHjhgEP0dMFAFMIgjZxXkLw5iDUVKwYZ GoYLLuPI6WIgib9vLUoKynLkAlUSzmEHRHAJ21RBDT9f6jCoH9ChESAWvIhF Hvp0LD257nAhpOMejFHt3nAhu8a67ZoGwmfRUTw9PNl9Zo+yRxhqq3p8TgqY jAFxjwUHsqv53SDDJe9PhkoatdNdAF+Z.EZQJPzryV2.zICXUj7zb0OvDTGn DUcyPPyYGASPcfZiT3JYV6H.MY.KjOmcDLETBg5VxIzYri.3Dj+J0ovDKMWc D.clLfUY2NWcDL9rYFJilsylDsYpifwOCVLlUX5HmsNBXSFvpHIhYpi.HeBn 0PZgIDdt5HX7yzhntG1K.b8bbDXOY3JZVOEAiOrRwEdALXxlqMQnI8O8A.G1 I7lmlcKgnKQlL87GSW4JFRuSVLLsfXNpvi8r+nJl4BONvyWsKejGGdDrfTu2 Ttr4wApYVDZ5WCQl45+scUBt4s9Sg3V0ALPtbP+Jo1PISCsKEYnYVIuHsGCf Ly0vLRamnHyzIJRaunHyrRzP7KaFMA4bYSHHHxkMcTfXW1zQABdYWJ9H7kco 3CsurKEej0kco3CosQ9sMO4uUwubLup3Ra++H6OxnaCkBPq5nFQM2NfVEho8 Et7iLW4WqB4Extz6.bysCnUovBctv6.HKysCnUwTiPW5c.7kdXLC1KjdIB0+ Ch+X8ret0ydykA6Kkvm+sRWbkp93+4dQ36aeoGSQ8RoZ1TksRnEelkP0J0S8 nK6dArte6RQXK6qjNV9uHR1Z0R0Ofcs7eQMU9uVnBk+KQmxYM6w2lUn6m7EL urC6sc+1RZKIlluMDkNtZCZGK5cjEdv0FD0xz8CIsAriTP.yZ30FP1GXZChc G0FpBLYP0FYu3n+PRav6l1fSFdkA15CMkAqib3AbvUFHa9ErxnNJAITrS3uF DIZKKfb7Uu7vwBHYHtpfEUi2NMIfz+XTMKpPcApZ3DJVuSWJ372nOzIBohRY jiad.mbYo3jqju9yaVW4+apshbyklHdc4dh5eFpQUnGTK7TA4faBC1d8F4sN 1RTByG76MDw3J9uI8lBK9dGq2wgvtiC0DxwpG4rsrD2TQoX7A1VQqIXHkdyR X6rms5M9AuciX8shjip3jLbNTgGFO3lW1pQcXbVlXvijg2vhcvbr6G7hVEb+ ClZlyB0F9IrgonsBGUFSV7d.z1JhhbuU7XPqTf.mjX.D.iB3pHBs2yNtFO68 nictpX9w4u0bUeYO5N1W1RnA4zKVNnSGyCoJ3Fa3iJCjZ3owmLJ703gAkuPk ec6msTDavG7gyHFNtpfl4zALj3Q9QEhRF5IGvkLXLYnXa4G0VQfp5A1PzXwh fHKU5GXmoJt6y88h8biEf6dD0VVcvhR2k64DOA1wogkkwPDNGqJoxrLaODGJ qTUf0cI5OBwrdVrsiyDWVFGY7Q.K+yixdKxMzw5Hq2V0opNtus+goFCim6CA 1gw5rAOpcFJxnERpY.CZW6H8e1asG3eE.jwgHschBvzN9HSTuCsSsEssGB1q 0V83qTuBzc3CI20tWhq60A3RzjGdV0UEL25bPyLdFfAqrudi26tdavZQGhWg KeZTSvTP3QSopRIkTLW8JEp5l5wrWU5mbpG8hEayPSoM7pvfnfahAu789w2I R5TgImnmj7wwV+auD7qt2KhcWtQdmQ+pZuOre+i8wICD94m+COG7uCdi3qAI uV5quQTSMhapQRSMRapQVSMxapQ6gHk+sRmGd92Dz1zVgC+MEor.UE.NEMQy 00l.20pannc3yvmoYF9nPF1XPf8MYCIuXsEhnC9c9jEgFpxrjzGyEXyQg+wv fscJNLjzwGOqJxXFGfYQGD55W4721p1qgAFJty3oswEJF5PGyPwO2WYFWcTz pZE0Xq3FakzXqzFak0Xq7Fac.Cl11TvGq4j.xpiYvZj1ZLgrMF7jMxFiwgWh Ia.GdKHj8QSmQIWict9hJ6rbTGuGKZgo7fpFPT5kiQKhHBY4uwIRdDP1G9R+ Hhp8rLkmjALOboYmCOmp1X0qjDpXoXWyxvtRsl9BGRKgCNMBW4W5o5UPYZHb 1nzmOQFI2RcbN7a8hXSzQpwSChpi1lLIhldiRJCsijnYqinwlDTCqinAQShr wzRiRmFqM8764LMJUSF4vV5HbO3MFtFBG2I0oLMKA.N6vu0Od9bzxqbqiBiU KfIjZ9ux5Do+V+DKgnkG6oIZBQK6TxzDOgx0R3llztHZ42lxmljDbLYatAx8 S+HbbsQtwOKFh9pU53OZ0RagiL9BGTagCO9pUasENzz3J4jQcYHyM2YVqcyg 3zz6mLa4ARN7K8SR05I0SSLWlVYqvblD+e5gb7yepNR1f7q+O1jUocC -----------end_max5_patcher-----------
OK it looks like you guys got it all sorted out. This is Shane from Akai. Everything is standard midi except the challenge which is sysex. You don’t need to do anything else with sysex. You must individually pick and intercept what you want to do what with between the apc and then pass that on to live. It took me 16 hours to make my workaround remapping. Note, if you want whatever your remapped button is to light when you change it in Live you’ll need to reinterpret and translate on the way back in. Also, you’ll likely need to turn notes into cc’s and vice verse as some ableton controls like notes for on off states better than cc’s.
You can see my demo of max remappings on you tube "APC40 Extended"
My advice too is just to wait for Max For Live though.
if only we could have infos about max for live release date . . .
Yes Ableton does not tell us these things :0
I don’t think anyone really knows… when it’s pretty stable might be hard to predict
Ah one more thing I remembered, rather than have everything come through from the APC40 and then have to filter, when you build your remappings, ONLY let through what you will use. It’s more work in some ways to do it inclusive rather than exclusive, depending on how much default mapping you want, but it will keep things manageable and scalable when first starting.