yastefan / grandMA3-Chataigne-Module

A Chataigne module to control grandMA3 via OSC
GNU General Public License v3.0
23 stars 7 forks source link

Enhancement for MA3 1.9 #5

Closed PixelLighting closed 1 year ago

PixelLighting commented 1 year ago

Hello i love your Plugin it works Great and without any Flaws.

Small addon you would need to Look if you need to Rewrite your Plugin a bit because in 1.9 The Fader to bank assigment for OSC is removable this standing pretty low on the on Release Notes would be awsome if you could add this or change something if needed

Here the OSC Changes for 1.9

OSC: DataPools can be addressed in an OSC message via the /DataPool address. Addressing a fader or button without specifying a page addresses the executor on the currently selected page. OSC Messages now contain the cue name, sequence name and the cue number.

yastefan commented 1 year ago

Hello,

thanks for your nice feedback and the hint that you can now also address the executors on the current page.

Currently, the page is specified as an INT parameter and I would like to keep it that way. I couldn't decide until now whether it makes more sense to have an extra checkbox with "use current page" or the option that you can specify page 0 and thus use the current page.

Do you have an opinion on this?

PixelLighting commented 1 year ago

I would say an checkbox would be nice because i would want to use an behringer xtouch compact. So i have the full 15 fader on 2 layers and with an extra Button you just can change Pages without changing the fader assignment itself.

Cause i have like 3 midi controler connected would be nice to setup the other ones without following the Page because they dont have any motorized faders so the only good solution is a checkbox.

Small extra point Is there maybe a way to get an fader Position Feedback ,that updates not constantly more like in an interval,from ma3 via osc back so you could use motorized faders via chataign to the midi Controller

yastefan commented 1 year ago

that's not what I meant. I was just asking a design question. An additional checkbox makes the interface less tidy and existing mappings may have to be revised. But it is self-explanatory. Alternatively, I could imagine selecting "Page 0" in the INT parameter and using the executors of the current page. This would be compatible with all existing mappings, but is not quite as self-explanatory.

Feedback in grandMA3 is difficult. In the plug-in there is the possibility to address sequences directly. For these, grandMA3 can then provide feedback. However, I sometimes find it difficult to get OSC output from grandMA3. I don't know exactly what the problem is, but sometimes grandMA3 refuses to send data to an OSC port that is already open, which is always the case for a local setup.

As for your mapping, I wouldn't even try to change the executors of the current page. Hopefully the xTouch can organise its pages itself. For example, it sends the Midi signals CC1 - CC8 for the motor faders on page 1 and the signals CC9 - CC16 on page 2. Then I would make a multiplex mapping in Chataign for the first 15 Midi signals to the executors 201 - 215 and for CC16 the grandMaster. If you want to switch the pages, I would submit a macro in grandMA3 that moves the executors from page 2 to page 1, for example:

move page 1.201 thru 215 at 9.201
move page 2.201 thru 215 at 1.201
move page 9.201 thru 215 at 2.201
PixelLighting commented 1 year ago

Okay now in understand what you exactly mean yes i think that it looks more tidy that Page 0 is ma3 curent Page And then comes Page 1, etc. Yes this makes a bit mire sense

Okay so its still more an ma3 Problem that they need to implement more OSC stability and connectivity

Nice idea i have the Compact Mini and it works pretty nice with the 2 layers they are conpletly independant layers with difrent notes because chataign Talks to the controler via Notes not CC maybe the compact works difrent i dont have it at the moment

So you mean to switch the Pages but leaving the mapping only mapping to Page 1 that is changed

yastefan commented 1 year ago

Here's what I would do:

If you want everything on grandMA3 Page 1

xtouch Page 1:

Encoder: Fader 1.201 - 1.208 Button down: Button 1.101 - 1.208 Button top: Button 1.201 - 1.208

xtouch Page 2:

Encoder: Fader 1.209 - 1.216 Button down: Button 1.109 - 1.216 Button top: Button 1.209 - 1.216

If you want more overview

