viernes, 15 de junio de 2012

Karaokes desde 0

Karaokes desde 0

Con esta entrada pretendo empezar a enseñar como hacer karaokes, esas cosas tan llamativas que aparecen en los openings y endings (a veces en inserts songs) de muchos animes.
Puede ser desde algo tan fácil como hacer un copy-paste como una o dos horas de programación (sí, programación) y pruebas, luego corregir errores y volver a probar. Eso depende de la calidad que quieran obtener.
Voy a dividir este tutorial (o manual como quieran llamarle) en dos formas diferentes de hacer un karaoke, no son las únicas, pero son las que sé: Templater y NyuFX. Hay otras como Automator y After Effects, sin embargo Automator es muy parecido a NyuFX pero con mas complicaciones y After Effects es el Photoshop en videos por lo que no creo que sea necesario aprenderlo (Por lo menos en este tuto).
Tienen que saber que el lenguaje de programación por excelencia para los karaokes es Lua y les va a ser muy útil aprenderlo. En el caso de NyuFX es indispensable, para templater no tanto pero puede ayudar mucho así que el primer tema que veremos será Lua, pueden saltárselo si quieren a menos que quieran aprender NyuFX (mi favorito por cierto) por lo tanto les voy a dejar un menú a continuación:
  • Lua
  • Templater
  • NyuFX

  • Lua

    Empezamos con Lua, y repito, no es que quiera que se lo salten pero no es 100% necesario y solo lo repito porque se que hay gente que no se lee algo como una introducción a un tutorial. Bueno sin mas preámbulo iniciemos.
    No pretendo enseñarles todo sobre Lua, sobre su historia confórmense con saber que la idea es que fuera un leguaje sencillo que pudiera ser incluido en C/C++ (Más info en wikipedia), es un lenguaje en el que no tienen que procuparse por el tipo de variables y aunque es sencillo puede llegar a ser muy potente. Recomiendo leer el Manual de Referencia de Lua (Traducido al español) pero si no tienen tiempo pueden seguir leyendo este manual básico y resumido

    Hola mundo

    Vamos a empezar con el ejemplo mas básico de todos: el clásico "Hola mundo" en C serían unas 7 u 8 lineas pero en lua:
    print("Hola mundo!")

    Eso es todo, como ven es realmente simple. Pasamos al siguiente tema.

    Variables

    Las variables son algo básico en cualquier lenguaje de programación consideralos un cajón o un lugar para guardar datos, en el caso de Lua, de cualquier tipo. Las variables se crean solas a la hora de usarlas y detectan automáticamente el tipo de contenido que se les asigna. Para no complicarnos las explicaciones hagamos un ejemplo simple.
    a = 2
    b = 1
    texto_suma = "El resultado de la suma es "
    texto_resta = "El resultado de la resta es "
    print(texto_suma..(a+b))
    print(texto_resta..(a-b))

    Deberíamos obtener en pantalla: El resultado de la suma es 3
    El resultado de la resta es 1

    Hay unos cuantos operadores los cuales veremos en el próximo capitulo por ahora solo quería que tuvieran claro el concepto de variable.
    Nota: Seguro les surgirá la duda ¿Y en donde puedo probar éste código?. Directamente les puedo decir que lo pueden probar en LuaJIT, pero a la final lo vamos a terminar usando en Aegisub o NyuFX por lo que no voy a hacer un tutorial de instalación ni uso de LuaJIT, quien quiera probarlo puede hacerlo pero pueden aprender sin experimentar mucho, eso lo podrán hacer después cuando entremos de lleno a los karaokes.

    Operadores

    Los operadores son algo supremamente importante y es en lo que se basa la programación(para mi) así que vamos a dedicar este capitulo para explicarlos un poco, en los ejemplos hay mas operadores de los que parece, empezaremos por los operadores aritméticos:
    • + sirve para sumar
    • - sirve para restar
    • * sirve para multiplicar
    • / sirve para dividir
    • % sirve para sacar el modulo (éste lo explico más adelante)
    • ^ sirve para sacar potencias
    • - (justo antes de un numero) sirve para cambiarle el signo (negación)
    El operador de modulo sirve para encontrar el resto que resulta de hacer la división entera de dos números. Puede tener usos interesantes pero creo que por ahora no me saldré del tema.
    Ahora los de comparación
    • < devuelve true si el primero es menor que el segundo
    • > devuelve true si el primero es mayor que el segundo
    • <= devuelve true si el primero es menor o igual que el segundo
    • <= devuelve true si el primero es mayor o igual que el segundo
    • == devuelve true si el primero y el segundo son exactamente iguales
    • ~= devuelve true si el primero y el segundo son diferentes

    Operadores lógicos

    • and devuelve true si el primero es false, en otro caso devuelve el segundo
    • or devuelve true si el primero es true, en otro caso devuelve el segundo

    Ahora si me perdí, apenas y manejo los aritméticos, ¿esto si sirve para algo?
    Si
    Este tipo de operadores sirve en muchos casos, sobre todo los de comparación(<>...), mas adelante veremos su uso.

    Continuemos, Operadores de asignación

    • =

    Aunque en otros lenguajes de programación hay más, como los combinados (+=, -=, *=, etc.)en este solo tenemos este, quien sepa cuales son los combinados seguro los va a extrañar pero debe saber trabajar sin ellos, quienes no lo sepan, no les harán falta. El operador de asignación es el que sirve para meter contenido dentro de una variable, es muy importante que no lo confundan con el operador de igualdad(==) que sirve para comparar.

    Operador de Longitud

    • #

    Otro que está solito, sirve para saber la longitud de una cadena (texto) y de un array, no creo que lo usen mucho (yo no lo hago). Nos falta uno que ya vimos en el ejemplo anterior.

    Operador de concatenación

    • ..

    Sirve para unir una cadena con otra, si tratamos de unir un texto con un número este automáticamente se transformará a texto.

    Terminamos de enumerarlos todos, deben saber que los operadores aritméticos se hacen en el orden que regularmente llevan en álgebra (primero se resuelven paréntesis, luego multiplicaciones y divisiones, luego sumas...) en caso de no saber en que orden se van a resolver coloquen paréntesis para asegurarse de que se resuelven en el orden que quieren, si quieren saber mas busquen en el manual de referencia. Y ahora el ejemplo:

    Vean el ejemplo anterior, ahora deberían poder entenderlo mejor xD

    Funciones

    Las funciones sirven para hacer un proceso ya definido solo llamando su nombre ( y opcionalmente diciéndole una información). Para este tema es mejor dar el ejemplo y explicarlo

    function multiplicar(a,b)
    	resultado = a*b
    	return resultado
    end
    print("Si multiplicas 5*6 da: "..multiplicar(5,6))
    

    Lo primero que hicimos con este codigo fue declarar la funcion multiplicar, para hacer esto utilizamos la palabra clave function luego colocamos el nombre de nuestra funcion(es muy recomendable que el nombre exprese de manera obvia lo que hace) y luego colocamos el cuerpo de la función, es decir el contenido. dentro del contenido vemos que hay una linea que dice "return resultado" resultado contiene el resultado de multiplicar a por b entonces hacemos que la funcion retorne este numero, no es obligatorio que una funcion retorne algo pero en este caso eso es lo que estamos buscando, para indicar que el cuerpo de la funcion se termina utilizamos la parabra clave end y el cuerpo de la función esta tabulado una posición para hacerla mas fácil de leer, sin embargo esto no es necesario. luego imprimimos en pantalla el texto: "Si multiplicas 5*6 da: " y luego lo concatenamos con un llamado a la función multiplicar, con los parametros 5, como valor de a, y 6, como valor de b.

    Cuando se va a imprimir en pantalla primero se resuelve la función multiplicar y se hace de cuenta que en vez del llamado a función en ese lugar está lo que retornó la función. Luego de eso se concatena el texto con el resultado y se imprime

    Puede parecer algo complicado pero una vez te acostumbres va a ser sencillo y vas a usar funciones casi sin darte cuenta (De hecho print() es una función que recibe como parámetro lo que se va a imprimir en pantalla)

    Estructuras de control

    If

    If sirve para verificar si una expresión es cierta y dependiendo del resultado ejecutar unas sentencias. También se puede opcionalmente añadir otras verificaciones con otras sentencias y una en caso de que todo sea falso. Pero en la expresión no podemos poner "Si fue primero el huevo que la gallina haz tal cosa", ya que estamos hablando de programación deben ser cosas concretas, además, para saber si algo es verdad significa que ese algo devolvió true.

    Un ejemplo para explicar todo mejor

    a=1
    b=2
    c=3
    if (a==b) then
    	print("No puedo creerlo, 1 es igual a 2")
    elseif(c==2) then
    	print("¡Ja!, matemáticos uds están destrozados porque 3 es igual a 2")
    else
    	print(":okay: los matemáticos tenian razon TT_TT")
    end
    

    Primero declaramos una variables para probar, luego empezamos con el if lo que está entre parentesis es la expresion, en caso de que fuera cierto imprimiría, "No puedo creerlo, 1 es igual a 2", en este caso sabemos que eso no va a suceder ya que en a==b a es 1 y b es 2 cuando usamos el operador de comparacion el va a retornar false, ya que 1 no es exactamente igual a 2, ya que eso no se cumple procede a hacer la segunda comprobacion, la del elseif, esta tambien devuelve false, por lo tanto debería ejecutar nada mas el cuerpo del else.

    Todo lo anterior se leería como: "Si a es igual que b entonces hacer tal cosa, si no, verificar si c es igual a 2, en ese caso entonces hacer tal otra cosa, si no, hacer tal otra"

    El "sino, verificar si"(elseif) y el "si no"(else) son opcionales, lo unico obligatorio es el end, que indica el final del if (y obviamente el if mismo, sino no sería un condicional if)

    Bucles

    Tenemos 3 bucles: El while, el repeat...until y el for. Se usan asi:

    while (expresion) do
    	sentencias
    end
    
    
    repeat
    	sentencias
    until (expresion)
    
    
    for var=numero, limite, paso do
    	sentencias
    end
    

    En el while se comprueba la expresion y mientras devuelva true se ejecutan las sentencias repetitivamente.

    En el repeat...until se ejecutan las sentencias y luego se evalua la expresion, en caso dé true se vuelven a repetir las sentencias, la diferencia con el anterior es que las sentencias se ejecutan por lo menos una vez

    El for es el más importante y lo van a usar siempre que hagan karaokes con NyuFX, se repiten las sentencias hasta que var llegue al limite, el paso se le suma automáticamente a var(el contador) al final de cada repetición, se usa para repetir algo una cantidad de veces conocida, por ejemplo, repetir algo por cada linea de un karaoke, además hay que tener en cuenta que se puede llamar a var dentro de las sentencias, ahora un ejemplo de for(con if y funciones):

    function factorial(n)
    	k=1
    	if (n==1) then
    		return 1
    
    	elseif (n==2) then
    		return 2
    	elseif (n>1) then
    		for i=2,n do
    			k=k*i
    		end
    	end
    	return k
    end
    print(factorial(6))
    

    Lo que queremos conseguir es que la función factorial pida un valor y devuelva su factorial, este valor lo llamamos n dentro de la función entonces lo primero que hacemos es declarar una variable auxiliar k con valor de 1, luego verificamos si n es igual a uno en ese caso el factorial de 1 es 1 por que devolvemos 1, al devolver algo salimos automáticamente de la función, en caso de que n no sea 1, miramos si es 2(esto no es realmente necesario), en caso de que sea 2 devolvemos 2! que es 2 en otro caso si n es mayor que 1 se entra en un bucle que se repite n veces, ya que no especificamos el paso, se supone que es 1 y dentro del bucle hacemos que cada vez k se multiplique por el "numero de vuelta" en el que vamos, de esa forma al salir del bucle (cuando se haya repetido n veces) dentro de k tendremos el resultado de ese factorial, en caso de que n no sea 1, ni 2, ni mayor que 1 (un numero negativo por ejemplo) no se va a hacer nada y se va a retornar ka con su valor inicial(1)

    Función string.format

    Esta es una función que puede importarnos bastante en el caso de que queramos hacer karaokes, sirve para reemplazar variables (o directamente texto) dentro de un texto y se usa así:

    a = string.format("Un texto %s va aquí, y luego un numero como este %.3f","cualquiera",25)
    

    El primer parámetro es el texto "original", dentro de este texto se encuentran algunas expresiones como %s o %.3f(mas info en el manual de referencia), que esperan unos datos, %s espera texto, los demás casi todos esperan números, estos datos que están esperando se colocan desde el segundo parámetro en adelante y se deben colocar tantos parámetros como lugares se deben reemplazar en el texto, ademas deben estar en el orden en que los esperan

    Función table.maxn

    Es una función que sirve para obtener la cantidad de elementos de una tabla, funciona mejor que el operador # y solo se llama con un parámetro que sería la tabla a la que queremos saber su longitud

    Por ahora eso es todo con Lua, si quieren saber mas o hay cosas que no les hayan quedado claras pueden consultar el manual de referencia o dejar un comentario

    Templater

    Pendiente

    NyuFX

    Pendiente

3 comentarios:

  1. Vamos viejo sigue con el tutorial, vas excelente, esto es algo que se necesita desde el principio, siempre es bueno saber de dónde sale con lo que se trabaja...
    Grax ( '-')=b

    ResponderEliminar
  2. Hola amigo(@)s gracias por estos tutos y esperando el de NyuFX Gracias Saludos..

    ResponderEliminar
  3. Me encanta esta pagina, sencilla y efectiva

    ResponderEliminar