commit bbe3047af4692c1705e3cc75e53fc02c18f49e6c Author: stysmmaker Date: Tue Apr 13 22:21:09 2021 -0400 Initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..81f990d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MMaker_AddMarkersFromJSON.jsx b/MMaker_AddMarkersFromJSON.jsx new file mode 100644 index 0000000..40b4c59 --- /dev/null +++ b/MMaker_AddMarkersFromJSON.jsx @@ -0,0 +1,204 @@ +(function(thisObj) +{ + buildUI(thisObj); + + function buildUI(thisObj) + { + + /* + Code for Import https://scriptui.joonas.me — (Triple click to select): + {"activeId":15,"items":{"item-0":{"id":0,"type":"Dialog","parentId":false,"style":{"enabled":true,"varName":"window","windowType":"Window","creationProps":{"su1PanelCoordinates":false,"maximizeButton":false,"minimizeButton":false,"independent":false,"closeButton":false,"borderless":false,"resizeable":true},"text":"MMaker - RPP Marker Creator","preferredSize":[256,0],"margins":16,"orientation":"column","spacing":10,"alignChildren":["left","center"]}},"item-1":{"id":1,"type":"Group","parentId":0,"style":{"enabled":true,"varName":null,"preferredSize":[0,0],"margins":0,"orientation":"row","spacing":10,"alignChildren":["left","center"],"alignment":null}},"item-2":{"id":2,"type":"StaticText","parentId":1,"style":{"enabled":true,"varName":null,"creationProps":{"truncate":"none","multiline":false,"scrolling":false},"softWrap":false,"text":"Load .rpp","justify":"left","preferredSize":[0,0],"alignment":null,"helpTip":null}},"item-3":{"id":3,"type":"Button","parentId":1,"style":{"enabled":true,"varName":"fileOpener","text":"...","justify":"center","preferredSize":[24,24],"alignment":null,"helpTip":null}},"item-5":{"id":5,"type":"StaticText","parentId":0,"style":{"enabled":true,"varName":null,"creationProps":{"truncate":"none","multiline":false,"scrolling":false},"softWrap":false,"text":"JSON Data","justify":"left","preferredSize":[0,0],"alignment":null,"helpTip":null}},"item-6":{"id":6,"type":"Group","parentId":0,"style":{"enabled":true,"varName":null,"preferredSize":[0,0],"margins":0,"orientation":"row","spacing":10,"alignChildren":["left","center"],"alignment":null}},"item-7":{"id":7,"type":"StaticText","parentId":6,"style":{"enabled":true,"varName":null,"creationProps":{"truncate":"none","multiline":false,"scrolling":false},"softWrap":false,"text":"Track Name","justify":"left","preferredSize":[0,0],"alignment":null,"helpTip":null}},"item-9":{"id":9,"type":"EditText","parentId":0,"style":{"enabled":true,"varName":"jsonData","creationProps":{"noecho":false,"readonly":false,"multiline":true,"scrollable":true,"borderless":false,"enterKeySignalsOnChange":false},"softWrap":false,"text":"","justify":"left","preferredSize":[224,96],"alignment":null,"helpTip":null}},"item-10":{"id":10,"type":"Button","parentId":0,"style":{"enabled":true,"varName":"runButton","text":"Go!","justify":"center","preferredSize":[64,0],"alignment":"center","helpTip":null}},"item-11":{"id":11,"type":"DropDownList","parentId":6,"style":{"enabled":true,"varName":"trackName","text":"DropDownList","listItems":"","preferredSize":[140,0],"alignment":null,"selection":0,"helpTip":null}},"item-12":{"id":12,"type":"Group","parentId":0,"style":{"enabled":true,"varName":null,"preferredSize":[0,0],"margins":0,"orientation":"row","spacing":10,"alignChildren":["left","center"],"alignment":null}},"item-13":{"id":13,"type":"StaticText","parentId":12,"style":{"enabled":true,"varName":null,"creationProps":{"truncate":"none","multiline":false,"scrolling":false},"softWrap":false,"text":"Frame Offset","justify":"left","preferredSize":[0,0],"alignment":null,"helpTip":null}},"item-15":{"id":15,"type":"Button","parentId":0,"style":{"enabled":true,"varName":"aboutButton","text":"?","justify":"center","preferredSize":[24,24],"alignment":"right","helpTip":null}},"item-16":{"id":16,"type":"EditText","parentId":12,"style":{"enabled":true,"varName":"frameOffset","creationProps":{"noecho":false,"readonly":false,"multiline":false,"scrollable":false,"borderless":false,"enterKeySignalsOnChange":false},"softWrap":false,"text":"-3","justify":"left","preferredSize":[32,0],"alignment":null,"helpTip":null}}},"order":[0,1,2,3,5,9,6,7,11,12,13,16,10,15],"settings":{"importJSON":true,"indentSize":false,"cepExport":false,"includeCSSJS":true,"showDialog":true,"functionWrapper":false,"afterEffectsDockable":false,"itemReferenceList":"None"}} + */ + + // WINDOW + // ====== + var window = (thisObj instanceof Panel) ? thisObj : new Window("window", undefined, undefined, {closeButton: true, resizeable: false}); + // window.text = "MMaker - RPP Marker Creator"; + window.preferredSize.width = 224; + window.orientation = "column"; + window.alignChildren = ["left","center"]; + window.spacing = 10; + window.margins = 16; + + // GROUP1 + // ====== + var group1 = window.add("group", undefined, {name: "group1"}); + group1.orientation = "row"; + group1.alignChildren = ["left","center"]; + group1.spacing = 10; + group1.margins = 0; + + var statictext1 = group1.add("statictext", undefined, undefined, {name: "statictext1"}); + statictext1.text = "Load .rpp"; + + var fileOpener = group1.add("button", undefined, undefined, {name: "fileOpener"}); + fileOpener.text = "..."; + fileOpener.preferredSize.width = 24; + fileOpener.preferredSize.height = 24; + + // WINDOW + // ====== + var statictext2 = window.add("statictext", undefined, undefined, {name: "statictext2"}); + statictext2.text = "JSON Data"; + + var jsonData = window.add('edittext {properties: {name: "jsonData", multiline: true, scrollable: true}}'); + jsonData.preferredSize.width = 160; + jsonData.preferredSize.height = 48; + + // GROUP2 + // ====== + var group2 = window.add("group", undefined, {name: "group2"}); + group2.orientation = "row"; + group2.alignChildren = ["left","center"]; + group2.spacing = 10; + group2.margins = 0; + + var statictext3 = group2.add("statictext", undefined, undefined, {name: "statictext3"}); + statictext3.text = "Track Name"; + + var trackName = group2.add("dropdownlist", undefined, undefined, {name: "trackName"}); + trackName.selection = 0; + trackName.preferredSize.width = 96; + + // GROUP3 + // ====== + var group3 = window.add("group", undefined, {name: "group3"}); + group3.orientation = "row"; + group3.alignChildren = ["left","center"]; + group3.spacing = 10; + group3.margins = 0; + + var statictext4 = group3.add("statictext", undefined, undefined, {name: "statictext4"}); + statictext4.text = "Frame Offset"; + + var frameOffset = group3.add('edittext {properties: {name: "frameOffset"}}'); + frameOffset.text = "-2"; + frameOffset.preferredSize.width = 32; + + // WINDOW + // ====== + var runButton = window.add("button", undefined, undefined, {name: "runButton"}); + runButton.text = "Go!"; + runButton.preferredSize.width = 64; + runButton.alignment = ["center","center"]; + + var aboutButton = window.add("button", undefined, undefined, {name: "aboutButton"}); + aboutButton.text = "?"; + aboutButton.preferredSize.width = 24; + aboutButton.preferredSize.height = 24; + aboutButton.alignment = ["right","center"]; + + window.onResizing = window.onResize = function() + { + this.layout.resize(); + }; + + if (window instanceof Window) + { + window.center(); + window.show(); + } + else + { + window.layout.layout(true); + window.layout.resize(); + } + + fileOpener.addEventListener("mousedown", function(evt) + { + rppFile = (new File()).openDlg("Select .rpp file ...", "*.rpp", false); + + if (rppFile != null) + { + if (trackName.items.length > 0) + { + trackName.removeAll(); + } + + stdOut = system.callSystem("python \"Scripts\\ScriptUI Panels\\MMaker_RPPJSON.py\" \"" + rppFile.fsName + "\"") + jsonData.text = stdOut; + + trackNames = getObjectKeys(JSON.parse(jsonData.text)); + for (var i = 0; i < trackNames.length; i++) + { + currentTrack = trackNames[i]; + currentTrack = currentTrack.substring(1); + trackName.add("item", currentTrack); + } + } + }); + + runButton.addEventListener("mousedown", function(evt) + { + try + { + app.beginUndoGroup("Add markers"); + var comp = app.project.activeItem; + + jsonParsed = JSON.parse(jsonData.text); + if (trackName.selection != null) + { + flipItem = "!" + trackName.selection.text; + } + else + { + alert("Please select a track."); + return; + } + + if (isNaN(parseInt(frameOffset.text))) + { + alert("Please enter a valid number for the frame offset."); + return; + } + else + { + timeConst = parseInt(frameOffset.text) / (1/comp.frameDuration); + } + + if (typeof jsonParsed[flipItem] != 'undefined') + { + for (var i = 0; i < jsonParsed[flipItem].length; i++) + { + newMarker = new MarkerValue(""); + marker_params = {}; + newMarker.label = 0; + marker_params.label = newMarker.label; + newMarker.setParameters(marker_params); + comp.markerProperty.setValueAtTime(jsonParsed[flipItem][i] + timeConst, newMarker); + } + } + else + { + alert("Track does not exist!"); + return; + } + + app.endUndoGroup(); + } + catch(e) + { + alert(e); + } + }); + + aboutButton.addEventListener("mousedown", function(evt) + { + alert("Script by MMaker\nmmaker.moe"); + }); + + } + + // https://gist.github.com/ltfschoen/79ab3e98723e61660117 + var getObjectKeys = function(associativeArrayObject) { + var arrayWithKeys=[], associativeArrayObject; + for (key in associativeArrayObject) { + // Avoid returning these keys from the Associative Array that are stored in it for some reason + if (key !== undefined && key !== "toJSONString" && key !== "parseJSON" ) { + arrayWithKeys.push(key); + } + } + return arrayWithKeys; + } + +})(this); \ No newline at end of file diff --git a/MMaker_RPPJSON.py b/MMaker_RPPJSON.py new file mode 100644 index 0000000..2e13e02 --- /dev/null +++ b/MMaker_RPPJSON.py @@ -0,0 +1,28 @@ +import json, sys, rpp + +try: + with open(sys.argv[1], "rb") as f: + data = f.read().decode("utf-8") + r = rpp.loads(data) + + trackList = {} + + for item in r.iterfind(".//TRACK"): + trackName = item.find(".//NAME")[1] + if (trackName.startswith("!")): + if not trackName in trackList: + trackList[trackName] = [] + for pos in item.iterfind(".//POSITION"): + itemType = item.find(".//SOURCE").attrib + itemPos = float(pos[1]) + if (itemType not in ["MIDI"]): + trackList[trackName].append(itemPos) + + if (len(sys.argv) > 2): + with open(sys.argv[2], "w") as out: + json.dump(trackList, out) + print("File saved to " + sys.argv[2]) + else: + print(json.dumps(trackList)) +except Exception as e: + print(e) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9218ac --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# AddMarkersFromJSON + +Helper scripts for importing REAPER track position data into After Effects for streamlined YTPMV/音MAD creation. Code is a mess currently so don't reference this project for other things. I don't know what else to name this \o/ + +## Usage + +**Note:** This script expects you have Python 3 installed and in your `PATH` as `python`, as well as the packages listed in `requirements.txt`. + +1. Grab the source of this repo. +2. Put the `.jsx` and `.py` file into your After Effects' ScriptUI Panels folder (`Support Files/Scripts/ScriptUI Panels/`). +3. Launch After Effects and access the script panel from the `Window` menu. + +## Roadmap + +Currently this is essentially just a dump of the script files I use currently, eventually I'd like to clean them up and add a few more features. \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8f7399e --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +rpp==0.4 \ No newline at end of file