====== OpenStageControl ====== ===== Notes ===== ==== update property ==== receive('/EDIT', 'text_1', { value: "abcd", widgets: [] }); ===== GrandMa1/Dot2 ===== ==== Config ==== {"osc-port":8001,"midi":["sysex","gma_in:1,2","gma_out:0,1"],"force-gpu":true,"custom-module":"D:\\Documents\\perso\\dev\\openstagecontrol\\test-clones.js","load":"D:\\Documents\\perso\\dev\\openstagecontrol\\test-clones.json"} ==== Module ==== /* sysex = f0 7f 70 02 01 01 31 2e 30 30 30 f7 univeral sysex = 127 device id = 112 msc = 2 command format = 1 command = 1 fader = 49 fader page = 46 fine value = 48 coarse value = 48 sysex = f0 7f 70 02 01 0a 30 2e 30 30 30 f7 univeral sysex = 127 device id = 112 msc = 2 command format = 1 command = 10 fader = 48 fader page = 46 fine value = 48 coarse value = 48 f0 7f usiversal sysex 70 device id 02 msc 01 command format (01 = general lighting) 0a command 30 2e 30 30 30 data f7 end =========== go 2.0 exec 2.1 =========== 0 f0 (240) 1 7f (127) universal sysex 2 7f (127) device id 3 02 (2) msc 4 01 (1) command format 5 01 (1) command 6 32 (50) ascii 2 7 2e (46) ascii . 8 30 (48) ascii 0 9 30 (48) ascii 0 10 30 (48) ascii 0 11 00 (0) ascii null 12 32 (50) ascii 2 13 2e (46) ascii . 14 31 (49) ascii 1 15 f7 (247) =========== go 1.0 exec 2.1 =========== 0 f0 (240) 1 7f (127) universal sysex 2 7f (127) device id 3 02 (2) msc 4 01 (1) command format 5 01 (1) command (1 = goto) 6 31 (49) ascii 1 7 2e (46) ascii . 8 30 (48) ascii 0 9 30 (48) ascii 0 10 30 (48) ascii 0 11 00 (0) ascii null 12 32 (50) ascii 2 13 2e (46) ascii . 14 31 (49) ascii 1 15 f7 (247) =========== goto 1.0 exec 2.1 =========== 0 f0 (240) 1 7f (127) universal sysex 2 7f (127) device id 3 02 (2) msc 4 01 (1) command format 5 01 (1) command (1 = goto) 6 31 (49) ascii 1 7 2e (46) . 8 30 (48) ascii 0 9 30 (48) ascii 0 10 30 (48) ascii 0 11 00 (0) ascii null 12 32 (50) ascii 2 13 2e (46) . 14 31 (49) ascii 1 15 f7 (247) =========== off exec 2.1 ============== 0 f0 (240) 1 7f (127) universal sysex 2 7f (127) device id (127) 3 02 (2) msc 4 01 (1) command format (01 = general lighting) 5 0a (10) command (10) 6 30 (48) ascii 0 7 2e (46) . 8 30 (48) ascii 0 9 30 (48) ascii 0 10 30 (48) ascii 0 11 00 (0) ascii null 12 32 (50) ascii 2 13 2e (46) . 14 31 (49) ascii 1 15 f7 (247) ========= fader move =============== 0 f0 1 7f universal sysex 2 70 device id 3 02 msc 4 01 command format (01 = general lighting) 5 06 command (06 = set) 6 00 fader 1 7 01 page 1 8 7f 127 fine 9 7f 127 coarse 10 f7 fader value : fader @45% = 45 * 1.28 = 57.6 coarse = 57 06 * 128 = 76.8 fine = 76 inverse = Math.floor((new_fine_value + coarse_value) / 1.28) osc address : /sysex osc target : midi:gma_in */ INPUT_MIDI_DEVICE_NAME = 'gma_out'; OUTPUT_MIDI_DEVICE_NAME = 'gma_in'; DEBUG = false; function faderToHex(fader_value) { var temp_coarse = fader_value * 1.28; var coarse = Math.floor(temp_coarse); var coarse_hex = coarse.toString(16); if (coarse < 16) coarse_hex = "0"+ coarse_hex; var coarse_decimals = (temp_coarse %1).toFixed(2); var temp_fine = coarse_decimals * 128; var fine = Math.floor(temp_fine); var fine_hex = fine.toString(16); if (fine < 16) fine_hex = "0"+ fine_hex; return { 'coarse': coarse_hex, 'fine': fine_hex } } function hexToFader(coarse, fine) { return Math.floor(((fine / 128) + coarse) / 1.28); } function moveOSCFader(host, port, address, args) { if (!(host === 'midi' && address === '/sysex' && port === INPUT_MIDI_DEVICE_NAME)) return; // hexadecimal string value var sysex_string = args[0].value if (DEBUG) console.log("sysex = " + sysex_string); // convert string to array of integers var ints = sysex_string.split(" ").map(x=>parseInt(x, 16)) // parse items var [ sysex_start, universal_sysex, device_id, msc, command_format, command, fader, fader_page, fine_value, coarse_value, sysex_end ] = ints; // if command = set if (command == 6) { var fader_percent = hexToFader(coarse_value, fine_value); if (DEBUG) console.log("fader percent = "+ fader_percent); receive("/fader_"+fader,fader,fader_percent); } return true; } function moveMaFader(host, port, address, args) { if (host !== 'midi' || port !== OUTPUT_MIDI_DEVICE_NAME || address === '/note') return; var fader_id = args[0].value, fader_value = Math.ceil(args[1].value), outArgs = []; var fader_id_hex = fader_id.toString(16); if (fader_id < 16) fader_id_hex = "0"+ fader_id_hex; var hex_values = faderToHex(fader_value); var sysex = 'f0 7f 70 02 01 06 '+ fader_id_hex+ ' 01 '+ hex_values.fine+ ' '+ hex_values.coarse+ ' f7'; send('midi', OUTPUT_MIDI_DEVICE_NAME, '/sysex', sysex); return true; } module.exports = { oscInFilter: (data)=>{ if (DEBUG) console.log("in data : "+ JSON.stringify(data, null, 2)); var {host, port, address, args} = data; if (moveOSCFader(host, port, address, args)) return; return data }, oscOutFilter: (data)=>{ var {host, port, address, args} = data; //console.log("out data : "+ JSON.stringify(data, null, 2));return; if (moveMaFader(host, port, address, args)) return; return data; } } ==== Session ==== { "createdWith": "Open Stage Control", "version": "1.22.0", "type": "session", "content": { "type": "root", "lock": false, "id": "root", "visible": true, "interaction": true, "comments": "", "width": "auto", "height": "auto", "colorText": "auto", "colorWidget": "auto", "alphaFillOn": "auto", "borderRadius": "auto", "padding": "auto", "html": "", "css": "", "colorBg": "auto", "layout": "default", "justify": "start", "gridTemplate": "", "contain": true, "scroll": true, "innerPadding": true, "verticalTabs": false, "hideMenu": false, "variables": "@{parent.variables}", "traversing": false, "value": "", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "", "widgets": [], "tabs": [ { "type": "tab", "lock": false, "id": "tab_1", "visible": true, "interaction": true, "comments": "", "colorText": "auto", "colorWidget": "auto", "colorFill": "auto", "borderRadius": "auto", "padding": "auto", "html": "", "css": "", "colorBg": "auto", "layout": "default", "justify": "start", "gridTemplate": "", "contain": true, "scroll": true, "innerPadding": true, "verticalTabs": false, "label": "Exec", "variables": "@{parent.variables}", "traversing": false, "value": "", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "", "widgets": [ { "type": "panel", "top": 10, "left": 20, "lock": false, "id": "panel_1", "visible": true, "interaction": true, "comments": "", "width": 1030, "height": 470, "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "#fdb06d", "colorFill": "#000000", "alphaStroke": "auto", "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": "auto", "borderRadius": 24, "padding": "auto", "html": "", "css": "", "value": "", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "", "colorBg": "auto", "layout": "default", "justify": "start", "gridTemplate": "", "contain": true, "scroll": true, "innerPadding": true, "verticalTabs": false, "variables": { "id_start": 0 }, "traversing": false, "widgets": [ { "type": "panel", "top": 10, "left": 10, "lock": false, "id": "exec_@{parent.variables.id_start}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "auto", "colorFill": "auto", "alphaStroke": 0, "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": "auto", "borderRadius": "auto", "padding": "auto", "html": "
@{this.variables.name}
", "css": "", "colorBg": "auto", "layout": "default", "justify": "start", "gridTemplate": "", "contain": true, "scroll": true, "innerPadding": true, "verticalTabs": false, "variables": "{\n \"button_index\": #{@{this.id}.slice(5)},\n \"fader_index\": 0,\n \"name\": \"Exec 0\",\n \"button_1_label\": \"\",\n \"button_2_label\": \"B2\",\n \"button_3_label\": \"B3\"\n}", "traversing": false, "value": "", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "", "widgets": [ { "type": "button", "top": 0, "left": 0, "lock": false, "id": "button_3-#{@{parent.variables.button_index}+2}", "visible": true, "interaction": true, "comments": "", "width": "100%", "height": "auto", "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "#fdb06d", "colorFill": "#000000", "alphaStroke": "auto", "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": 2, "borderRadius": 6, "padding": "auto", "html": "", "css": "", "colorTextOn": "auto", "label": "auto", "vertical": false, "wrap": false, "on": 1, "off": 0, "mode": "push", "doubleTap": false, "decoupled": false, "value": "", "default": 0, "linkId": "", "address": "/note", "preArgs": "[\n 1,\n #{@{parent.variables.button_index}+2}\n]", "typeTags": "", "decimals": 2, "target": "@{gma_in}", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "" }, { "type": "fader", "top": 130, "left": 0, "lock": false, "id": "fader_@{parent.variables.fader_index}", "visible": true, "interaction": true, "comments": "", "width": "100%", "height": "auto", "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "#fdcf6d", "colorFill": "#fdd66d", "alphaStroke": "auto", "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": 2, "borderRadius": "auto", "padding": "auto", "html": "
@{this.value}
", "css": "", "design": "compact", "knobSize": 24, "horizontal": false, "pips": false, "dashed": false, "gradient": [], "snap": false, "spring": false, "doubleTap": false, "range": { "min": 0, "max": 100 }, "logScale": false, "sensitivity": 1, "steps": "", "origin": "auto", "value": "", "default": "", "linkId": "", "address": "auto", "preArgs": "@{parent.variables.fader_index}", "typeTags": "", "decimals": 2, "target": "@{gma_in}", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "", "onTouch": "" }, { "type": "button", "top": 70, "left": 0, "lock": false, "id": "button_2-#{@{parent.variables.button_index}+1}", "visible": true, "interaction": true, "comments": "", "width": "100%", "height": "auto", "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "#fdb06d", "colorFill": "#000000", "alphaStroke": "auto", "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": 2, "borderRadius": 6, "padding": "auto", "html": "", "css": "", "colorTextOn": "auto", "label": "auto", "vertical": false, "wrap": false, "on": 1, "off": 0, "mode": "push", "doubleTap": false, "decoupled": false, "value": "", "default": 0, "linkId": "", "address": "/note", "preArgs": "[\n 1,\n #{@{parent.variables.button_index}+1}\n]", "typeTags": "", "decimals": 2, "target": "@{gma_in}", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "" }, { "type": "button", "top": 340, "left": 0, "lock": false, "id": "button_1-@{parent.variables.button_index}", "visible": true, "interaction": true, "comments": "", "width": "100%", "height": "auto", "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "#fdb06d", "colorFill": "#000000", "alphaStroke": "auto", "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": 2, "borderRadius": 6, "padding": "auto", "html": "", "css": "", "colorTextOn": "auto", "label": "auto", "vertical": false, "wrap": false, "on": 1, "off": 0, "mode": "push", "doubleTap": false, "decoupled": false, "value": "", "default": 0, "linkId": "", "address": "/note", "preArgs": "[\n 1,\n @{parent.variables.button_index}\n]", "typeTags": "", "decimals": 2, "target": "@{gma_in}", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "\n" } ], "tabs": [] }, { "type": "clone", "top": 10, "left": 110, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+1)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 210, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+2)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 310, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+3)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 410, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+4)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 510, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+5)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 610, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+6)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 710, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+7)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 810, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+8)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 910, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+9)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" } ], "tabs": [] }, { "type": "variable", "lock": false, "id": "gma_in", "comments": "", "value": "midi:gma_in", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "" }, { "type": "variable", "lock": false, "id": "gma_out", "comments": "", "value": "midi:gma_out", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "" }, { "type": "panel", "top": 500, "left": 20, "lock": false, "id": "panel_2", "visible": true, "interaction": true, "comments": "", "width": 1030, "height": 470, "expand": "false", "colorText": "auto", "colorWidget": "auto", "colorStroke": "#fdb06d", "colorFill": "#000000", "alphaStroke": "auto", "alphaFillOff": "auto", "alphaFillOn": "auto", "lineWidth": "auto", "borderRadius": 24, "padding": "auto", "html": "", "css": "", "value": "", "default": "", "linkId": "", "address": "auto", "preArgs": "", "typeTags": "", "decimals": 2, "target": "", "ignoreDefaults": false, "bypass": false, "onCreate": "", "onValue": "", "colorBg": "auto", "layout": "default", "justify": "start", "gridTemplate": "", "contain": true, "scroll": true, "innerPadding": true, "verticalTabs": false, "variables": { "id_start": 10 }, "traversing": false, "widgets": [ { "type": "clone", "top": 10, "left": 110, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+1)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 210, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+2)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 310, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+3)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 410, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+4)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 510, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+5)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 610, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+6)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 710, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+7)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 810, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+8)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 910, "lock": false, "id": "exec_#{parseInt(@{parent.variables.id_start}+9)}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" }, { "type": "clone", "top": 10, "left": 10, "lock": false, "id": "exec_@{parent.variables.id_start}", "visible": true, "interaction": true, "comments": "", "width": 100, "height": 440, "expand": "false", "css": "", "widgetId": "exec_0", "props": "{\n \"variables\": { \"button_index\": #{parseInt(@{this.id}.slice(5))*3}, \"fader_index\": #{parseInt(@{this.id}.slice(5))}, \"name\": \"Exec #{@{this.id}.slice(5)}\", \"button_1_label\": \"B1\", \"button_2_label\": \"B2\", \"button_3_label\": \"B3\" }\n}", "address": "auto", "variables": "@{parent.variables}" } ], "tabs": [] } ], "tabs": [] } ] } }
==== GrandMa macro ==== Delete Remote 2.1 Thru Assign Remote 2.1 /note=0 /type=exec /executor=1 /Button="Button 1" Assign Remote 2.2 /note=1 /type=exec /executor=1 /Button="Button 2" Assign Remote 2.3 /note=2 /type=exec /executor=1 /Button="Button 3" Assign Remote 2.4 /note=3 /type=exec /executor=2 /Button="Button 1" Assign Remote 2.5 /note=4 /type=exec /executor=2 /Button="Button 2" Assign Remote 2.6 /note=5 /type=exec /executor=2 /Button="Button 3" Assign Remote 2.7 /note=6 /type=exec /executor=3 /Button="Button 1" Assign Remote 2.8 /note=7 /type=exec /executor=3 /Button="Button 2" Assign Remote 2.9 /note=8 /type=exec /executor=3 /Button="Button 3" Assign Remote 2.10 /note=9 /type=exec /executor=4 /Button="Button 1" Assign Remote 2.11 /note=10 /type=exec /executor=4 /Button="Button 2" Assign Remote 2.12 /note=11 /type=exec /executor=4 /Button="Button 3" Assign Remote 2.13 /note=12 /type=exec /executor=5 /Button="Button 1" Assign Remote 2.14 /note=13 /type=exec /executor=5 /Button="Button 2" Assign Remote 2.15 /note=14 /type=exec /executor=5 /Button="Button 3" Assign Remote 2.16 /note=15 /type=exec /executor=6 /Button="Button 1" Assign Remote 2.17 /note=16 /type=exec /executor=6 /Button="Button 2" Assign Remote 2.18 /note=17 /type=exec /executor=6 /Button="Button 3" Assign Remote 2.19 /note=18 /type=exec /executor=7 /Button="Button 1" Assign Remote 2.20 /note=19 /type=exec /executor=7 /Button="Button 2" Assign Remote 2.21 /note=20 /type=exec /executor=7 /Button="Button 3" Assign Remote 2.22 /note=21 /type=exec /executor=8 /Button="Button 1" Assign Remote 2.23 /note=22 /type=exec /executor=8 /Button="Button 2" Assign Remote 2.24 /note=23 /type=exec /executor=8 /Button="Button 3" Assign Remote 2.25 /note=24 /type=exec /executor=9 /Button="Button 1" Assign Remote 2.26 /note=25 /type=exec /executor=9 /Button="Button 2" Assign Remote 2.27 /note=26 /type=exec /executor=9 /Button="Button 3" Assign Remote 2.28 /note=27 /type=exec /executor=10 /Button="Button 1" Assign Remote 2.29 /note=28 /type=exec /executor=10 /Button="Button 2" Assign Remote 2.30 /note=29 /type=exec /executor=10 /Button="Button 3" Assign Remote 2.31 /note=30 /type=exec /executor=11 /Button="Button 1" Assign Remote 2.32 /note=31 /type=exec /executor=11 /Button="Button 2" Assign Remote 2.33 /note=32 /type=exec /executor=11 /Button="Button 3" Assign Remote 2.34 /note=33 /type=exec /executor=12 /Button="Button 1" Assign Remote 2.35 /note=34 /type=exec /executor=12 /Button="Button 2" Assign Remote 2.36 /note=35 /type=exec /executor=12 /Button="Button 3" Assign Remote 2.37 /note=36 /type=exec /executor=13 /Button="Button 1" Assign Remote 2.38 /note=37 /type=exec /executor=13 /Button="Button 2" Assign Remote 2.39 /note=38 /type=exec /executor=13 /Button="Button 3" Assign Remote 2.40 /note=39 /type=exec /executor=14 /Button="Button 1" Assign Remote 2.41 /note=40 /type=exec /executor=14 /Button="Button 2" Assign Remote 2.42 /note=41 /type=exec /executor=14 /Button="Button 3" Assign Remote 2.43 /note=42 /type=exec /executor=15 /Button="Button 1" Assign Remote 2.44 /note=43 /type=exec /executor=15 /Button="Button 2" Assign Remote 2.45 /note=44 /type=exec /executor=15 /Button="Button 3" Assign Remote 2.46 /note=45 /type=exec /executor=16 /Button="Button 1" Assign Remote 2.47 /note=46 /type=exec /executor=16 /Button="Button 2" Assign Remote 2.48 /note=47 /type=exec /executor=16 /Button="Button 3" Assign Remote 2.49 /note=48 /type=exec /executor=17 /Button="Button 1" Assign Remote 2.50 /note=49 /type=exec /executor=17 /Button="Button 2" Assign Remote 2.51 /note=50 /type=exec /executor=17 /Button="Button 3" Assign Remote 2.52 /note=51 /type=exec /executor=18 /Button="Button 1" Assign Remote 2.53 /note=52 /type=exec /executor=18 /Button="Button 2" Assign Remote 2.54 /note=53 /type=exec /executor=18 /Button="Button 3" Assign Remote 2.55 /note=54 /type=exec /executor=19 /Button="Button 1" Assign Remote 2.56 /note=55 /type=exec /executor=19 /Button="Button 2" Assign Remote 2.57 /note=56 /type=exec /executor=19 /Button="Button 3" Assign Remote 2.58 /note=57 /type=exec /executor=20 /Button="Button 1" Assign Remote 2.59 /note=58 /type=exec /executor=20 /Button="Button 2" Assign Remote 2.60 /note=59 /type=exec /executor=20 /Button="Button 3"