xtouch Page 1:

Encoder: Fader 1.201 - 1.204 + 1.206 - 1.209 Button bottom: Button 1.101 - 1.104 + 1.106 - 1.109 Button top: Button 1.201 - 1.204 + 1.206 - 1.209

xtouch Page 2:

Encoder: Fader 2.201 - 2.204 + 2.206 - 2.209 Button bottom: Button 2.101 - 2.104 + 2.106 - 2.109 Button top: Button 2.201 - 2.204 + 2.206 - 2.209

PixelLighting commented 1 year ago

Nice way but the xtouh Mini is a perfect x key area and is split up in 2 Banks 1 live normal xkeys and the second layer is used as a programming shortcut area.

But thanks for the explanation i will wait for the Update to 1.9 if you Update the Chataigne plugin so it will work and i can send you an Feedback if it works without issues or something will be noticeble.

Ieven build for the apc mini mk2 that i have an led BPM tap Feedback so the led will blink in the speed of the bpm i sending to ma3

pmjcontroller1 commented 1 year ago

Hello partners . It would be a very good option to be able to assign page 0 to be the current page, that would be wonderful. I have also read that naming the executor as fadermaster acts on the current page. you could try it and if it works maybe name some new plugins like fadermaster, buttonmaster and encodermaster this way the user keeps the options clearly

pmjcontroller1 commented 1 year ago

@PixelLighting hello a question, I am fighting with the code and deleting the page of the osc message I Send OSC : /Fader201 100 But it is not interpreted by Ma3

Could you tell me an example string so that an executor encoder, executor fader and executor buttons can be received by all the ma3 pages?

PixelLighting commented 1 year ago

@pmjcontroller1 this thread was an idea for the Programmer of the Plugin so he can implement this Function because MA3 1.9 is pretty new and is released pretty random as i think i wrote this here to the main Maker of this Plugin so he can change it at the moment the Plugin cant do the Current Page Function

pmjcontroller1 commented 1 year ago

@PixelLighting thanks for your answer. If I read all the proposals, I am modifying the plugin code to later upload the code to yestefan so that he can implement it. the problem is that we send the osc message without /page or with /page0 but ma3 in v1.9 doesn't seem to understand that message. The question I was asking you is if you know the correct osc message to send the executors to the current page

PixelLighting commented 1 year ago

@pmjcontroller1 ah now i understand what you wanted i jsut thought about it maybe they made it simple by just removing the /Page#/ instead you just say wich fader and if i got to the Helppage of ma and in ma3 it just say if you not tried this very simple way then you would need to programm the pLugin if Page0 is selcted it will Remove the Page Part of the OSC Signal that is send

pmjcontroller1 commented 1 year ago

@PixelLighting I'm afraid that ma3 is not working correctly, we have already done the test of not sending page , sending page0 and there is no function in ma3.

I will leave it registered in the ma3 forum to see if there is any feedback. thank you

PixelLighting commented 1 year ago

@pmjcontroller1 so i removed the whole part out of the Java Script and it works with the Current page so i had been right they just Completly Removed the Page Part to Controll the Current Page that is active.

So for the script i think there need to be a Programmed Feature if you set in Chataigne The Page to 0 it Will take the Java Function line without the Page and else it will Use The Lines with the Page

  1. This is my Changed Line in the "grandMA3" Java Script file

function moveExecutorFader(page, executor, offset, value) { var range = local.parameters.faderRange.get(); executor = executor + offset; local.send("/Fader" + executor + "/", value*range); }

  1. This is the Original one but for the Executor Button

function pushExecutorButton(page, executor, offset, value) { if(value) value = 1; executor = executor + offset; local.send("/Page" + page + "/Key" + executor + "/", value);

I Checked if it not Moving all The Faders on all Pages so i had 3 Playback open with an Own Set Page and one that is Bound to the Selected one and had an Page Selector on the Bottom i Could Just Switch Between them and only the Fader on the Selected Page Moved but not on other Pages

pmjcontroller1 commented 1 year ago

Thank you,

I put here the changes that I have made in the configuration files in case they seem correct to you

Module file


  "name":"grandMA3",
  "type":"OSC",
  "path":"Software",

  "version":"0.8.5",
  "description":"A Chataigne module to control grandMA3 via OSC",
  "url":"https://github.com/yastefan/grandMA3-Chataigne-Module",
  "downloadURL":"https://github.com/yastefan/grandMA3-Chataigne-Module/archive/refs/heads/main.zip",

  "hasInput":true,
  "hasOutput":true, 

  "hideDefaultCommands":true,

  "defaults":
  { 
    "autoAdd":false,
    "OSC Outputs": 
    {
      "OSC Output": {
        "local": true,
        "remoteHost": "192.168.14.152",
        "remotePort": 8000
      }
    },
    "OSC Input": {
      "enabled": false,
      "localPort": 8001
    }
  },

  "parameters":
  {
    "Fader range":
    {
      "type":"Float",
      "default": 100
    },
    "Learn from oscInput":
    {
      "type": "Boolean",
      "default": false
    }
  },

  "hideDefaultParameters": ["autoAdd", "colorSendMode", "useHierarchy", "autoFeedback"],
  "scripts": ["grandMA3.js"],

  "values":
  {
    "Preview": {"type": "Boolean"},
    "Blind": {"type": "Boolean"},
    "Freeze": {"type": "Boolean"}
  },

  "commands":
  {

   "Move Executor Fader":
    {
      "menu":"",  
      "callback":"moveExecutorFader",
      "parameters":
      {
        "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"},  
        "Page": {"type":"Integer","min":1,"max":9,"default":1},
        "Executor": {"type": "Integer", "min":1, "max":490, "default":201},
        "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, 
        "Value": {"type": "Float", "ui":"slider", "min":0, "max":1, "default":0, "mappingIndex": 0}
      }
    },
    "Push Executor Button":
    {
      "menu":"",  
      "callback":"pushExecutorButton",
      "parameters":
      {
        "All page": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"},
        "Page": {"type":"Integer","min":1,"max":9,"default":1},
        "Executor": {"type": "Integer", "min":1, "max":490, "default":101},
        "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"},
        "Value": {"type": "Boolean", "default":0, "mappingIndex": 0}
      }
    },
    "Turn Executor Encoder":
    {
      "menu":"",  
      "callback":"turnExecutorEncoder",
      "parameters":
      {
        "All page": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"},  
        "Page": {"type":"Integer","min":1,"max":9,"default":1},
        "Executor": {"type": "Integer", "min":301, "max":490, "default":301},
        "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"},
        "Multiplicator": {"type": "Float", "min":-10, "max":10, "default":1, "description":"Speed of the encoder movement, only relevant for endless encoders"}
      }
    },
    "Move Sequence Fader":
    {
      "menu":"",  
      "callback":"moveSequenceFader",
      "parameters":
      {
        "SequenceNumber": {"type":"Integer","min":1,"max":9999,"default":1},
        "Offset": {"type": "Integer", "min":0, "max":9999, "default":0, "description":"e.g. offset 10 and sequence 2 results in 12"},
        "Fader": 
        {
          "type":"Enum", "options": 
          {
            "Master": "FaderMaster", 
            "Speed": "FaderSpeed", 
            "X": "FaderX",
            "XA": "FaderXA",
            "XB": "FaderXB",
            "Temp": "FaderTemp",
            "Rate": "FaderRate",
            "Time": "FaderTime"
          }
        },
        "Value": {"type": "Float", "ui":"slider", "min":0, "max":1, "default":0, "mappingIndex": 0}
      }
    },
    "Push Sequence Button":
    {
      "menu":"",  
      "callback":"pushSequenceButton",
      "parameters":
      {
        "SequenceNumber": {"type":"Integer","min":1,"max":9999,"default":1},
        "Offset": {"type": "Integer", "min":0, "max":9999, "default":0, "description":"e.g. offset 10 and sequence 2 results in 12"},
        "Button": 
        {
          "type":"Enum", "options": 
          {
            ">>>": ">>>",
            "<<<": "<<<",
            "Black": "Black",
            "Flash": "Flash",
            "Go+": "Go+",
            "Go-": "Go-",
            "Goto": "Goto",
            "LearnSpeed": "LearnSpeed",
            "Load": "Load",
            "On": "On",
            "Off": "Off",
            "Pause": "Pause",
            "Rate1": "Rate1",
            "Select": "Select",
            "SelFix": "SelFix",
            "Speed1": "Speed1",
            "Swop": "Swop",
            "Time": "Time",
            "Temp": "Temp",
            "Toggle": "Toggle",
            "Top": "Top"
          }
        },
        "Value": {"type": "Boolean", "default":0, "mappingIndex": 0}
      }
    },
    "Move GrandMaster Fader":
    {
      "menu":"",  
      "callback":"moveGrandMasterFader",
      "parameters":
      {
        "GrandMaster": 
        {
          "type":"Enum", "options": 
          {
            "Master": "1", 
            "World": "2", 
            "Highlite": "3",
            "Lowlight": "4",
            "Solo": "5",
            "Rate": "6",
            "Speed": "7",
            "ProgramTime": "8",
            "ProgramXFade": "9",
            "ExecutorTime": "10",
            "ExecutorXFade": "11",
            "ProgramSpeed": "12",
            "Blind": "13",
            "SoundOut": "14",
            "SoundIn": "15",
            "SoundFade": "16"
          }
        },
        "Value": {"type": "Float", "ui":"slider", "min":0, "max":1, "default":0, "mappingIndex": 0}
      }
    },
    "Move GrandMaster BPM Fader":
    {
      "menu":"",  
      "callback":"moveGrandMasterBpmFader",
      "parameters":
      {
        "GrandMaster": 
        {
          "type":"Enum", "options": 
          {
            "Speed": "7",
            "ProgramSpeed": "12"
          }
        },
        "Value": {"type": "Float", "ui":"slider", "min":0, "max":240, "default":0, "mappingIndex": 0}
      }
    },
    "Move SpeedMaster Fader":
    {
      "menu":"",  
      "callback":"moveSpeedMasterFader",
      "parameters":
      {
        "SpeedMaster": {"type": "Integer", "min":1, "max":16, "default":1, "description":"The number of the SpeedMaster"},
        "Value": {"type": "Float", "ui":"slider", "min":0, "max":1, "default":0, "mappingIndex": 0}
      }
    },
    "Move SpeedMaster BPM Fader":
    {
      "menu":"",  
      "callback":"moveSpeedMasterBpmFader",
      "parameters":
      {
        "SpeedMaster": {"type": "Integer", "min":1, "max":16, "default":1, "description":"The number of the SpeedMaster"},
        "Value": {"type": "Float", "ui":"slider", "min":0, "max":240, "default":0, "mappingIndex": 0}
      }
    },
    "Turn Encoder":
    {
      "menu":"",  
      "callback":"turnEncoder",
      "parameters":
      {
        "Encoder": 
        {
          "type":"Enum", "options": 
          {
            "Dimmer": "Dimmer",
            "Pan": "Pan",
            "Tilt": "Tilt",
            "Shutter1": "Shutter1",
            "Prism1": "Prism1",
            "Focus1": "Focus1",
            "Zoom": "Zoom",
            "Gobo1": "Gobo1",
            "Gobo2": "Gobo2",
            "Color1": "Color1",
            "ColorRGB_R": "ColorRGB_R",
            "ColorRGB_G": "ColorRGB_G",
            "ColorRGB_B": "ColorRGB_B",
            "ColorRGB_W": "ColorRGB_W",
            "ColorRGB_WW": "ColorRGB_WW",
            "ColorRGB_CW": "ColorRGB_CW",
            "ColorRGB_UV": "ColorRGB_UV",
            "Blower1": "Blower1",
            "Haze1": "Haze1"
          }
        },
        "Multiplicator": {"type": "Float", "min":-10, "max":10, "default":1, "description":"Speed of the encoder movement, only relevant for endless encoders"},
        "Value": {"type": "Float", "ui":"slider", "min":-10, "max":10, "default":0, "mappingIndex": 0}
      }
    },
    "Send Command":
    {
      "menu":"",  
      "callback":"sendCommand",
      "parameters":
      {
        "command": {"type":"String", "default":"clear"}
      }
    },
    "Set Preview":
    {
      "menu":"",  
      "callback":"setPreview",
      "parameters":
      {
        "status": {"type":"Boolean", "default":0, "mappingIndex": 0}
      }
    },
    "Set Blind":
    {
      "menu":"",  
      "callback":"setBlind",
      "parameters":
      {
        "status": {"type":"Boolean", "default":0, "mappingIndex": 0}
      }
    },
    "Set Freeze":
    {
      "menu":"",  
      "callback":"setFreeze",
      "parameters":
      {
        "status": {"type":"Boolean", "default":0, "mappingIndex": 0}
      }
    }
  }
}
pmjcontroller1 commented 1 year ago

