Manchen könnte vllt der Begriff „lua“ ein Begriff sein. Es ist eine Programmiersprache, wie es viele auf diesem Planeten gibt. Die Besonderheit in diesem Fall: man kann sie zum erstellen von Karaoke-Effekten nutzen. Und dafür dient das Tut.
Was braucht man alles um arbeiten zu können?
Um überhaupt arbeiten zu können, wird als Subtitleprog „Aegisub“ benötigt. Und für das Lua-script eignet sich jeder Editor (er muss nicht einmal irgendwelche Programmiersprachen unterstützen. Der Editor von Windows reicht völlig).
Wichtig: Man muss sich mit den Typsettingbefehlen gut auskennen, sonst sollte man eh die Finger von FX lassen^^ und natürlich sollte auch schon eine Idee des Effektes vorliegen.
Welche Ausgangsmaterialien werden benötigt?
1. Eine *.ass (mit Aegisub erstellt) die die getimeten Silben im Format „[silbe]{\k[zeit]}“.
2. Das Style sollte Anfang an fest sehen. Vor allem muss darauf geachtet werden, dass die Auflösung der .ass der des Videos entspricht (sonst werden die Silben nicht richtig positioniert). Außerdem darf es keine Zeilenumbrüche geben.
3. Das Lua-script. (Dateiendung *.lua)
Wie erstelle ich ein solches Lua-script?
Das ist der eigentliche Teil... darauf werde ich genau eingehen...
1. erstelle eine Textdatei und ändere die Dateiendung in *.lua
2. füge das Grundgerüst ein
3. erstelle die eigentlichen Effecte
Grundgerüst eines Effectes:
Code: Select all
l = table.copy(line)
l.text = string.format("{[Effekte]}%s", syl.text_stripped)
l.start_time = [Start_Zeit]
l.end_time = [End_Zeit]
subs.append(l)
Zeitensetzung:
Es müssen zwei Zeitpunkte definiert werden: Start und Endzeit
Dafür notwenige (wichtigsten) Befehle:
Code: Select all
line.start_time --Anfangszeit der komletten Zeile
syl.start_time --Anfangszeit der jeweiligen Silbe
syl.end_time --Endzeit der jeweiligen Silbe
line.end_time --Endzeit der komletten Zeile
Wichtig: es dürfen keine ungewollten Lücken Zwischen „line.start_time“ und „line.end_time“ auftreten.
Eine mögliche Reihenfolge der Zeiten:
Intro: l.start_time = line.start_time - 500 | l.end_time = line.start_time
vor Effekt: l.start_time = line.start_time | l.end_time = line.start_time + syl.start_time
Effekt: l.start_time = line.start_time + syl.start_time | l.end_time = line.start_time + syl.end_time
nach Effect: l.start_time = line.start_time + syl.start_time | l.end_time = line.end_time
Outro: l.start_time = line.end_time | l.end_time = line.end_time + 500
Effekte:
Es können alle Typsettingbefehle verwendet werden, allerdings statt wie in Aegisub mir „\“ müssen „\\“ vor jeden Tag gesetzt werden und Postionen in Variablen gespeichert werden, bzw deren Platzhalten eingesetzt werden.
Hier mal ein Bsp:
Code: Select all
l.text = string.format("{\\an5\\pos(%d,%d)}%s", x, y, syl.text_stripped)
-> pos oder move muss gesetzt werden
-> %d ist der Platzhalter für den jeweiligen Wert einer Variable, dieser wird anschließend in der Zeile genannt, in diesem Fall „x“ und „y“ für die Koordinaten. Für jeden Platzhalter (%d) muss eine entsprechende Varible/Wert folgen.
-> %s ist der Platzhalter für die Silbe. Kann auch durch Buchstaben ersetzt werden, diese werden dann fest gesetzt und ändern sich nicht mehr.
(Habe einige Beispiele vorbereitet)
Weitre wichtige Elemente:
Code: Select all
l.layer = [Wert] --setzt den Layerwert
l.style = „[Name]“ --setzt den Style für die Silbe
l.class = „[name]“ --entweder Dialog oder Kommentar
math.random([Wert1],[Wert2]) --Zufallszahl zwischen [Wert1] und [Wert2]
for-Schleifen:
Code: Select all
for g = 0, 9 do
[Anweisung]
end
if-Bedingung:
Code: Select all
if [Ausdruck] [Operator] [Ausdruck] then
[Anweisung]
end
Intro/Outro (aufeinander folgende Start/Endzeiten):
Code: Select all
--Aweisungsteil
if i == 1 then
[Bezeichner] = 0
end
[Effekte]
[Bezeichner] = [Bezeichner] + (500/line.kara.n)
--Ende Anweisungsteil
Hinweis: alle Werte der Variablen können nach belieben durch mathematische Ausdrücke verändert werden. "[Wort]" muss durch entsprechendes ersetzt werden.
Wie wird jetzt aus dem Script eine .ass?
1. Script einbingen: in Aegi den „Automation manager“ öffnen und das Lua-script reinladen, wenn es nicht rot hinterlegt wird, ist es richtig erstellt und kann verwendet werden.
2. Unter „File“ „Export Subtitles...“ die Rubrik des Lua-scriptes mit einem Häckchen versehen und exportieren. Eventuell noch den „Text encode“ ändern.
UND FERTIG
unter Automation 4 gibt es ein Beispielscript von shadow auf dessen Basis ich dieses Tut erstellt habe.
und ich übernehme keine Garantie für Richtigkeit^^ für Fragen und Anregungen stehe ich gerne zur Verfügung. Viel Spaß beim FXen!!!
Beispiele für wichtige Effekte und das Grundgerüst:
Code: Select all
include("karaskel.lua")
--Allgemeine Beschreibung des Scriptes
--ist nicht zwingend notwenig, aber sinnvoll
script_name = "Tut"
script_description = "Tutorial fürs Erstellen eines FX mit lua"
script_author = "shinpei"
script_version = "1.0"
--Funktion "tut_fx"
--Sinn und Zweck: ohne diese Funktion funzt das ganze Script nicht und sollte nur grändert werden, wenn man weiß, was man macht
function tut_fx(subs)
aegisub.progress.task("Getting header data...")
local meta, styles = karaskel.collect_head(subs)
aegisub.progress.task("Applying effect...")
local i, ai, maxi, maxai = 1, 1, #subs, #subs
while i <= maxi do
aegisub.progress.task(string.format("Applying effect (%d/%d)...", ai, maxai))
aegisub.progress.set((ai-1)/maxai*100)
local l = subs[i]
if l.class == "dialogue" and
not l.comment then
karaskel.preproc_line(subs, meta, styles, l)
do_fx(subs, meta, l)
maxi = maxi - 1
subs.delete(i)
else
i = i + 1
end
ai = ai + 1
end
aegisub.progress.task("Finished!")
aegisub.progress.set(100)
end
--Funktion "do_fx"
--Sie ist u.a. für die globale Position der Silben verantwortlich
function do_fx(subs, meta, line)
for i = 1, line.kara.n do
local syl = line.kara[i]
local x=syl.center + line.left --Pos wird in Variable x gespeichert: x-Koordinate (kann nach belieben verändert werden. Auswirkung auf das gesamte Script)
local y=line.margin_v --Pos wird in Variable y gespeichert: y-Koordinate (kann nach belieben verändert werden. Auswirkung auf das gesamte Script)
--Anweisungsteil:
--hier folgen die eigentlichen Befehle fürs FX
--habe hier einige wichtige Beispiele genannt
--Position
l = table.copy(line)
l.text = string.format("{\\an5\\pos(%d,%d)}%s", x, y, syl.text_stripped)
l.start_time = line.start_time
l.end_time = line.start_time + 200
l.layer = 1
subs.append(l)
--Move
l = table.copy(line)
l.text = string.format("{\\an5\\move(%d,%d,%d,%d)}%s", x, y, x + 10, y + 20, syl.text_stripped)
l.start_time = line.start_time
l.end_time = line.start_time + 200
l.layer = 1
subs.append(l)
--Transformation
l = table.copy(line)
l.text = string.format("{\\an5\\pos(%d,%d)\\t(\\fs50)}%s", x, y, syl.text_stripped)
l.start_time = line.start_time
l.end_time = line.start_time + 200
l.layer = 1
subs.append(l)
--org
l = table.copy(line)
l.text = string.format("{\\an5\\pos(%d,%d)\\org(%d,%d)}%s", x, y, x, y, syl.text_stripped)
l.start_time = line.start_time
l.end_time = line.start_time + 200
l.layer = 1
subs.append(l)
--Drawing
l = table.copy(line)
l.text = string.format("{\\an5\\pos(%d,%d)}{\\p1}m 0 0 l 640 0 l 640 60 l 0 60 l 0 0{\p0}", x, y, syl.text_stripped)
l.start_time = line.start_time
l.end_time = line.start_time + 200
l.layer = 1
subs.append(l)
--fester String
l = table.copy(line)
l.text = string.format("{\\an5\\pos(%d,%d)}[Bla]", x, y, syl.text_stripped)
l.start_time = line.start_time
l.end_time = line.start_time + 200
l.layer = 1
subs.append(l)
--for-Schleife
l = table.copy(line)
for g=0, 7 do
l.text = string.format("{\\an5\\pos(%d,%d)}%s",x , y, syl.text_stripped)
l.start_time = line.start_time + syl.start_time
l.end_time = line.start_time + syl.end_time
l.layer = 1
subs.append(l)
end
--Ende des Anweisungsteils
end
end
aegisub.register_filter("shinpei", "", 2000, tut_fx)