Skip to content

Aquitectura y variables notables

trotacalles
Autortrotacalles

Hace poco un grupo de fansubbers de habla inglesa me pidieron que les ayudara a aprender sobre karaokes. Más adelante, otro fansubber me pidió lo mismo. Fue entonces cuando me percaté de que la documentación sobre Kara Effector estaba desactualizada o incompleta.

Uno de los autores del mismo Kara Effector me lo había mencionado, que había gran cantidad de funciones que nunca fueron documentadas. Así que me propuse usar mis conocimientos en prompting para generar una documentación clara y completa sobre todas las variables y funciones que podemos utilizar en Kara Effector, acompañadas de ejemplos y aclaraciones.

Esta es la primera versión de dicha idea. La hice con el interés de que sirva como una ayuda para quienes, como yo, quieren sacarle el mayor provecho a esta herramienta a fin de hacer mejores karaokes.

El sistema de Kara Effector no es una sola pieza, sino un conjunto de módulos interconectados. Mientras que Effector-utils-lib-3.6 proporciona las herramientas de efectos, las siguientes librerías proporcionan la base sobre la que todo se construye.

Esta es la primera y más fundamental librería que actúa sobre los subtítulos. Su trabajo es analizar cada línea de diálogo temporizada y convertirla en una estructura de datos rica y fácil de usar. Es el “esqueleto” sobre el que los efectos construirán las animaciones.

  • Análisis de tiempos: Parsea las etiquetas \k para obtener la duración y los tiempos de cada sílaba.
  • Manejo de furigana: Detecta y separa el texto furigana (texto sobre el kanji), calculando sus propias dimensiones y estilos.
  • Cálculo de dimensiones: Utiliza las funciones de Aegisub para pre-calcular el ancho, alto y posición de cada sílaba y del texto completo en la pantalla.
  • Estructura de datos: Organiza toda esta información en una tabla Lua (line.kara, line.furi) que se pasa a las funciones de efectos, simplificando enormemente el acceso a datos como syl.width o syl.center.

En resumen, karaskel hace todo el trabajo pesado de medición y posicionamiento inicial, para que los creadores de efectos puedan concentrarse en la animación.

Archivos de extensibilidad y configuración

Section titled “Archivos de extensibilidad y configuración”

Este archivo está pensado para que los usuarios avanzados añadan sus propias funciones de utilidad, variables globales o formas personalizadas. Al mantener estas adiciones en un archivo separado, se evita modificar los archivos principales de Kara Effector. Esto tiene dos ventajas:

  • Mantiene el código de Kara Effector limpio y original.
  • Facilita la actualización de Kara Effector en el futuro, ya que puedes reemplazar los archivos principales sin perder tus personalizaciones.

Ahora que hes visto todas las piezas, el flujo de trabajo en Kara Effector puede ser resumido en:

  1. Inicio

    El script principal Effector 3.6.lua se ejecuta, carga todas las librerías (karaskel, Effector-utils-lib-3.6, etc.) y los archivos de configuración (Effector-newfx-3.6).

  2. Interfaz

    Se muestra la interfaz gráfica al usuario para que seleccione las líneas, el tipo de efecto y la configuración.

  3. Pre-procesamiento

    Al aplicar el efecto, karaskel.lua analiza las líneas seleccionadas y las convierte en estructuras de datos detalladas.

  4. Ejecución del efecto

    La función del efecto seleccionado (definida a través de effector.create_fx) se ejecuta para cada sílaba/carácter/línea.

  5. Cálculos Internos

    Durante la ejecución, la función del efecto utiliza las herramientas de las librerías:

    • Usa la librería effector para la lógica principal.
    • Usa las librerías math, shape, text, color, etc… de Effector-utils-lib-3.6 para los cálculos.
    • Estas, a su vez, pueden usar las funciones de bajo nivel de Yutils.lua para las operaciones más complejas.
  6. Salida

    El resultado final es un conjunto de etiquetas de ASS, generadas por la librería tag, que se insertan en nuevas líneas de subtítulo en Aegisub.

