From 1a76bacf0cb2af8b8abf48b02830013ed101d492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ebbe=20Ba=C3=9F?= Date: Mon, 9 Sep 2024 18:56:26 +0200 Subject: [PATCH] updated code so all execs work with appearances and made it more efficient MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ebbe Baß --- MA3 OSC FEEDBACK copy.lua | 105 +++++++++++++++++++++++++++++++++ MA3 OSC FEEDBACK.lua | 121 ++++++++++++++++++-------------------- 2 files changed, 161 insertions(+), 65 deletions(-) create mode 100644 MA3 OSC FEEDBACK copy.lua diff --git a/MA3 OSC FEEDBACK copy.lua b/MA3 OSC FEEDBACK copy.lua new file mode 100644 index 0000000..afe2ade --- /dev/null +++ b/MA3 OSC FEEDBACK copy.lua @@ -0,0 +1,105 @@ +local executor_table = {101,102,103,104,105,106,107,108,201,202,203,204,205,206,207,208,301,302,303,304,305,306,307,308,401,402,403,404,405,406,407,408,291,292,293,294,295,296,297,298,191,192,193,194,195,196,197,198} +local osc_config = 1 +local osc_template = 'SendOSC %i "/%s%i,i,%i"' +local osc_str_template = 'SendOSC %i "/%s%i,s,%s"' +local enabled = false +local Printf, Echo, GetExecutor, Cmd, ipairs, mfloor = Printf, Echo, GetExecutor, Cmd, ipairs, math.floor +local debug = false +local fallback_col_R = 0 +local fallback_col_G = 0 +local fallback_col_B = 0 + +local function debug_print(msg) + if debug then + Printf(msg) + end +end + +local function send_osc(etype, exec_no, value) + debug_print(osc_template:format(osc_config, etype, exec_no, value)) + Cmd(osc_template:format(osc_config, etype, exec_no, value)) +end + +local function poll(exec_no) + local exec = GetExecutor(exec_no) + local execAssObjNoClass = exec and exec:GetAssignedObj() + if not execAssObjNoClass then + debug_print('Empty playback found on:'..tostring(exec_no)) + send_osc('Key', exec_no, 0) + if exec_no >= 291 and exec_no <= 298 or exec_no >= 191 and exec_no <= 198 then + Cmd(osc_str_template:format(osc_config, "xKey", exec_no, "")) + send_osc("ExecCol_R", exec_no, 31) + send_osc("ExecCol_G", exec_no, 31) + send_osc("ExecCol_B", exec_no, 36) + end + else + local execAssObj = exec and exec:GetAssignedObj():GetClass() + if execAssObj == 'Sequence' then + debug_print('Sequence found on:'..tostring(exec_no)) + send_osc('Key', exec_no, 1) + fallback_col_R = 166 + fallback_col_G = 125 + fallback_col_B = 0 + elseif execAssObj == 'Group' then + debug_print('Group found on:'..tostring(exec_no)) + send_osc('Key', exec_no, 2) + fallback_col_R = 0 + fallback_col_G = 64 + fallback_col_B = 128 + elseif execAssObj == 'Preset' then + debug_print('Preset found on:'..tostring(exec_no)) + send_osc('Key', exec_no, 3) + fallback_col_R = 0 + fallback_col_G = 128 + fallback_col_B = 128 + elseif execAssObj == 'Master' then + debug_print('Master found on:'..tostring(exec_no)) + send_osc('Key', exec_no, 4) + fallback_col_R = 0 + fallback_col_G = 128 + fallback_col_B = 128 + + else + debug_print('weird, this is not a sequence, group, preset or master.') + end + local assObjApp = execAssObjNoClass:Get("Appearance") + if assObjApp ~= nil then + local assObjApp = tostring(assObjApp) + local assObjApp = assObjApp:gsub("Appearance ", "") + local assObjApp = tonumber(assObjApp) + local appearanceR = tonumber(ShowData().Appearances[assObjApp].BackR) + local appearanceG = tonumber(ShowData().Appearances[assObjApp].BackG) + local appearanceB = tonumber(ShowData().Appearances[assObjApp].BackB) + send_osc("ExecCol_R", exec_no, appearanceR) + send_osc("ExecCol_G", exec_no, appearanceG) + send_osc("ExecCol_B", exec_no, appearanceB) + else + send_osc("ExecCol_R", exec_no, fallback_col_R) + send_osc("ExecCol_G", exec_no, fallback_col_G) + send_osc("ExecCol_B", exec_no, fallback_col_B) + end + + if exec_no >= 291 and exec_no <= 298 or exec_no >= 191 and exec_no <= 198 then + local exec_label = execAssObjNoClass:Get("Name") + Cmd(osc_str_template:format(osc_config, "xKey", exec_no, exec_label)) + end + end +end + +local function mainloop() + while enabled do + for _, exec_no in ipairs(executor_table) do poll(exec_no) end + coroutine.yield(0.05) + end +end + +local function maintoggle() + if enabled then + enabled = false + else + enabled = true + mainloop() + end +end + +return maintoggle \ No newline at end of file diff --git a/MA3 OSC FEEDBACK.lua b/MA3 OSC FEEDBACK.lua index ed50e0a..fde36b7 100644 --- a/MA3 OSC FEEDBACK.lua +++ b/MA3 OSC FEEDBACK.lua @@ -1,5 +1,5 @@ -- This plugin was written by Ebbe Baß (umpi) --- I will not take any responsibility if something breaks at any time. I conside this plugin as unstable. +-- I will not take any responsibility if something breaks at any time. I consider this plugin as unstable. -- To this date (10.08.2024) I've never had problems with it, but still I am going to consider it as unstable. local executor_table = {101,102,103,104,105,106,107,108,201,202,203,204,205,206,207,208,301,302,303,304,305,306,307,308,401,402,403,404,405,406,407,408,291,292,293,294,295,296,297,298,191,192,193,194,195,196,197,198} @@ -8,10 +8,23 @@ local osc_template = 'SendOSC %i "/%s%i,i,%i"' local osc_str_template = 'SendOSC %i "/%s%i,s,%s"' local enabled = false local Printf, Echo, GetExecutor, Cmd, ipairs, mfloor = Printf, Echo, GetExecutor, Cmd, ipairs, math.floor -local debug = false -local fallback_col_R = 0 -local fallback_col_G = 0 -local fallback_col_B = 0 +local debug = true + +local color_map = { + Sequence = {166, 125, 0}, + Group = {0, 64, 128}, + Preset = {0, 128, 128}, + Master = {0, 128, 128}, + Macro = {128, 0, 0}, + Quickey = {33, 34, 38}, + Sound = {50, 34, 82}, + World = {0, 0, 128}, + View = {103, 103, 110}, + User = {103, 103, 110}, + UserPlugin = {112, 0, 80}, + ScreenConfig = {103, 103, 110}, + Timer = {103, 103, 110} +} local function debug_print(msg) if debug then @@ -20,90 +33,68 @@ local function debug_print(msg) end local function send_osc(etype, exec_no, value) - debug_print(osc_template:format(osc_config, etype, exec_no, value)) - Cmd(osc_template:format(osc_config, etype, exec_no, value)) + local cmd_str = osc_template:format(osc_config, etype, exec_no, value) + debug_print(cmd_str) + Cmd(cmd_str) +end + +-- Reuse function to handle empty playback +local function handle_empty_playback(exec_no) + debug_print('Empty playback found on:'..tostring(exec_no)) + if (exec_no >= 291 and exec_no <= 298) or (exec_no >= 191 and exec_no <= 198) then + Cmd(osc_str_template:format(osc_config, "xKey", exec_no, "")) + end + send_osc("ExecCol_R", exec_no, 0) + send_osc("ExecCol_G", exec_no, 0) + send_osc("ExecCol_B", exec_no, 0) end local function poll(exec_no) local exec = GetExecutor(exec_no) local execAssObjNoClass = exec and exec:GetAssignedObj() + if not execAssObjNoClass then - debug_print('Empty playback found on:'..tostring(exec_no)) - send_osc('Key', exec_no, 0) - if exec_no >= 291 and exec_no <= 298 or exec_no >= 191 and exec_no <= 198 then - Cmd(osc_str_template:format(osc_config, "xKey", exec_no, "")) - send_osc("ExecCol_R", exec_no, 31) - send_osc("ExecCol_G", exec_no, 31) - send_osc("ExecCol_B", exec_no, 36) - end + handle_empty_playback(exec_no) else - local execAssObj = exec and exec:GetAssignedObj():GetClass() - if execAssObj == 'Sequence' then - debug_print('Sequence found on:'..tostring(exec_no)) - send_osc('Key', exec_no, 1) - fallback_col_R = 166 - fallback_col_G = 125 - fallback_col_B = 0 - elseif execAssObj == 'Group' then - debug_print('Group found on:'..tostring(exec_no)) - send_osc('Key', exec_no, 2) - fallback_col_R = 0 - fallback_col_G = 64 - fallback_col_B = 128 - elseif execAssObj == 'Preset' then - debug_print('Preset found on:'..tostring(exec_no)) - send_osc('Key', exec_no, 3) - fallback_col_R = 0 - fallback_col_G = 128 - fallback_col_B = 128 - elseif execAssObj == 'Master' then - debug_print('Master found on:'..tostring(exec_no)) - send_osc('Key', exec_no, 4) - fallback_col_R = 0 - fallback_col_G = 128 - fallback_col_B = 128 - - else - debug_print('weird, this is not a sequence, group, preset or master.') - end + -- Extract object appearance and class + local execAssObj = execAssObjNoClass:GetClass() + local colors = color_map[execAssObj] or {0, 0, 0} -- fallback colors + + -- Appearance-based color override local assObjApp = execAssObjNoClass:Get("Appearance") - if assObjApp ~= nil then - local assObjApp = tostring(assObjApp) - local assObjApp = assObjApp:gsub("Appearance ", "") - local assObjApp = tonumber(assObjApp) - local appearanceR = tonumber(ShowData().Appearances[assObjApp].BackR) - local appearanceG = tonumber(ShowData().Appearances[assObjApp].BackG) - local appearanceB = tonumber(ShowData().Appearances[assObjApp].BackB) - send_osc("ExecCol_R", exec_no, appearanceR) - send_osc("ExecCol_G", exec_no, appearanceG) - send_osc("ExecCol_B", exec_no, appearanceB) - else - send_osc("ExecCol_R", exec_no, fallback_col_R) - send_osc("ExecCol_G", exec_no, fallback_col_G) - send_osc("ExecCol_B", exec_no, fallback_col_B) + if assObjApp then + local app_id = tonumber(assObjApp:gsub("Appearance ", "")) + local app_data = ShowData().Appearances[app_id] + colors = {tonumber(app_data.BackR), tonumber(app_data.BackG), tonumber(app_data.BackB)} end - if exec_no >= 291 and exec_no <= 298 or exec_no >= 191 and exec_no <= 198 then + -- Send colors through OSC + send_osc("ExecCol_R", exec_no, colors[1]) + send_osc("ExecCol_G", exec_no, colors[2]) + send_osc("ExecCol_B", exec_no, colors[3]) + + -- Handle special xKey case + if (exec_no >= 291 and exec_no <= 298) or (exec_no >= 191 and exec_no <= 198) then local exec_label = execAssObjNoClass:Get("Name") - Cmd(osc_str_template:format(osc_config, "xKey", exec_no, exec_label)) + Cmd(osc_str_template:format(osc_config, "xKey", exec_no, exec_label)) end end end local function mainloop() while enabled do - for _, exec_no in ipairs(executor_table) do poll(exec_no) end + for _, exec_no in ipairs(executor_table) do + poll(exec_no) + end coroutine.yield(0.05) end end local function maintoggle() + enabled = not enabled if enabled then - enabled = false - else - enabled = true mainloop() end end -return maintoggle \ No newline at end of file +return maintoggle