Skip to content

Instantly share code, notes, and snippets.

@mes51
Last active July 31, 2020 13:48
Show Gist options
  • Save mes51/4813d765bdbb25e9c321e6d0dbc6e781 to your computer and use it in GitHub Desktop.
Save mes51/4813d765bdbb25e9c321e6d0dbc6e781 to your computer and use it in GitHub Desktop.
現在選択中のトラックのノートから、After Effects用のマーカー生成用jsxを作成する
TEXT_DIALOG_MESSAGE = "Please select target track"
TEXT_DIALOG_SELECT_TRACK = "Target track"
TEXT_DIALOG_TRACK_ALL = "All"
TEXT_DIALOG_TRACK_CURRENT = "Current editing track"
function split(inputstr, sep)
local t = {}
for field, s in string.gmatch(inputstr, "([^"..sep.."]*)("..sep.."?)") do
table.insert(t, field)
if s == "" then
return t
end
end
end
function generateMarkerData(track, timeAxis)
local result = {}
for i = 1, track:getNumGroups() do
local groupRef = track:getGroupReference(i)
local group = groupRef:getTarget()
for n = 1, group:getNumNotes() do
local note = group:getNote(n)
table.insert(result, #result + 1, { time = timeAxis:getSecondsFromBlick(note:getOnset()), text = note:getLyrics() })
end
end
return result
end
function generateJSON(data)
local result = {}
for i = 1, #data do
local markerData = data[i].markerData
local generatedMarkerJSON = {}
for m = 1, #markerData do
table.insert(generatedMarkerJSON, #generatedMarkerJSON + 1, "{ time: " .. tostring(markerData[m].time) .. ", text: '" .. markerData[m].text .. "' }")
end
table.insert(result, #result + 1, "{ trackName: '" .. data[i].trackName .. "', markerData: [" .. table.concat(generatedMarkerJSON, ",") .. "] }")
end
return "[" .. table.concat(result, ",") .. "]"
end
function getClientInfo()
return {
name = "Export After Effects Lyric Marker",
author = "mes51",
category = "Export",
versionNumber = 1,
minEditorVersion = 65537
}
end
function getTranslations(langCode)
if langCode == "ja-jp" then
return {
{TEXT_DIALOG_MESSAGE, "書き出すトラックを選択してください"},
{TEXT_DIALOG_SELECT_TRACK, "対象のトラック"},
{TEXT_DIALOG_TRACK_ALL, "すべてのトラック"},
{TEXT_DIALOG_TRACK_CURRENT, "現在のトラック"}
}
else
return {}
end
end
function main()
local project = SV:getProject()
local trackNames = {SV:T(TEXT_DIALOG_TRACK_ALL), SV:T(TEXT_DIALOG_TRACK_CURRENT)}
for i = 1, project:getNumTracks() do
trackNames[i + 2] = project:getTrack(i):getName()
end
local form = {
title = "Export After Effects Lyric Marker",
message = SV:T(TEXT_DIALOG_MESSAGE),
buttons = "OkCancel",
widgets = {
{
name = "trackName",
type = "ComboBox",
label = SV:T(TEXT_DIALOG_SELECT_TRACK),
choices = trackNames,
default = 1
}
}
}
local dialogResult = SV:showCustomDialog(form)
if not dialogResult.status then
SV:finish()
return
end
local timeAxis = project:getTimeAxis()
local data = {}
local outputName = ""
if dialogResult.answers.trackName == 0 then
local path = split(project:getFileName(), "\\")
outputName = path[#path]:match("([^.]*)")
if not outputName then
outputName = SV:getMainEditor():getCurrentTrack():getName()
end
for i = 1, project:getNumTracks() do
local track = project:getTrack(i)
table.insert(data, #data + 1, {
trackName = track:getName(),
markerData = generateMarkerData(track, timeAxis)
})
end
elseif dialogResult.answers.trackName == 1 then
local track = SV:getMainEditor():getCurrentTrack()
outputName = track:getName()
data[1] = {
trackName = track:getName(),
markerData = generateMarkerData(track, timeAxis)
}
else
local track = project:getTrack(dialogResult.answers.trackName - 1)
outputName = track:getName()
data[1] = {
trackName = track:getName(),
markerData = generateMarkerData(track, timeAxis)
}
end
local result = [[function writeInfo(text) {
clearOutput();
writeLn('SynthV Lyric Marker');
writeLn(text);
};
function createMarker(compItem, trackName, markerData) {
var textLayer = compItem.layers.addText('');
textLayer.name = trackName;
var markers = textLayer.property('Marker');
for (var i = 0; i < markerData.length; i++) {
writeInfo('create ' + markerData[i].text);
markers.setValueAtTime(markerData[i].time, new MarkerValue(markerData[i].text));
}
}
(function() {
var compItem = app.project.activeItem;
if (!(compItem instanceof CompItem)) {
alert('not select comp');
return;
};
]]
result = result .. " var data = " .. generateJSON(data) .. ";\n" ..
[[
for (var i = 0; i < data.length; i++) {
var d = data[i];
createMarker(compItem, d.trackName, d.markerData);
}
})();]]
f = io.open(outputName .. "_marker.jsx", "w+")
f:write(result)
f:flush()
f:close()
SV:showMessageBox("Export After Effects Lyric Marker", "Done")
SV:finish()
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment