NyuFX
Inhaltsverzeichnis
NyuFX
NyuFX ("NewEffects") ist ein ASS basiertes Karaoke-Effekt Generierungsprogramm, welches durch die Skriptsprache Lua, erweitert in ihrer Ausstattung, u.a. neue Dateien mit Effekten erstellen kann.
Neben der einfachen Verkettung von ASS Tags und Objekten (Texte oder Zeichen-Befehle), stehen auch Funktionen für Raster- und Vektor-Rendering, sowie anderer Techniken, zur Verfügung und erlauben somit selbst einer ASS Datei ein hohes Maß an 2D Grafikerstellung.
Geschichte
NyuFX wird jeher von dem deutschen Fansubber "Youka" entwickelt.
Die Entwicklung begann im Jahr 2010 mit der Absicht, ein besseres Karaoke-FX Programm in die Community zu bringen.
Die bisher verbreiteten Programme, wie ASSCalc, Automation 4, ssapawaa oder Overlua, mangelten stark an Dokumentation und Benutzerfreundlichkeit, zudem waren ihre Möglichkeiten nicht minder begrenzt. Um Karaoke-FXern, welche auf den Gebrauch von Adobe After Effects verzichten wollten, dennoch ein leicht zu nutzendes und doch sehr mächtiges Programm anzubieten, wurde NyuFX mit einer Vielzahl von Funktionen und ASS Werten, sowie neuerdings mit einer großen grafischen Benutzeroberfläche, und einer großzügigen englischen Dokumentation veröffentlicht.
Definition
Im Folgenden wird der Umgang mit NyuFX erklärt.
Ein- und Ausgabe
NyuFX erhält als Eingabe eine .ass und eine .lua Datei.
Die .ass Datei sollte die Karaoke-Zeiten enthalten und dient somit als Informationsquelle für die nötigen Texte und Zeiten.
Die .lua Datei enthält Code in der Skriptsprache Lua, welcher ausgeführt wird, um somit die Ausgabe zu generieren.
Die Ausgabe sollte ebenfalls eine .ass Datei sein, welche schließlich eine mit Effekten versehene Version der Karaoke-Zeiten ist.
Prinzip
Die Effekt-Erstellung beruht auf dem Prinzip der Objektorientierung:
ASS Dialogzeilen stehen in Form von Tables in Lua zur Verfügung. Deren Inhalte entsprechen den Attributen einer ASS Dialogzeile, wie Layer, Startzeit, Endzeit, Text, usw.
Durch Manipulation der Table-Inhalte wird die ASS Dialogzeile verändert und kann über eine Funktion ausgegeben werden, d.h. in Textform zurückgewandelt und an das Ende der Ausgabedatei angefügt werden.
Neben den Dialogzeilen stehen selbstverständlich auch Styles und Metadaten in Lua zur Verfügung.
Desweiteren helfen diverse Funktionen verschiedene Techniken in ASS umzusetzen, wie z.B. die Umwandlung einer Zeichnung oder Text in (kantengeglättete) Pixeldaten, die Umwandlung eines Textes zu einer Zeichnung (Verformung oder Masken), Frame-für-Frame Animationen, Bezierkurven und einiges mehr.
Anwendung
Um mit NyuFX arbeiten zu können, muss selbstverständlich ein Grundwissen in den bereits genannten Bereichen, dem Untertitel-Format ASS und der Skriptsprache Lua, vorhanden sein!
Zuerst müssen die Karaoke-Zeiten vorliegen, welche mit Aegisub erstellt werden können. Anschließend kann Schritt-für-Schritt mit der Erstellung der Effekte begonnen werden.
Ein Lua-Skript wird angelegt und Effekte beschrieben. Zwischendurch können Ergebnisse generiert werden, um sich die Veränderungen anzuschauen und dementsprechend weiterzuarbeiten. Die genaue Anwendung wird in den Dokumentationen beschrieben und ist recht einfach.
Beispiele
Folgende Beispiele sind .lua Dateien, welche als Effekt-Beschreibung dienen.
Minimal
Die erste Dialogzeile begrenzt ihren Text auf ihre erste Silbe und wird ausgeben.
lines[1].text = lines[1].syls[1].text io.write_line( lines[1] )
Einfach
Ein einfacher "Silbe wächst und schrumpft zum Einsatz"-Effekt.
function sub(line, l) l.start_time = line.start_time - line.infade/2 l.end_time = line.end_time + line.outfade/2 l.text = string.format("{\\fad(%d,%d)\\blur2}%s", line.infade/2, line.outfade/2, line.text) io.write_line(l) end function roumaji(line, l) for si, syl in ipairs(line.syls) do if syl.text ~= "" then l.text = string.format("{\\an5\\pos(%.3f,%.3f)\\t(%d,%d,\\fscy150)\\t(%d,%d,\\fscy100)}%s" , syl.center, syl.middle, syl.start_time, syl.mid_time, syl.mid_time, syl.end_time, syl.text) io.write_line(l) end end end function kanji(line, l) for ci, char in ipairs(line.chars) do if char.text ~= " " then l.text = string.format("{\\an5\\pos(%.3f,%.3f)\\t(%d,%d,\\fscx150)\\t(%d,%d,\\fscx100)}%s" , char.center, char.middle, char.start_time, char.mid_time, char.mid_time, char.end_time, char.text) io.write_line(l) end end end for _, line in ipairs(lines) do if not line.comment then if line.styleref.alignment >=7 then roumaji(line, table.copy(line)) elseif line.styleref.alignment <=3 then sub(line, table.copy(line)) else kanji(line, table.copy(line)) end end io.progressbar(li / #lines) end
Text Formate
Text wird untereinander als Original-Text, als Zeichnung und als Pixels dargestellt.
-- Line to draw local line = lines[1] local l = table.copy(line) -- Text l.effect = "text" l.text = string.format("{\\bord0}%s", line.text) io.write_line(l) -- Shape l.effect = "shape" l.text = string.format("{\\bord0\\an7\\pos(%.3f,%.3f)\\p4}%s", line.left, line.top + line.height, convert.text_to_shape(line.text, line.styleref)) io.write_line(l) -- Pixels l.effect = "pixel" for _, pixel in ipairs(convert.text_to_pixels(line.text, line.styleref, line.left % 1, (line.top + line.height * 2) % 1)) do local x, y = math.floor(line.left) + pixel.x, math.floor(line.top + line.height * 2) + pixel.y local a = pixel.a == 255 and "" or "\\1a" .. convert.a_to_ass(pixel.a) l.text = string.format("{\\bord0\\an7\\pos(%d,%d)%s\\p1}m 0 0 l 1 0 1 1 0 1", x, y, a) io.write_line(l) end