From 3a4c50f9aa137717442b41ba3a2f602e6d0f7660 Mon Sep 17 00:00:00 2001 From: RikSolo Date: Tue, 19 May 2026 16:38:13 +0200 Subject: [PATCH] fader feedback v2.2 --- Fader Feedback 2/RB Fader Feedback v2_1.xml | 6 - Fader Feedback 2/RB Fader Feedback v2_2.xml | 6 + Fader Feedback 2/RBFaderFeedbackv2_1.lua | 105 ---------------- Fader Feedback 2/RBFaderFeedbackv2_2.lua | 132 ++++++++++++++++++++ 4 files changed, 138 insertions(+), 111 deletions(-) delete mode 100644 Fader Feedback 2/RB Fader Feedback v2_1.xml create mode 100644 Fader Feedback 2/RB Fader Feedback v2_2.xml delete mode 100644 Fader Feedback 2/RBFaderFeedbackv2_1.lua create mode 100644 Fader Feedback 2/RBFaderFeedbackv2_2.lua diff --git a/Fader Feedback 2/RB Fader Feedback v2_1.xml b/Fader Feedback 2/RB Fader Feedback v2_1.xml deleted file mode 100644 index 71c0e0d..0000000 --- a/Fader Feedback 2/RB Fader Feedback v2_1.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/Fader Feedback 2/RB Fader Feedback v2_2.xml b/Fader Feedback 2/RB Fader Feedback v2_2.xml new file mode 100644 index 0000000..aef5976 --- /dev/null +++ b/Fader Feedback 2/RB Fader Feedback v2_2.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/Fader Feedback 2/RBFaderFeedbackv2_1.lua b/Fader Feedback 2/RBFaderFeedbackv2_1.lua deleted file mode 100644 index b640b07..0000000 --- a/Fader Feedback 2/RBFaderFeedbackv2_1.lua +++ /dev/null @@ -1,105 +0,0 @@ --- Edit the variables below to suit your situation - -local faders = {201, 202, 203, 204, 205, 206, 207, 208, 209, 401, 402, 403, 404, 405, 406, 407, 408} -local keys = {201, 202, 203, 204, 205, 206, 207, 208, 101, 102, 103, 104, 105, 106, 107, 108, 109, 301, 302, 303, 304, 305, 306, 307, 308, 401, 402, 403, 404, 405,406, 407, 408, 191, 192, 193, 194, 195, 196, 197, 198, 291, 292, 293, 294, 295, 296, 297, 298} - --- how many seconds should be between updates. --- set this higher if you have performance issues --- you can go lower for smoother feedback at your own risk -local updateInterval = 0.1 - --- the name of the OSC object that feedback should be sent out from -local feedbackOSCName = "Feedback" - --- The name of the OSC object that receives OSC data. --- This object will automatically be enabled/disabled based on desk lock state --- so locking the desk will also prevent people from messing around with your faders -local inputOSCName = "SC" - --- set this to true if you don't want desk lock to disable OSC input --- this makes the "inputOSCName" variable irrelevant -local disableInputWhenLocked = false - --- run a full update every x amount of loops -local fullUpdateLoops = 20 - --- No need to edit anything under this line - - -local function sendOSC(type, id, value) - local address = "/Page/" .. type .. id - local cmd = 'SendOSC "' .. feedbackOSCName .. '" "' .. address .. ',f, ' .. value ..'"' - Cmd(cmd) -end - -local function buildValueStore(store, items, type) - for _, item in ipairs(items) do - store[#store + 1] = {id = item, type = type, value = nil} - sendOSC(type, item, 0) - end -end - - -local function main() - breakRBloops = false - - local currentLockedState = false - local valueStore = {} - - buildValueStore(valueStore, faders, "Fader") - buildValueStore(valueStore, keys, "Key") - - local iters = 0 - while not breakRBloops do - iters = iters + 1 - if (DeskLocked() ~= currentLockedState and disableInputWhenLocked == false) then - currentLockedState = DeskLocked() - - local receiveOSCValue = currentLockedState and 0 or 1 - Cmd('Set OSC "' .. inputOSCName .. '" "receive" ' .. receiveOSCValue) - Cmd('Set OSC "' .. inputOSCName .. '" "receivecommand" ' .. receiveOSCValue) - end - - for localExecId, storedExec in pairs(valueStore) do - local endValue = storedExec["value"] - local exec = GetExecutor(storedExec["id"]) - - if exec ~= nil then - if storedExec["type"] == "Fader" then - local faderValue = exec:GetFader({}) - endValue = faderValue - else -- exec is key - local obj = exec.object - endValue = 1 - - -- check if we're an active sequence - -- if it is, and it's active, send value 2 - if obj ~= nil and obj.type == "Sequence" then - if obj:HasActivePlayback() then - endValue = 2 - end - end - end - else -- exec is nil - endValue = nil - end - - -- if the value has changed, send feedback over - if (storedExec["value"] ~= endValue or iters == fullUpdateLoops) then - local sendValue = endValue == nil and 0 or endValue - sendOSC(storedExec["type"], storedExec["id"], sendValue) - end - - valueStore[localExecId]["value"] = endValue - end - - if iters == fullUpdateLoops then - iters = 0 - - end - - coroutine.yield(updateInterval) - end -end - -return main \ No newline at end of file diff --git a/Fader Feedback 2/RBFaderFeedbackv2_2.lua b/Fader Feedback 2/RBFaderFeedbackv2_2.lua new file mode 100644 index 0000000..e37ab10 --- /dev/null +++ b/Fader Feedback 2/RBFaderFeedbackv2_2.lua @@ -0,0 +1,132 @@ +-- Edit the variables below to suit your situation + +local faders = {201, 202, 203, 204, 205, 206, 207, 208, 209, 401, 402, 403, 404, 405, 406, 407, 408} +local keys = {201, 202, 203, 204, 205, 206, 207, 208, 101, 102, 103, 104, 105, 106, 107, 108, 109, 301, 302, 303, 304, 305, 306, 307, 308, 401, 402, 403, 404, 405,406, 407, 408, 191, 192, 193, 194, 195, 196, 197, 198, 291, 292, 293, 294, 295, 296, 297, 298} + +-- how many seconds should be between updates. +-- set this higher if you have performance issues +-- you can go lower for smoother feedback at your own risk +local updateInterval = 0.1 + +-- the name of the OSC object that feedback should be sent out from +local feedbackOSCName = "Feedback" + +-- The name of the OSC object that receives OSC data. +-- This object will automatically be enabled/disabled based on desk lock state +-- so locking the desk will also prevent people from messing around with your faders +local inputOSCName = "SC" + +-- set this to true if you don't want desk lock to disable OSC input +-- this makes the "inputOSCName" variable irrelevant +local disableInputWhenLocked = false + +-- run a full update every x amount of loops +local fullUpdateLoops = 20 + +-- if this is turned on, button feedback for sequences will have value 2 for "active" +-- it will also send 4 osc arguments when a sequence has an appearance +-- data being active,red,green,blue where active is 1 +-- set to false for only getting 0 or 1 values +local enhancedSequenceFeedback = true + +-- No need to edit anything under this line + + +local function sendOSC(type, id, value, valueType) + if valueType == nil then valueType = 'f' end + local address = "/Page/" .. type .. id + local cmd = 'SendOSC "' .. feedbackOSCName .. '" "' .. address .. ',' .. valueType .. ',' .. value ..'"' + Cmd(cmd) +end + +local function buildValueStore(store, items, type) + for _, item in ipairs(items) do + store[#store + 1] = {id = item, type = type, value = nil} + sendOSC(type, item, 0) + end +end + + +local function main() + breakRBloops = false + + local currentLockedState = false + local valueStore = {} + + buildValueStore(valueStore, faders, "Fader") + buildValueStore(valueStore, keys, "Key") + + local iters = 0 + while not breakRBloops do + iters = iters + 1 + if (DeskLocked() ~= currentLockedState and disableInputWhenLocked == false) then + currentLockedState = DeskLocked() + + local receiveOSCValue = currentLockedState and 0 or 1 + Cmd('Set OSC "' .. inputOSCName .. '" "receive" ' .. receiveOSCValue) + Cmd('Set OSC "' .. inputOSCName .. '" "receivecommand" ' .. receiveOSCValue) + end + + for localExecId, storedExec in pairs(valueStore) do + local endValue = storedExec["value"] + local sendType = "f" + local exec = GetExecutor(storedExec["id"]) + + if exec ~= nil then + if storedExec["type"] == "Fader" then + local faderValue = exec:GetFader({}) + endValue = faderValue + else -- exec is key + local obj = exec.object + endValue = 1 + + if enhancedSequenceFeedback then + if obj ~= nil and obj.type == "Macro" then + endValue = "1,255,0,0" + sendType = "ffff" + end + + -- check if we're an active sequence + -- if it is, and it's active, send value 2 + if obj ~= nil and obj.type == "Sequence" then + if obj:HasActivePlayback() then + endValue = 2 + end + end + + -- Send appearance color + activity + if obj ~= nil then + local appearance = obj.Appearance + if appearance ~= nil then + endValue = endValue .. + "," .. appearance.BackR .. + "," .. appearance.BackG .. + "," .. appearance.BackB + + sendType = "ffff" + end + end + end + end + else -- exec is nil + endValue = nil + end + + -- if the value has changed, send feedback over + if (storedExec["value"] ~= endValue or iters == fullUpdateLoops) then + local sendValue = endValue == nil and 0 or endValue + sendOSC(storedExec["type"], storedExec["id"], sendValue, sendType) + end + + valueStore[localExecId]["value"] = endValue + end + + if iters == fullUpdateLoops then + iters = 0 + end + + coroutine.yield(updateInterval) + end +end + +return main \ No newline at end of file