Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In with Twitter
  • Base and Aftertouch...
    Hey A,

    Thanks for the link. Having some trouble getting it working. Everything I do just breaks the script totally. 

    Here's the layer 3 block from my base.py with the added lines:

    def _set_layer3(self, shifted = False):
    with self.component_guard():
    for pad in self._pad:
    pad.send_value(0, True)
    self._display_mode()
    self._deassign_all()
    self._send_midi(USERBUTTONMODE)
    for index in range(8):
    self._mixer.channel_strip(index).set_select_button(self._touchpad[index])
    self._touchpad[index]._descriptor = 'Select'
    self._touchpad[index].set_on_off_values(CHAN_SELECT, 0)
    self._mixer.master_strip().set_volume_control(self._fader[8])
    for button in self._button[4:8]:
    button.set_on_off_values(USERMODE, 0)
    self._user_mode_selector.set_enabled(True)
    self._assign_alternate_mappings(self._user_layer+12)
    self._send_midi(tuple([240, 0, 1, 97, 12, 61, 1, 1, 1, 1, 1, 1, 1, 1, 2, 247]))
    self._send_midi(tuple([191, 122, 72])) #turn local ON for CapFaders
    self._notify_descriptors()

    #self.set_chain_selector(self._user_mode_selector._mode_index)
    PAD_COLORS = (1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    for pad in self._pad:
    pad.send_value(PAD_COLORS[self._pad.index(pad)], True)

    Can you clarify whether I am getting the indenting structure right, and whether the PAD_COLORS function should come before or after the #self.set.chain function? I've tried both with no luck so far.


  • Pad LEDs in User Mode with Base

    No trouble....I'd always rather explain to someone how to do something than just give them an answer.  More fishes, and all that ;)


    Yes, the py file.  The pyc file is the compiled version of the py file, and generally gets rebuilt each time you open the script by installing it as a control surface in Live.

    The code I wrote should go after the entire block of that function, but at the same indentation.  Basically, it would look like this in my current working version (which may be slightly different from yours, since I don't know which version you have):


    def _set_layer3(self, shifted = False):
    with self.component_guard():
    for pad in self._pad:
    pad.send_value(0, True)
    self._display_mode()
    self._deassign_all()
    self._send_midi(USERBUTTONMODE)
    for index in range(8):
    self._mixer.channel_strip(index).set_select_button(self._touchpad[index])
    self._touchpad[index].set_on_off_values(CHAN_SELECT, 0)
    self._mixer.master_strip().set_volume_control(self._fader[8])
    for button in self._button[4:8]:
    button.set_on_off_values(USERMODE, 0)
    self._user_mode_selector.set_enabled(True)
    self._assign_alternate_mappings(self._user_layer+12)
    self._send_midi(tuple([240, 0, 1, 97, 12, 61, 1, 1, 1, 1, 1, 1, 1, 1, 2, 247]))
    self._send_midi(tuple([191, 122, 72])) #turn local ON for CapFaders
    PAD_COLORS = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
    for pad in self._pad:
    pad.send_value(PAD_COLORS[self._pad.index(pad)], True)

    Be careful of formatting....you probably can't copy and paste, as the forum software screws up the indention of the text.  You'll have to restart Live after each time you make a change, and it's good to keep an eye on your log.txt file to see any errors.  

    Does this get you working?

    Disclaimer:  I haven't checked this code yet, but I'll give it a go later when I have my Base next to me.  It does compile, and theoretically it should work right.


  • Modifying CNTRL:R's Ableton Live Remote Script (removing auto-mapping of encoders)

    That might appear to work at the outset, but is problematic because eventually the script will call the DeviceComponent instance that is established in that method, and will consequently halt on the error because it's a null assignment. 


    You can of course use that method, but you also need to go through and remove all references to  self._device in the script.  

    The easiest way to accomplish what you want is to leave the _setup_device_control() alone, and instead find all instances of:

    self._device.set_parameter_controls()

    and comment them.  The DeviceComponent won't do anything if it doesn't have any controls linked to it.

    Also, in the _deassign_live_controls() method, there are some reset commands, you may need to change some of these (I think these are more likely the ones giving you problems anyway, if you've used MIDI Learn in Live, the controls that are "learned" should be ignored by the script completely).

    for index in range(12):
    self._device._parameter_controls = None
    self._encoder[index].release_parameter()
    self._encoder[index].send_value(0, True) #turn off all the encoder rings.  We send it the second argument, True, so that it is forced to update regardless of its last_sent property
    self._encoder[index].clear_send_cache()

    Hope that helps!

    a