|
Post by Stray on Mar 31, 2019 7:49:13 GMT -5
FIRST THINGS FIRSTAs covered in the Dynamic X-Control and X-OSC assignments topic in the Addendum section of the manual, it's possible to create dynamic assignments for X-Controls and X-OSCs by using Macros. However, that approach only works for one X-Control or X-OSC at a time. If you wanted to have two layers or functionality for a variety of X-Controls or X-OSCs that you can switch between by holding down a Shift button, that approach won't work very well. But, it could if we leverage the power of User Actions. I've created a User Action that does that called SHIFT. To use it, close Live, download _user_actions.zip (1.15 KB), unzip it, place the folder it contains ( _user_actions) in Live's MIDI Remote Scripts directory and relaunch Live. Note that if you already have a _user_actions folder in Live's MIDI Remote Scripts directory, just copy the file named ShiftAction.py from the folder you downloaded and place it in your existing _user_actions folder. Here's where you'll find Live's MIDI Remote Scripts directory: On Windows: ProgramData\Ableton\Live x\Resources\MIDI Remote ScriptsOn OS X, go to Applications, find Live.app or Ableton Live x.app, Control-click or right click on it and select Show Package Contents and then go to: Contents/App-Resources/MIDI Remote Scripts
|
|
|
Post by Stray on Mar 31, 2019 8:00:20 GMT -5
DEFINING YOUR X-CONTROLS
Note that this approach will work just as well for X-OSCs, but here I'll just describe how to do it for X-Controls. In X-Controls.txt, first define a Shift button that will be used to shift the functionality of other X-Controls. Something like this:
shift_button = note, 1, 98, 0, 127, shift on : shift off So, shift_button will trigger shift on when pressed and shift off when released.
Next, define the X-Controls you want to have two layers of functionality. Each should look something like this:
b1 = note, 1, 0, 0, 127, $b1$ So, b1 will trigger the Macro named $b1$. To keep things simple, the name of the X-Control and name of the Macro it triggers should be the same and should both be of the form bx where x is in any whole number.
Note that the User Action I created will work for up to 99 X-Controls. If you want to use more than that, in the _user_actions folder, open the file named ShiftAction.py, find the line that reads:
NUM_X_CONTROLS = 100 And increase the value.
|
|
|
Post by Stray on Mar 31, 2019 8:07:06 GMT -5
DEFINING YOUR MACROS
For each X-Control, you'll define 3 Macros that should look something like this:
$b1_default$ = mute $b1_shifted$ = solo $b1$ = $b1_default$ The naming scheme here is important. Above are the names we would use for the Macros related to the X-Control named b1. These define that $b1$ will be assigned to $b1_default$ by default and $b1_shifted$ when shift_button is held down.
|
|
|
Post by Stray on Mar 31, 2019 8:20:32 GMT -5
This seems overly complicated. Why can't we just have a builtin ASSIGN action or something that works like the BIND action?
The BIND action is possible because controls can only be bound to a single parameter, so it's possible to have an action list with several BIND actions in it. For example:
bind k1 selp ; bind k2 sel/pan ; bind k3 sel/send a We can't do that with X-Controls or X-OSCs because they can trigger action lists. We can't assign action lists to multiple X-Controls or X-OSCs within a single action list - that just wouldn't make sense unless some new syntax was added, which really isn't justifiable.
I hope that clarifies the situation here.
|
|
|
Post by aehaem on Mar 31, 2019 11:20:24 GMT -5
Hey Stray, thank you for that fast helping reply... (...on Sunday!!!) ClyphX Pro is not only another Dimension for Ableton, if ableton were an ice cream, clyphx pro would be the cup to hold it and the scoop to enjoy it... , your help would be the cream and your fast response the cherry on top. Ableton should hire you, put ClyphX (at least) into their suite package and pay you the bill... Otoh this is not necessary, since everytime I search for a solution in the web, there is ClyphX... Such a wonderful work, -thank you-!!! Since I have 8 "shift Buttons", controlling each (the same) 8 trigger buttons, I assume, I would need 8 ShiftAction.py s (and 8 different names for those...- like ShiftActionA.py etc ) Or is my thinking to limited (as so often)
|
|
|
Post by Stray on Mar 31, 2019 12:00:39 GMT -5
Thanks for the kind words!
For this approach, you wouldn't need 8 shift buttons or Translator. You'd just need a single shift button and would set things up exactly as discussed in the first three posts of this thread.
|
|
|
Post by aehaem on Mar 31, 2019 12:14:02 GMT -5
Okay, I have two Rows of 8 Buttons (BCR2000) and use the first row of 8 Buttons for shifting (changing 8 Macros each via Translator) the second row of 8 Buttons, that gives me 64 actions (since every of the 8 shift Buttons give all 8 trigger Buttons another action) With ShiftAction.py and the use of just one shift Button I can have 15 Buttons (since one is for shift action) with each 2 actions. That only gives me 30 actions, or am I missing something???
|
|
|
Post by scarpolish on Mar 31, 2019 13:04:49 GMT -5
Absolutely amazing! This works like a dream!
Thanks so much for the fast response. This is going to open up so many possibilities now for fine-tuning my interface with Live. Really appreciate that you would take the time to actually write a new feature, and especially so fast and on a Sunday. Much gratitude.
|
|
|
Post by Stray on Mar 31, 2019 13:17:26 GMT -5
^^ That's great to hear! Okay, I have two Rows of 8 Buttons (BCR2000) and use the first row of 8 Buttons for shifting (changing 8 Macros each via Translator) the second row of 8 Buttons, that gives me 64 actions (since every of the 8 shift Buttons give all 8 trigger Buttons another action) With ShiftAction.py and the use of just one shift Button I can have 15 Buttons (since one is for shift action) with each 2 actions. That only gives me 30 actions, or am I missing something??? Ah, okay, we're talking about two different concepts here. The approach discussed here is for creating shift functionality, which is similar to how the Shift key on your computer's keyboard works - it modifies the function of other keys when it's held down. We do the same thing here to allow each X-Control to have 2 layers of functionality; a default layer and a shifted layer. What you're describing is more along the lines of mode functionality - where X-Controls have multiple layers of functionality that are selected via a group of mode buttons. It's possible to do that with user actions too, but it's a different sort of thing. Stay tuned and I'll create another thread and user action that does what you're looking to do without having to use Translator.
|
|
|
Post by Stray on Mar 31, 2019 13:42:10 GMT -5
|
|
|
Post by clecio on Apr 18, 2020 19:29:58 GMT -5
That worked with me following the example for "on/mute track" as showed on the topic. But, not work on snap/ recall actions. Did I do something wrong?
X-Control.txt shift_button = NOTE, 2, 43, 0, 127, shift on : shift off b1 = NOTE, 2, 40, 0, 127, $b1$
Macros.txt $b1_default$ = [MY SNAP1] ALL/SNAP DEV(ALL.ALL) MIX+ PLAY $b1_shifted$ = [MY SNAP1] RECALL RAMPS 4 $b1$ = $b1_default$
|
|
|
Post by Stray on Apr 20, 2020 12:01:07 GMT -5
You've got the identifier in the wrong place. You should remove it from the macros and put it in the X-Control definition: b1 = NOTE, 2, 40, 0, 127, [MY SNAP1] $b1$
|
|
|
Post by dequote on Feb 13, 2023 19:39:02 GMT -5
This seems overly complicated. Why can't we just have a builtin ASSIGN action or something that works like the BIND action?The BIND action is possible because controls can only be bound to a single parameter, so it's possible to have an action list with several BIND actions in it. For example: bind k1 selp ; bind k2 sel/pan ; bind k3 sel/send a We can't do that with X-Controls or X-OSCs because they can trigger action lists. We can't assign action lists to multiple X-Controls or X-OSCs within a single action list - that just wouldn't make sense unless some new syntax was added, which really isn't justifiable. I made a simple (and perhaps hacky) user action, "DQ", which runs strings as actions: forum.nativekontrol.com/thread/4529/strings-actions-reassign-xcontrols-xmodesAmong others, it can reassign x-controls via macros or in action lists (like BIND does for bindings), or call macros within other macros. It's an alternative to SHIFT/XMODE. Example of using DQ to switch mode/submode. Macros.txt: # Mixing submode (pan/solo) $MODE_MIXING_SUBMODE$ = BIND KNOB1 1/PAN; BIND KNOB2 2/PAN; BIND KNOB3 3/PAN; dq "$B1$ = 1/SOLO";dq "$B2$ = 2/SOLO";dq "$B3$ = 3/SOLO"
# Mixing mode (vol/arm) $MODE_MIXING$ = BIND KNOB1 1/VOL; BIND KNOB2 2/VOL; BIND KNOB3 3/VOL; dq "$B1$ = 1/ARM"; dq "$B2$ = 2/ARM"; dq "$B3$ = 3/ARM"; dq "$B4$ = $MODE_MIXING_SUBMODE$"; dq "$B4_OFF$ = $MODE_MIXING$"
# Default mode (track control) $MODE_DEFAULT$ = BIND KNOB1 SEL/VOL; BIND KNOB2 SEL/PAN; BIND KNOB3 SEL/SEND A; dq "$B1$ = SEL/MUTE"; dq "$B2$ = SEL/SOLO"; dq "$B3$ = </SEL"; dq "$B4$ = >/SEL"; dq "$B4_OFF$ = NONE"; dq "$B5$ = $MODE_MIXING$"; dq "$B5_OFF$ = $MODE_DEFAULT$"
|
|