GrandMA3-Plugins/Fader Feedback 2/RBFaderFeedbackv2_1.lua

105 lines
No EOL
3.2 KiB
Lua

-- 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