Initial commit
This commit is contained in:
commit
bbe3047af4
21
LICENSE
Normal file
21
LICENSE
Normal 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.
|
204
MMaker_AddMarkersFromJSON.jsx
Normal file
204
MMaker_AddMarkersFromJSON.jsx
Normal 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
Normal file
28
MMaker_RPPJSON.py
Normal 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
Normal file
15
README.md
Normal 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
Normal file
1
requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
rpp==0.4
|
Loading…
Reference in New Issue
Block a user