En Kara Effector, las variables son atajos a propiedades de los elementos de karaoke (líneas, sílabas, etc.) y del entorno del script (resolución del video, etc.). Se pueden usar en casi todas las cajas de texto de la interfaz “Modify Effect”, pero son más potentes en:

  • Return[fx]: Para construir el texto o la forma final mediante un formato.
  • Variables[fx]: Para definir valores personalizados que se usarán en otras cajas de texto.
  • Add Tags[fx]: Para añadir efectos dinámicos basados en las propiedades del elemento.

Diferencias fundamentales entre variables de tiempo

Section titled “Diferencias fundamentales entre variables de tiempo”

Es muy importante entender la diferencia entre los tipos de variables de tiempo.

DescripciónEjemplo
El tiempo de inicio de la línea de diálogo original, en milisegundos, desde el principio del video. Es un valor absoluto.Si una línea empieza en la marca de 15 segundos del video, l.start_time será 15000.

Estas se llaman con line o l y contienen información sobre la línea de diálogo completa que se está procesando.

VariableAbreviatura en do_fxDescripción
line.start_timel_startTiempo de inicio de la línea (en ms).
line.end_timel_endTiempo de fin de la línea (en ms).
line.durationl_durDuración total de la línea (en ms).
line.mid_timel_midEl punto medio en el tiempo de la línea.
line.il_iÍndice de la línea actual en la selección.
line.nl_nNúmero total de líneas en la selección.
line.text_stripped-El texto de la línea sin ninguna etiqueta ASS.
line.widthl_widthAncho total de la línea en píxeles.
line.heightl_heightAlto total de la línea en píxeles.
line.left line.center line.rightl_left l_center l_rightCoordenadas X de la caja delimitadora de la línea.
line.top line.middle line.bottoml_top l_middle l_bottomCoordenadas Y de la caja delimitadora de la línea.
line.descent line.extleadMétricas de la fuente: descenso y espaciado externo.
line.stylerefLUna referencia al objeto de estilo completo de la línea.
line.hira .kata .romaline.hira .kata .romaEl texto completo de la línea convertido a hiragana, katakana o romaji.

Estas se llaman con syl y están disponibles cuando Template Type es Syl, Syl Multi, Char, Furi, o cualquiera de las conversiones a kana/romaji.

VariableAbreviatura en do_fxDescripción
syl.start_timesyl_startTiempo de inicio de la sílaba, relativo al inicio de la línea (en ms).
syl.end_timesyl_endTiempo de fin de la sílaba, relativo al inicio de la línea.
syl.durationsyl_durDuración de la sílaba (en ms).
syl.mid_timesyl_midEl punto medio en el tiempo de la sílaba.
syl.isyl_iÍndice de la sílaba actual en la línea.
syl.nsyl_nNúmero total de sílabas en la línea.
syl.text_strippedsyl.textEl texto de la sílaba sin etiquetas.
syl.widthsyl_widthAncho de la sílaba en píxeles.
syl.heightsyl_heightAlto de la sílaba en píxeles.
syl.left, syl.center, syl.rightsyl_left, syl_center, syl_rightCoordenadas X de la sílaba.
syl.top, syl.middle, syl.bottomsyl_top, syl_middle, syl_bottomCoordenadas Y de la sílaba.
syl.prespacewidthAncho en píxeles del espacio en blanco antes de la sílaba.
syl.postspacewidthAncho en píxeles del espacio en blanco después de la sílaba.

Estas se llaman con word y están disponibles cuando Template Type es Word, Translation Word, o un tipo de plantilla basado en líneas.

VariableAbreviatura en do_fxDescripción
word.start_timeword_startTiempo de inicio estimado de la palabra, relativo al inicio de la línea.
word.end_timeword_endTiempo de fin estimado de la palabra.
word.durationword_durDuración estimada de la palabra.
word.iword_iÍndice de la palabra actual en la línea.
word.nword_nNúmero total de palabras en la línea.
word.textEl texto de la palabra.
word.width .heightword_width word_heightDimensiones de la palabra.
word.left .center .rightword_left word_center word_rightCoordenadas X de la palabra.