and granMA3 file

var sequenceContainer = {};

function init() {
  script.log("grandMA3 module loaded");
}

function moduleParameterChanged(param) {
  script.log(param.name + " parameter changed, new value: " + param.get());
}

function moduleValueChanged(value) {
  if(value.name == "preview") {
    if(value.get()) {
      local.send("/cmd", "preview on");
    }
    else {
      local.send("/cmd", "preview off");
    }
  }
  else if(value.name == "blind") {
    if(value.get()) {
      local.send("/cmd", "blind on");
    }
    else {
      local.send("/cmd", "blind off");
    }
  }
  else if(value.name == "freeze") {
    if(value.get()) {
      local.send("/cmd", "freeze on");
    }
    else {
      local.send("/cmd", "freeze off");
    }
  }
}

function moveExecutorFader(Allpage, page, executor, offset, value) {
  var range = local.parameters.faderRange.get();
  executor = executor + offset;
  if (Allpage ==1) {
    local.send("/Fader" + executor + "/", value*range);
    }
  else {
    local.send("/Page" + page + "/Fader" + executor + "/", value*range);
  }
}

function pushExecutorButton(allpage, page, executor, offset, value) {
  if(value) value = 1;
  executor = executor + offset;
  if (Allpage ==1) {
    local.send("/Key" + executor + "/", value);
    }
  else {
    local.send("/Page" + page + "/Key" + executor + "/", value);
  }
 }

