1
Fork 0

Initial commit

master
stysmmaker 2021-04-13 22:21:09 -04:00
commit bbe3047af4
Signed by: mmaker
GPG Key ID: CCE79B8FEDA40FB2
5 changed files with 269 additions and 0 deletions

21
LICENSE 100644
View File

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

View File

@ -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);

28
MMaker_RPPJSON.py 100644
View File

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

15
README.md 100644
View File

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

1
requirements.txt 100644
View File

@ -0,0 +1 @@
rpp==0.4