Estas se llaman con char y están disponibles cuando Template Type es Char o Translation Char.

VariableAbreviatura en do_fxDescripción
char.start_timechar_startTiempo de inicio estimado del carácter, relativo al inicio de la línea.
char.end_timechar_endTiempo de fin estimado del carácter.
char.durationchar_durDuración estimada del carácter.
char.ichar_iÍndice del carácter en la línea.
char.nchar_nNúmero total de caracteres en la línea.
char.textEl carácter actual (una cadena de un solo carácter).
char.width .heightchar_width char_heightDimensiones del carácter.
char.left .center .rightchar_left char_center char_rightCoordenadas X del carácter.

Estas se llaman con fx y se calculan para cada línea de efecto que se genera. Son cruciales para entender el contexto temporal y espacial del propio efecto.

VariableDescripción
fx.start_timeEl tiempo de inicio real de la línea de efecto que se está creando (en ms).
fx.end_timeEl tiempo de fin real de la línea de efecto que se está creando (en ms).
fx.durLa duración real de la línea de efecto (fx.end_time - fx.start_time).
fx.pos_x fx.pos_yLa coordenada central final (X, Y) del objeto, después de aplicar funciones paramétricas y desplazamientos.
syl.syl_startTiempo de inicio de la sílaba relativo al inicio del efecto. Esta es la variable clave a usar dentro de una etiqueta \t() para la sincronización de karaoke.
syl.syl_endTiempo de fin de la sílaba relativo al inicio del efecto.

Estas variables controlan los bucles para crear efectos complejos, repetitivos o por capas.

VariableDescripción
jEl contador del bucle principal (definido en la caja loop). Itera desde 1 hasta maxj.
maxjEl número total de iteraciones para el bucle principal.
moduleLa variable más importante para la animación. Representa el progreso del bucle j, normalizado de 0.0 a 1.0.
Se calcula como (j−1)/(maxj−1)(j - 1) / (maxj - 1).
module1 module2Módulos de progreso anidados, relativos al número de sílabas y al número de líneas, respectivamente.
JEl contador del bucle externo (definido por la función replay()).
maxJEl número total de repeticiones del efecto.
modulerEl progreso del bucle J, normalizado de 0.0 a 1.0.

Estas se llaman con meta y L y dan información sobre el script de Aegisub y el estilo de la línea.

VariableAbreviatura en do_fxDescripción
meta.res_x meta.res_yxres yresLa resolución X e Y del script de Aegisub.
frame_durLa duración de un único fotograma de video (en ms).
ratioratioUn factor de corrección de la relación de aspecto, útil para adaptar efectos a diferentes resoluciones de video.
L.color1 L.color3l_color1 l_color3Los colores primario y de contorno del estilo de la línea.
L.alpha1 L.alpha3l_alpha1 l_alpha3Las transparencias primaria y de contorno del estilo.
L.outline L.shadowl_outline l_shadowEl grosor del contorno y de la sombra del estilo.
L.fontsize L.fontnamel_fsize l_fnameEl tamaño y el nombre de la fuente del estilo.

Estas se llaman con $. El script Effector-utils-lib-3.6.lua define una serie de variables con un prefijo $ como atajos a las variables más comunes. Son extremadamente útiles para escribir código más corto y legible.

VariableEquivalente en LuaDescripción
$lstart $lend $ldurl_start l_end l_durTiempos de la línea.
$li $linenl_i l_nÍndice de la línea y total.
$lleft $lcenter $lrightl_left l_center l_rightPosición X de la línea.
$ltop $lmiddle $lbottoml_top l_middle l_bottomPosición Y de la línea.
$lwidth $lheightl_width l_heightDimensiones de la línea.