function turnExecutorEncoder( allpage, page, executor, offset, multiplicator) {
  executor = executor + offset;
  if(allpage == 1){
     local.send("/Encoder" + executor + "/", multiplicator);
     }
  else {local.send("/Page" + page + "/Encoder" + executor + "/", multiplicator);
     }
}

function moveSequenceFader(sequenceNumber, offset, fader, value) {
  var range = local.parameters.faderRange.get();
  sequenceNumber = sequenceNumber + offset;
  local.send("/13.13.1.6." + sequenceNumber, fader, 1, value*range);
}

function pushSequenceButton(sequenceNumber, offset, button, value) {
  sequenceNumber = sequenceNumber + offset;
  if(value) value = 1;
  local.send("/13.13.1.6." + sequenceNumber, button, value);
}

function moveGrandMasterFader(grandMaster, value) {
  var range = local.parameters.faderRange.get();
  local.send("/13.12.2." + grandMaster, "FaderMaster", 1, value*range);
}

function moveGrandMasterBpmFader(grandMaster, value) {
  var range = local.parameters.faderRange.get();
  local.send("/13.12.2." + grandMaster, "FaderMaster", 1, Math.sqrt(value/240)*range);
}

function moveSpeedMasterFader(speedMaster, value) {
  var range = local.parameters.faderRange.get();
  local.send("/13.12.3." + speedMaster, "FaderMaster", 1, value*range);
}

