Mimicking Arturia Analog Lab's Scale Fader Pick-Up Mode for MainStage

Arturia’s Analog Lab has a neat option for reconciling the difference between the position of a hardware MIDI controller’s physical fader, and the initial position of the virtual fader in a selected preset.

Say the preset has a virtual fader at initial position 20 (between 0-127), and the hardware is around position 80 - the standard “jump” approach would mean as soon as you nudge the hardware controller away from 80, say to 81, the virtual fader would just jump to position 81 and thereon be in sync. This is desirable in some cases, but often you don’t want this and instead, you want something more intelligent.

Analog Lab’s Scale method would mean if you gradually slide the physical fader from 80 to 127, the virtual fader would corresponding move gradually from 20 to 127 - at 127 both would be in sync thereafter.

I’m using Apple MainStage and want to be able to mimic this kind of Scale Fader Pick-Up inside Bome, to allow me to use a physical MIDI controller fader to control a virtual fader within the MainStage environment without jumps, but with the intelligent catch up described above. MainStage has the ability to automatically send out the virtual fader initial position (when a patch is selected in MainStage) for use in Bome and vice versa, it will respond to anything that Bome sends it in terms of CC values for that fader.

I’m wondering if this has already been tackled by anyone who would be willing to share the script or whether someone has come up with a similar script that I could modify to work in my specific use case. If not, I would be interested to hear ideas on how to approach this from scratch in a programatically efficient way.

Many thanks for your help.


I haven’t done “Scaled takeover” as you are describing, however I have done “crossover takeover”

The trick is to compare the DAW position (we have to capture the DAW version of the fader) with the controllers position.

Here is the recipe

In this example we capture the global variable gc as the DAW’s last known position and gb as the controllers current position.

// target takeover value into local variable (gc might change to actual input of translator)
// get last delta - gb is where last value in this example was stored uu is the delta value
// get current delta from current input
// Multiply input delta times last delta - Should be negative if they crossed
// otherwise positive
// store new last value for next iteration into global variable gb (in this example)
// Negative or 0 means we crossed
if tt>0 then exit rules, skip Outgoing Action
// Takeup complete allow output reset the last value to current value (gb in this example)

Steve Caldwell
Bome Customer Care

Also available for paid consulting services: bome@sniz.biz

I created an example here.
Controller-Takeover-Example-2021-08-31.bmtp (2.4 KB)

Steve Caldwell
Bome Customer Care

Also available for paid consulting services: bome@sniz.biz

Many thanks Steve - will give this a go and let you know how it goes. Appreciate the example you’ve provided.