diff --git a/Various/rxfx_ReaPad.eel b/Various/rxfx_ReaPad.eel index 197e908b3..0b7c86bc9 100644 --- a/Various/rxfx_ReaPad.eel +++ b/Various/rxfx_ReaPad.eel @@ -1,7 +1,7 @@ // @description ReaPad // @author Rek's Effeks -// @version 1.5.6 -// @changelog Time selection copy and empty controls, save button, remove "reset midi controllers" +// @version 1.5.71 +// @changelog fix Turing-Complete FX display after project load // @about // Hotplug-enabled gamepad controller script for Reaper. Requires SWS extension. // @@ -105,6 +105,7 @@ effect = #effect; param = #param; razordel = #delete; razorcpy = #copy; +turingfx = #turingfx; newaxis = 0; oldaxis = 50; newpov = 100; @@ -523,6 +524,45 @@ function nudge_vol(amt) ); ); +function tcfx() +( // turing-complete - update track FX + count = CountTracks(0); + strcpy(#turingfx,""); + temp = #temp; + temp2 = #temp2; + i = 0; + loop(count, + track = GetTrack(0, i); + fxn = TrackFX_GetCount(track) - FXOffset; + fxc = TrackFX_GetCount(track); + fxc ? ( + TrackFX_GetFXName(track, fxn-1, #temp); + match("+?: %{temp2}S",#temp); + #turingfx += str(fxn); + #turingfx += "/"; + #turingfx += str(fxc); + #turingfx += ": "; + #turingfx += #temp2; + #turingfx += ","; + ):( + #turingfx += "No FX,"; + ); + i += 1; + ); + SetExtState("Fanciest","TrackFX",#turingfx,0); +); + +function tcsl() +( // turing-complete - update track selection + n("_RS9f79e20ed4fb38201ca57ed8cbec8d2176d4288b"); + CountTracks(0) ? ( + GetExtState(#temp, "Fanciest", "TrackFX"); + match("rerun",#temp) ? ( + tcfx(); + ); + ); +); + function reverse_fx_lookup(fxname) ( i = 0; @@ -591,6 +631,7 @@ function fx_show() fxn = TrackFX_GetCount(track)-1-FXOffset; TrackFX_Show(track, fxn, 1); ); + tcfx(); ); function fx_cycle(direction) // swap out fx on selected tracks @@ -817,6 +858,7 @@ function setup() xbox = joystick_create(#guid); joystick_getinfo(xbox, numaxis, numpov); reload(xbox, 1); + tcfx(); defer("main_loop()"); ); ); @@ -890,6 +932,7 @@ function main_loop() ):( b(BUTTON_SELECT) ? ( r(40702); // new track at end of tcp + tcsl(); // turing update track sel display ):( b(BUTTON_START) ? ( Undo_BeginBlock(); @@ -944,6 +987,7 @@ function main_loop() ); ):( r(40030); // redo + tcsl(); // turing update track sel display ); ); ); @@ -1010,6 +1054,7 @@ function main_loop() i += 1; ); r(40005); // delete track + tcsl(); // turing update track sel display ):( b(BUTTON_START) ? ( Undo_BeginBlock(); @@ -1042,6 +1087,7 @@ function main_loop() MarkerSelActive = 0; // cancel ):( r(40029); // undo + tcsl(); // turing update track sel display ); ); ); @@ -1292,6 +1338,7 @@ function main_loop() ):( r(40286); // go to prev track ); + tcsl(); // turing update track sel display ); ); value > 0 ? ( // right @@ -1318,6 +1365,7 @@ function main_loop() ):( r(40285); // go to next track ); + tcsl(); // turing update track sel display ); ); ); diff --git a/Web Interfaces/rxfx_Turing-complete.www b/Web Interfaces/rxfx_Turing-complete.www index 6f165eeb1..a9158f990 100644 --- a/Web Interfaces/rxfx_Turing-complete.www +++ b/Web Interfaces/rxfx_Turing-complete.www @@ -1,7 +1,7 @@ @description Turing-complete controller @author Rek's Effeks -@version 0.1beta.3 -@changelog Fixed tempo/time sig editing to be compatible with tap tempo. +@version 0.2.2 +@changelog ReaPad integration and bug fixes. @provides [main script] rxfx_Turing-complete/rxfx_Turing-complete - Cycle track record arm.lua [main script] rxfx_Turing-complete/rxfx_Turing-complete - Set time selection from markers.lua @@ -14,6 +14,7 @@ [main script] rxfx_Turing-complete/rxfx_Turing-complete - Send project list.lua [main script] rxfx_Turing-complete/rxfx_Turing-complete - Send tempo.lua [main script] rxfx_Turing-complete/rxfx_Turing-complete - Set time signature.lua + [main script] rxfx_Turing-complete/rxfx_Turing-complete - Update track selections.lua rxfx_Turing-complete/rxfx_turing_complete.html > rxfx_turing_complete.html rxfx_Turing-complete/OpenSans-VariableFont_wdth,wght.ttf > rxfx_turing_complete/ @about diff --git a/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Cycle track record arm.lua b/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Cycle track record arm.lua index 45c864639..03b6d313e 100644 --- a/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Cycle track record arm.lua +++ b/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Cycle track record arm.lua @@ -5,17 +5,19 @@ function Track_Cycle_RecordState() --reaper.ShowConsoleMsg(reaper.GetExtState("Fanciest", "TrackRename")) ToCycle = tonumber(reaper.GetExtState("Fanciest","TrackRecordCycle")) Track = reaper.GetTrack(0, ToCycle-1) -if reaper.GetMediaTrackInfo_Value(Track, "I_RECARM") == 0 then - reaper.SetMediaTrackInfo_Value(Track, "I_RECARM", 1) - reaper.SetMediaTrackInfo_Value(Track, "I_RECINPUT", 0) - reaper.SetExtState("Fanciest","RecCycleSuccess","chan1",false) -else - if reaper.GetMediaTrackInfo_Value(Track, "I_RECINPUT") == 0 then - reaper.SetMediaTrackInfo_Value(Track, "I_RECINPUT", 1) - reaper.SetExtState("Fanciest","RecCycleSuccess","chan2",false) +if Track ~= nil then + if reaper.GetMediaTrackInfo_Value(Track, "I_RECARM") == 0 then + reaper.SetMediaTrackInfo_Value(Track, "I_RECARM", 1) + reaper.SetMediaTrackInfo_Value(Track, "I_RECINPUT", 0) + reaper.SetExtState("Fanciest","RecCycleSuccess","chan1",false) else - reaper.SetMediaTrackInfo_Value(Track, "I_RECARM", 0) - reaper.SetExtState("Fanciest","RecCycleSuccess","off",false) + if reaper.GetMediaTrackInfo_Value(Track, "I_RECINPUT") == 0 then + reaper.SetMediaTrackInfo_Value(Track, "I_RECINPUT", 1) + reaper.SetExtState("Fanciest","RecCycleSuccess","chan2",false) + else + reaper.SetMediaTrackInfo_Value(Track, "I_RECARM", 0) + reaper.SetExtState("Fanciest","RecCycleSuccess","off",false) + end end end reaper.DeleteExtState("Fanciest","TrackRecordCycle",true) diff --git a/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Update track selections.lua b/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Update track selections.lua new file mode 100644 index 000000000..8867078f7 --- /dev/null +++ b/Web Interfaces/rxfx_Turing-complete/rxfx_Turing-complete - Update track selections.lua @@ -0,0 +1,32 @@ +-- @noindex +local function has_value (tab, val) + for index, value in ipairs(tab) do + if value == val then + return true + end + end + + return false +end + +function UpdateSelectedTracks() + local count = reaper.CountSelectedTracks(0) + local finalstring = "" + local trax = {} + if count ~= 0 then + for i=1, count do + trax[i] = reaper.GetSelectedTrack(0, i-1) + end + local count2 = reaper.CountTracks(0) + for i=1, count2 do + if has_value(trax, reaper.GetTrack(0,i-1)) then + finalstring = finalstring .. tostring(i) .. "," + end + end + reaper.SetExtState("Fanciest","TrackSelections",finalstring,false) + else + reaper.SetExtState("Fanciest","TrackSelections","",false) + end +end + +UpdateSelectedTracks() diff --git a/Web Interfaces/rxfx_Turing-complete/rxfx_turing_complete.html b/Web Interfaces/rxfx_Turing-complete/rxfx_turing_complete.html index 31744dfea..833dc1c5e 100644 --- a/Web Interfaces/rxfx_Turing-complete/rxfx_turing_complete.html +++ b/Web Interfaces/rxfx_Turing-complete/rxfx_turing_complete.html @@ -95,8 +95,11 @@ var tracksRendered = false; // don't update arm display until tracks are there to edit wwr_req_recur("_RSfee01d3e4ca569bed48f2466c1453be35ab1d27e;GET/EXTSTATE/Fanciest/CurrentTempo",200); // tempo wwr_req_recur("MARKER;REGION;_RSe6f7f64d341520fb0ec902a7c0580f1b423e7fc7;GET/EXTSTATE/Fanciest/ArmDisplay;GET/EXTSTATE/Fanciest/SelectDisplay;GET/EXTSTATE/Fanciest/CurrentProject",500); // markers, regions, arm states, time select, project name +wwr_req_recur("GET/EXTSTATE/Fanciest/TrackSelections;GET/EXTSTATE/Fanciest/TrackFX",397); // which tracks are selected/have fx? (ReaPad required or else this is pointless anyway) wwr_req_recur("_RS99f117755ebbf002528fae80ba7693ec86ae8bca;GET/EXTSTATE/Fanciest/ProjectList",1000); // list of projects -wwr_start(); +document.addEventListener("DOMContentLoaded", function() { + wwr_start(); +}); var last_transport_state = -1, mouseDown = 0, last_time_str = "", last_metronome = false, nTrack = 0, last_repeat = false, snapState = 0, prerollState = 0, @@ -241,6 +244,56 @@ bar.setAttributeNS(null, "visibility", "visible"); } +function setTrackSelected(idx, selected) { + var row1 = document.getElementById("track" + idx); + if (!row1) return; + var row1Content = row1.children[0]; + if (!row1Content || !row1Content.innerHTML) return; + var indicator = row1Content.getElementsByClassName("trackSelectIndicator")[0]; + if (!indicator) return; + indicator.setAttribute("opacity", selected ? "1" : "0"); + + var infoDiv = row1.children[1]; + if (infoDiv) infoDiv.style.display = selected ? "block" : "none"; +} + +function updateSelections(inputString) { + var selections = inputString.split(","); + //var sel_ints = []; + for (let i = 0; i < nTrack; i++) { + setTrackSelected(i+1,0); + } + selections.forEach(element => { + if (!isNaN(parseInt(element))) { + setTrackSelected( parseInt(element), 1 ); + //sel_ints.push(parseInt(element)); + } + }); + //console.log(sel_ints); +} + +function setTrackInfo(idx, text) { + var row = document.getElementById("track" + idx); + if (!row) return; + var infoDiv = row.children[1]; + if (!infoDiv) return; + var el = infoDiv.getElementsByClassName("trackInfoText")[0]; + if (!el) return; + var inner = el.parentElement; + inner.style.display = text ? "block" : "none"; + el.textContent = text || ""; +} + +function updateFX(inputString) { + var fxLines = inputString.split(","); + fxLines.pop(); + var i = 1; + fxLines.forEach(element => { + setTrackInfo(i,element); + i ++; + }); +} + function wwr_onreply(results) { /*var resultsDisplay = document.getElementById("_results"); if(resultsDisplay!=null){ @@ -409,6 +462,7 @@ case "REGION_LIST_END": //assemble mrMap array : time, marker number, region start number, region end number. + var pos = parseFloat(parseFloat(playPosSeconds).toFixed(6)); for (var i=0; i 1) {nTrack = tok[1];} + if (tok.length > 1) { + nTrack = tok[1]; + } break; case "TRACK": @@ -719,6 +779,9 @@ var trackRow1Div = document.createElement("div"); trackRow1Div.className = ("trackRow1"); + var trackInfoDiv = document.createElement("div"); + trackInfoDiv.className = ("trackInfo"); + trackInfoDiv.style.display = "none"; var trackRow2Div = document.createElement("div"); trackRow2Div.className = ("trackRow2"); trackRow2Div.id = tok[1]; @@ -727,6 +790,7 @@ if(trackDiv && allTracksDiv){allTracksDiv.appendChild(trackDiv);} trackDiv.appendChild(trackRow1Div) ; + trackDiv.appendChild(trackInfoDiv) ; trackDiv.appendChild(trackRow2Div) ; trackDiv.appendChild(trackSendsDiv); } @@ -734,6 +798,7 @@ else { if(backLoaded!=null && backLoaded.nextSibling!=null){ var cloneTrackRow1 = document.getElementById("trackRow1Svg").cloneNode(true); + var cloneTrackInfo = document.getElementById("trackInfoTemplate").cloneNode(true); var cloneTrackRow2 = document.getElementById("trackRow2Svg").cloneNode(true); var cloneTrackSend = document.getElementById("trackSendSvg").cloneNode(true); @@ -752,7 +817,7 @@ masterMeterReadout.textContent = (mkvolstr(tok[4])); var masterTrackContent = document.getElementById("track0"); - var masterTrackRow2Content = masterTrackContent.childNodes[3]; + var masterTrackRow2Content = masterTrackContent.children[1]; if (!masterTrackRow2Content.innerHTML){ masterTrackRow2Content.appendChild(cloneTrackRow2); var trackSendsDiv = document.createElement("div"); @@ -777,7 +842,7 @@ if(idx>0){ //normal track stuff - var trackRow1Content = document.getElementById("track" + idx).childNodes[0]; + var trackRow1Content = document.getElementById("track" + idx).children[0]; if (!trackRow1Content.innerHTML){ trackRow1Content.appendChild(cloneTrackRow1); trackRow1Content.firstChild.getElementsByClassName("hitbox")[0].id = idx; @@ -828,9 +893,13 @@ commit(); }); })(idx); + var trackInfoContent = document.getElementById("track" + idx).children[1]; + if (!trackInfoContent.innerHTML) { + trackInfoContent.appendChild(cloneTrackInfo); } + } - var trackRow2Content = document.getElementById("track" + idx).childNodes[1]; + var trackRow2Content = document.getElementById("track" + idx).children[2]; if (!trackRow2Content.innerHTML){ trackRow2Content.appendChild(cloneTrackRow2); } @@ -979,7 +1048,7 @@ try { var result = await requestRecCycle(capturedIdx); // just let armDisplay handle it every half a second - var row1 = document.getElementById("track" + capturedIdx).childNodes[0]; + var row1 = document.getElementById("track" + capturedIdx).children[0]; var bg = row1.getElementsByClassName("recarmBg")[0]; var label = row1.getElementsByClassName("recarmLabel")[0]; @@ -1045,8 +1114,9 @@ tracksRendered = true; } } - if (tracksDrawn > nTrack) { + if (tracksDrawn > nTrack-1) { tracks.removeChild(tracks.lastChild); + //document.getElementById("track" + tok[1]) } } break; @@ -1073,7 +1143,7 @@ var trackSendsContent = document.getElementById("sendsTrack" + tok[1]); if(trackSendsContent.childNodes.length>0){ - var thisSendDiv = trackSendsContent.childNodes[tok[2]]; + var thisSendDiv = trackSendsContent.children[tok[2]]; if(thisSendDiv!=null){ thisSendDiv.id=[tok[2]]; sendTitleText = thisSendDiv.firstChild.getElementsByClassName("sendTitleText")[0]; @@ -1154,7 +1224,7 @@ if (tok[3] != '' && tracksRendered) { armStates = tok[3].split(":"); for (var t = 0; t @@ -1932,6 +2008,7 @@ viewBox="0 1 320 53" xml:space="preserve"> + @@ -2136,6 +2213,30 @@ + +
+
+
+
+ @@ -2790,6 +2891,7 @@ recarmCountAr = []; recCycleInProgress = []; tracksRendered = false; + wwr_req("SET/EXTSTATE/Fanciest/TrackFX/rerun"); } @@ -3084,6 +3186,7 @@ }); +