function moveSpeedMasterBpmFader(speedMaster, value) {
  var range = local.parameters.faderRange.get();
  local.send("/13.12.3." + speedMaster, "FaderMaster", 1, Math.sqrt(value/240)*range);
}

function turnEncoder(encoder, multiplicator, value) {
  script.log("Attribute " + encoder + " at + " + value*multiplicator);
  local.send("/cmd", "Attribute " + encoder + " at + " + value*multiplicator);
}

function sendCommand(command) {
  local.send("/cmd", command);
}

function setPreview(onStatus) {
  local.values.preview.set(onStatus);
  if(onStatus) {
    local.send("/cmd", "preview on");
  }
  else {
    local.send("/cmd", "preview off");
  }
}

function setBlind(onStatus) {
  local.values.blind.set(onStatus);
  if(onStatus) {
    local.send("/cmd", "blind on");
  }
  else {
    local.send("/cmd", "blind off");
  }
}

function setFreeze(onStatus) {
  local.values.freeze.set(onStatus);
  if(onStatus) {
    local.send("/cmd", "freeze on");
  }
  else {
    local.send("/cmd", "freeze off");
  }
}
PixelLighting commented 1 year ago

@pmjcontroller1 yes it works now, you had an misstype in the MA3 file where the allpage was written small and in the Function itself big so it could not check if the Allpage was checked. i Fixed it myself quickly in my File so it works now i will send the Working Version with the fixed area i just send the Corected version of the area tha was afected.

MA3 File

function moveExecutorFader(Allpage, page, executor, offset, value) { var range = local.parameters.faderRange.get(); executor = executor + offset; if (Allpage ==1) { local.send("/Fader" + executor + "/", valuerange); } else { local.send("/Page" + page + "/Fader" + executor + "/", valuerange); } }

function pushExecutorButton(Allpage, page, executor, offset, value) { if(value) value = 1; executor = executor + offset; if (Allpage ==1) { local.send("/Key" + executor + "/", value); } else { local.send("/Page" + page + "/Key" + executor + "/", value); } }

function turnExecutorEncoder(Allpage, page, executor, offset, multiplicator) { executor = executor + offset; if(Allpage == 1){ local.send("/Encoder" + executor + "/", multiplicator); } else {local.send("/Page" + page + "/Encoder" + executor + "/", multiplicator); } }

and here the Cleaned up version for the Module one that the Functions all have the corect References

