NyuFX

Aus WiFX - The Karaoke Wiki for ASSCalc, NyuFX, Lua, AFX, Tenfex & Templater
Wechseln zu: Navigation, Suche

NyuFX

NyuFX Logo.png

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

Screenshots

GUI.png
Pixels & mask.png Gradient & wobbling.png
Image in pixels.png Curve move & border pixels.png

Links