Estas son las variables fundamentales sobre las que Kara Effector construye las suyas. Se usan con menos frecuencia directamente en la interfaz de usuario, pero entenderlas es crucial para funciones avanzadas y para depurar errores. Estas propiedades son añadidas por el script karaskel.lua a cada objeto line durante el preprocesamiento.

VariableDescripción
line.karaLa tabla principal que contiene todas las sílabas de karaoke procesadas. line.kara[i] es lo que se convierte en el objeto syl dentro de un efecto.
line.kara.nEl número total de sílabas en la línea.
line.furiUna tabla separada que contiene todos los segmentos de furigana procesados.
line.stylerefUn objeto completo que contiene todas las propiedades del estilo de la línea (color, fuente, márgenes, etc.). La abreviatura L en los efectos apunta a esto.
line.effectEl texto original del campo Effect de la línea.

Estas son variables especiales y potentes diseñadas para Template Types como Template Line [Syl]. A diferencia de syl.width (que te da el ancho de la sílaba actual), estas variables otorgan acceso a una tabla con las propiedades de todos los elementos de la línea a la vez.

VariableDescripciónEjemplo de Uso
.width[k]Ancho de la k-ésima sílaba.linefx[ii].syls.width[syl.i]
.center[k]Centro de la k-ésima sílaba.linefx[ii].syls.center[syl.i]
.start_time[k]Tiempo de inicio de la k-ésima sílaba.linefx[ii].syls.start_time[syl.i]

Es tan importante saber lo que no puedes usar como lo que sí puedes. La inaccesibilidad de ciertas variables no es una limitación de Kara Effector, sino una consecuencia de cómo funcionan la programación y los “ámbitos” de las variables.

En resumen, solo puedes llamar a variables que existen y tienen un valor en el momento exacto en que tu código en la caja de texto de la UI es evaluado. Este momento es dentro de la función effector.do_fx, para una línea, sílaba e iteración de bucle específicas.

Aquí tienes una aclaración de las secciones y tipos de variables que NO puedes llamar directamente desde las cajas de texto de la UI de Kara Effector, y la razón.

Variables de configuración de la interfaz gráfica de usuario (GUI)

Section titled “Variables de configuración de la interfaz gráfica de usuario (GUI)”

Estas variables definen la ventana que estás viendo. No son datos de karaoke, sino metadatos sobre la propia herramienta.

Estas son variables que el script principal (Kara Effector 3.6.lua) usa para gestionar su estado, contar cosas y almacenar datos globalmente mientras se ejecuta.

Variables locales y temporales de preprocesamiento

Section titled “Variables locales y temporales de preprocesamiento”

Antes de que tu efecto se ejecute, karaskel.lua analiza cada línea. Durante este proceso, usa muchas variables temporales para calcular anchos, posiciones y estructuras.

Variables internas de funciones de librerías

Section titled “Variables internas de funciones de librerías”

Puedes llamar a las funciones de estas librerías (p.e. shape.rotate(...)), pero no puedes acceder a las variables que están dentro de esas funciones.

El objeto global aegisub y su estado interno

Section titled “El objeto global aegisub y su estado interno”

El script interactúa con Aegisub a través de una API (Interfaz de Programación de Aplicaciones), que se compone principalmente de funciones. No expone su estado interno como variables que puedas leer.

CategoríaVariables/Secciones de EjemploRazón de la Inaccesibilidad
Configuración de UIeffector.GUI_config effector.GUI_modify fx_boxDefinen la interfaz gráfica; no son variables de datos de karaoke.
Motor del scriptcount_save list_fx list_library fx_boxSon parte de la maquinaria interna del script, fuera del ámbito de ejecución del efecto.
Preprocesamientoworksyl cur_inline_fx (en karaskel.lua)Son variables temporales y locales que se destruyen una vez que su tarea ha finalizado.
Funciones de libreríaVariables internas de Yutils.shape.split o tag.oscillSon locales a las funciones. Solo recibes el resultado final que la función retorna.
Estado de AegisubEl número de líneas seleccionadas, el historial de deshacerAegisub no expone su estado interno como variables, solo a través de una API basada en funciones.