{

"Move Executor Fader": { "menu":"",
"callback":"moveExecutorFader", "parameters": { "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"},
"Page": {"type":"Integer","min":1,"max":9,"default":1}, "Executor": {"type": "Integer", "min":1, "max":490, "default":201}, "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, "Value": {"type": "Float", "ui":"slider", "min":0, "max":1, "default":0, "mappingIndex": 0} } }, "Push Executor Button": { "menu":"",
"callback":"pushExecutorButton", "parameters": { "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"}, "Page": {"type":"Integer","min":1,"max":9,"default":1}, "Executor": {"type": "Integer", "min":1, "max":490, "default":101}, "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, "Value": {"type": "Boolean", "default":0, "mappingIndex": 0} } }, "Turn Executor Encoder": { "menu":"",
"callback":"turnExecutorEncoder", "parameters": { "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"},
"Page": {"type":"Integer","min":1,"max":9,"default":1}, "Executor": {"type": "Integer", "min":301, "max":490, "default":301}, "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, "Multiplicator": {"type": "Float", "min":-10, "max":10, "default":1, "description":"Speed of the encoder movement, only relevant for endless encoders"} } },

end of Module Code

i hope now we have fixed all the things for ma3 1.9 github dont want to make the massage like yours sorry i dont know how im not so deep in github XD

pmjcontroller1 commented 1 year ago

HI @PixelLighting
Hello,

In your message I have detected that in this function function moveExecutorFader(Allpage, page, executor, offset, value) { var range = local.parameters.faderRange.get(); executor = executor + offset; if (Allpage ==1) { local.send("/Fader" + executor + "/", valuerange); } else { local.send("/Page" + page + "/Fader" + executor + "/", valuerange); }

You have an error you do not multiply the value * range check it

pmjcontroller1 commented 1 year ago

HI @PixelLighting
Hello,

In your message I have detected that in this function function moveExecutorFader(Allpage, page, executor, offset, value) { var range = local.parameters.faderRange.get(); executor = executor + offset; if (Allpage ==1) { local.send("/Fader" + executor + "/", valuerange); } else { local.send("/Page" + page + "/Fader" + executor + "/", valuerange); }

You have an error you do not multiply the value * range check it

@pmjcontroller1 yes it works now, you had an misstype in the MA3 file where the allpage was written small and in the Function itself big so it could not check if the Allpage was checked. i Fixed it myself quickly in my File so it works now i will send the Working Version with the fixed area i just send the Corected version of the area tha was afected.

MA3 File

function moveExecutorFader(Allpage, page, executor, offset, value) { var range = local.parameters.faderRange.get(); executor = executor + offset; if (Allpage ==1) { local.send("/Fader" + executor + "/", value_range); } else { local.send("/Page" + page + "/Fader" + executor + "/", value_range); } }

function pushExecutorButton(Allpage, page, executor, offset, value) { if(value) value = 1; executor = executor + offset; if (Allpage ==1) { local.send("/Key" + executor + "/", value); } else { local.send("/Page" + page + "/Key" + executor + "/", value); } }

function turnExecutorEncoder(Allpage, page, executor, offset, multiplicator) { executor = executor + offset; if(Allpage == 1){ local.send("/Encoder" + executor + "/", multiplicator); } else {local.send("/Page" + page + "/Encoder" + executor + "/", multiplicator); } }

and here the Cleaned up version for the Module one that the Functions all have the corect References

{

"Move Executor Fader": { "menu":"", "callback":"moveExecutorFader", "parameters": { "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"}, "Page": {"type":"Integer","min":1,"max":9,"default":1}, "Executor": {"type": "Integer", "min":1, "max":490, "default":201}, "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, "Value": {"type": "Float", "ui":"slider", "min":0, "max":1, "default":0, "mappingIndex": 0} } }, "Push Executor Button": { "menu":"", "callback":"pushExecutorButton", "parameters": { "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"}, "Page": {"type":"Integer","min":1,"max":9,"default":1}, "Executor": {"type": "Integer", "min":1, "max":490, "default":101}, "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, "Value": {"type": "Boolean", "default":0, "mappingIndex": 0} } }, "Turn Executor Encoder": { "menu":"", "callback":"turnExecutorEncoder", "parameters": { "Allpage": {"type": "Boolean", "description": "Activate this option to send this executor to the active page"}, "Page": {"type":"Integer","min":1,"max":9,"default":1}, "Executor": {"type": "Integer", "min":301, "max":490, "default":301}, "Offset": {"type": "Integer", "min":0, "max":490, "default":0, "description":"e.g. offset 200 and executor 2 results in 202"}, "Multiplicator": {"type": "Float", "min":-10, "max":10, "default":1, "description":"Speed of the encoder movement, only relevant for endless encoders"} } },

end of Module Code

i hope now we have fixed all the things for ma3 1.9 github dont want to make the massage like yours sorry i dont know how im not so deep in github XD

HI @PixelLighting
Hello,

In your message I have detected that in this function function moveExecutorFader(Allpage, page, executor, offset, value) { var range = local.parameters.faderRange.get(); executor = executor + offset; if (Allpage ==1) { local.send("/Fader" + executor + "/", valuerange); } else { local.send("/Page" + page + "/Fader" + executor + "/", valuerange); }

You have an error you do not multiply the value * range check it

PixelLighting commented 1 year ago

@pmjcontroller1 Hello, maybe i had an misstype but overall it works Pretty fine and i did nothing then change that all the "Allpage" are all Writen Big and Together so it will always have the Same Information i only changed this single Keywords nothing else.