• Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
  • Avatar do Utilizador
#128490
Mais um tutorial da minha parte, finalmente irei partilhar todos os meus conhecimentos ganhos em 8 anos de fansubbing, a minha retirada definitiva poderá estar para breve, e quero ver anime descansado no meu sofá e queria muito vê-lo com qualidade, e como tal, sinto que tenho o dever de transmitir os meus conhecimentos com quem tem sede de aprender.

Desta vez será sobre como fazer efeitos em LUA4 fazendo uso da LeinadCollection, que é uma colecção de funções que irá facilitar a criação de efeitos.
Irei tentar explicar da melhor forma possível para que não surjam dúvidas. Sobre a LeinadCollection não se preocupem que também irei explicar. Não explicarei as Expressões de .ass, porque isso é o básico e deverão aprender antes de ler este tutorial, para poder compreender os Efeitos.

Antes de mais vou ensinar a fazer uso de cores e tipos de letra nos karaokes, é que por melhor que seja o efeito... basta usar cores que causam cancro visual ou derrame ocular para tornar o karaoke numa valente porcaria. E são esses 2 factores que espero que dêem valor.

O tipo de letra a escolher tem de se adaptar ao vídeo, tem de parecer que faz parte do meio ambiente do vídeo em questão, tem de ter personalidade. E não é escolher a primeira fonte que apareça, ou usar uma fonte que seja bonita, embora não se relacione com o vídeo em questão. E este é o primeiro e mais importante factor. Porque o aspecto visual conta e muito. Após termos escolhido o tipo de letra, passamos à escolha de cores. Pode parecer que não, mas tem bastante importância, visto que faz parte do aspecto visual. E as cores tal como o tipo de letra, tem de ser uma espécie de camaleão e representar o vídeo. Para a sua escolha, basta usar-se as cores que mais predominam no vídeo. Dito isso, há que ter em atenção à combinação da cor da borda com a cor do interior. É que já vi bordas verdes com interiores cor-de-rosa, ou mesmo borda a azul-marinho com interior ciano e sombra a branco, e garanto-vos que irá fazer-vos literalmente sangrar dos olhos xD. O interior, na maioria dos casos, tem de ser uma cor mais suave/pálida e a borda normalmente fica bem algo mais escuro, e caso não se coloque borda alguma e ao invés se usar sombra, esta também terá de ser com cores mais escuras que o interior. Embora haja algumas excepções.
São apenas os meus conselhos. Agora passo aos exemplos:

Imagem

Imagem

Como podem ver, a 1ª imagem é um exemplo de "cancro visual", visto que as cores que foram usadas foram as básicas, nem o raio da ferramenta da "Gota" foi usado.
No 2º caso, é notório a boa combinação de cores que nos dá um melhor contraste visual.

Refiro também que o alinhamento do karaoke também tem a sua importância. Apesar de para muitos ser insignificante, há casos em que fica melhor alinhado à esquerda do que ao centro. Mas também é um pouco de gosto pessoal.

Para terminar, ao trabalharem com figuras, há que ter consciência das cores, borda e/ou sombras usadas, visto que há figuras também com cores muito vibrantes ou que realçam demasiado das cores escolhidas para o karaoke em si, e isso é apenas outra variante de cancro visual.

Imagem

Imagem

Imagem

No primeiro caso, as pétalas amarelas não combinam com a legenda e força a vista. Outro ponto a ter em conta, nesse 1º exemplo, é o tamanho da borda da figura, na maioria dos casos, esse incluído, até é preferível nem usar. O 2º exemplo mostra claramente que ficaria melhor sem borda, visto que é uma pétala. Outro caso é em flocos de neve, e por incrível que pareça cheguei já a ver em alguns vídeos, flocos de neve com bordas, o que arruinou o karaoke por completo.

Escusado dizer que o 3º exemplo é uma das cores acertadas para uma pétala que se assemelha às "sakura".

Após esta pequena aula de fazer ver a importância da combinação das cores com as bordas e/ou sombras, do alinhamento e do tamanho das bordas/sombras, vou passar às explicações de como criar scripts LUA fazendo uso da LeinadCollection.



Como Fazer Karaoke em LUA - Parte 2


Está na horinha de criar o nosso primeiro script em LUA (saudades... até dá vontade de chorar xD), e para isso vamos precisar da LeinadCollection e partilho também um complemento dessa biblioteca que se destina apenas a simplificar o uso de formas, a LeinadFormas. Uma vez em nossa posse, colocamos ambos os ficheiros na pasta Aegisub\automation\include. Depois de instalada, iremos transferir o seguinte Ficheiro LUA e o seguinte programa: Notepad++.

Antes de mais, irei explicar o que consiste a "leinadcollection.lua". É uma biblioteca de funções criada por mim, com base em diversas, para simplificar a forma de se fazer os efeitos, e foi graças a diversas pessoas ao longo do tempo que isto começou a ganhar forma e se tornou no que hoje é, não passava de um conjunto de funções espalhadas num txt. Com esta ferramenta o trabalho é muito menor, logo melhor do que o método normal (antigo) que seria usar-se "String.Format", mas que confundia sempre um pouco aquando da declaração de variáveis. Deixo já de seguida a diferença entre ambos os métodos, como se usava antes (método normal), e o que se usa com a leinadcollection (método melhorado).

Dando um exemplo... actualmente, se quiséssemos fazer um efeito teríamos de escrever isto:
Código: Selecionar todos
l = table.copy(line)
l.text = string.format("{\\an5\\pos(%d,%d)\\1c%s\\bord0\\t(\\bord1)}%s",x,y,line.styleref.color2,syl.text_stripped)
l.start_time = line.start_time+tempo
l.end_time = line.start_time+syl.start_time
l.layer=3
subs.append(l)
Com a leinadcollection, apenas é necessário:
Código: Selecionar todos
l = table.copy(line)
l.text = "{"..an(5)..pos(x,y)..estilo(1,line.styleref.color2)..bord(0)..t(bord(1)).."}"..sil()
l.start_time = line.start_time+tempo
l.end_time = line.start_time+syl.start_time
l.layer=3
subs.append(l)
Como podem reparar e bem, apesar de ser muito idêntico, facilita a escrita e leitura/visualização dos efeitos.

Agora, vamos lá tentar criar o nosso primeiro efeito. Depois de ambos os ficheiros estarem em nossa posse, instalámos o Notepad++ e abrimos o aula_basica.lua.
A vantagem de usar o Notepad++ é principalmente por ele colorir o código, o que torna mais fácil de ler e compreender.
Ao ver o script, peço-vos que não se assustem e que não desistam, porque pode parecer complicado, mas não o é, e facilmente se adaptam.

include("karaskel.lua")
include("leinadcollection.lua") -- Adicionar Biblioteca

script_name = "Karaoke Teste Básico"
script_description = "Lua4 com LeinadCollection"
script_author = "Leinad4Mind"
script_version = "1.0"
No início do ficheiro inclui-se sempre o "karaskel.lua" que é a biblioteca principal do Aegisub para criar efeitos, visto que contém todas as variáveis essenciais para a criação destes. De seguida incluímos a nossa leinadcollection.lua para poder fazer uso das nossas próprias funções de efeitos. O resto do código fala por si.
E é o suficiente para poder adicionar o nosso ficheiro LUA à "Automatização" do Aegisub, visto já ter nome e descrição.

Imagem


De seguida vem a nossa Macro:
Código: Selecionar todos
function fx_leinad(subs)
	aegisub.progress.task("A recolher dados...")
	local meta, styles = karaskel.collect_head(subs)
	
	aegisub.progress.task("A aplicar efeito...")
	local i, ai, tere, tereai = 1, 1, #subs, #subs
	while i <= tere do
		aegisub.progress.task(string.format("A aplicar efeito (%d/%d)...", ai, tereai))
		aegisub.progress.set((ai-1)/tereai*100)
		local l = subs[i]
		if l.class == "dialogue" and
				not l.comment and
				(l.style == "Default" or l.style == "Karaoke") then --Pode-se alterar para o nome do Estilo a que queremos aplicar o efeito, ou adicionar mais estilos.
			karaskel.preproc_line(subs, meta, styles, l)
			do_fx(subs, meta, l)
			tere = tere - 1
			subs.delete(i)
		else
			i = i + 1
		end
		ai = ai + 1
	end
	aegisub.progress.task("Terminado!")
	aegisub.progress.set(100)
	aegisub.set_undo_point("fx_leinad")
end
Essa função serve para elegermos qual o Estilo a que o Efeito será aplicado (Ver linha 32). Neste exemplo estamos a aplicar ao estilo "Default" e "Karaoke", se desejarmos aplicar a mais estilos não tem nada que saber, basta meter "or" seguido de l.style == "ESTILO" (Em ESTILO, é óbvio que colocarão o nome do outro estilo que pretendem adicionar). Exemplo: (l.style == "Default" or l.style == "Karaoke" or l.style == "Opening") then.
Esta função cria a Macro que aplica os nossos efeitos aos karaokes:

Imagem


Todo o resto do código, não tem assim muito mais importância. Continuemos para o código seguinte:
Código: Selecionar todos
function do_fx(subs, meta, line)
	for i = 1, line.kara.n do
		local syl = line.kara[i]
		local x=syl.center + line.left
		local y=line.margin_v + 25
		sil(syl) -- Adicionámos a nova função de Sil (Encontra-se na LeinadCollection)
A função do_fx obtém/captura os dados no nosso ficheiro .ass. Pode-se ver um ciclo for, para quem não sabe, os ciclos usam-se quando queremos repetir diversas vezes uma parcela de código, no nosso contexto desejamos repetir para a quantidade de sílabas existentes em todo o nosso karaoke e para isso usaremos line.kara.n, visto ser uma variável que nos diz a quantidade de sílabas por linha. Depois temos a declaração de algumas variáveis para facilitar a escrita do código, temos a nossa sílaba syl, e as posições x e y (De notar que no alinhamento vertical, ou seja, y, o 25 é o número de pixeis em relação à margem, se aumentarem esse valor a linha do karaoke irá descer). E por fim temos a nossa função sil, que serve para escrever as nossas sílabas no nosso .ass final.

Agora temos vários blocos de código, todos eles relativos a efeitos, e estão agrupados por ordem de tempo, ou seja, por ordem que serão exibidos no ecrã: EFEITO DE ENTRADA-SÍLABAS ESTÁTICAS-EFEITO DAS SÍLABAS-EFEITO DE SAÍDA. Cada bloco possui uma linha que corresponde ao efeito, outra ao tempo de entrada, outra ao tempo de saída e outra sobre o nível da camada. Este último é importante quando queremos sobrepor um efeito sobre outro, visto que é para isso que serve as camadas, o maior número, sobrepõe-se às outras.

Basta ler o código seguinte que está comentado, para entenderem o que cada linha realmente representa:
--#EFEITO DE ENTRADA
l = table.copy(line) --Copia as linhas para se usar
l.text = "{"..alpha('ff')..an(5)..move(x+20,y-20,x,y)..bord(0)..fr(-45)..color(1,'ffffff')..t(fr(0)..color(1,line.styleref.color2)..bord(2)..alpha(00)).."}"..sil() --Efeitos (Onde poderás adicionar os teus efeitos de entrada)
l.start_time = line.start_time-500 --Tempo de Entrada do Efeito (-500 = entrará 0.5 segundos antes do seu tempo.
l.end_time = line.start_time --Tempo de Saída do Efeito
l.layer=0 --Número da Camada... Ou seja, em que nível ficará o Karaoke (Por detrás ou à frente de outros efeitos)
subs.append(l) --Adiciona a linha que foi copiada e modificada à legenda
E para terminar, falta só o registo das macros:
Código: Selecionar todos
aegisub.register_macro(script_name, "Aula Básica de LUA! D:", fx_leinad)
aegisub.register_filter(script_name, "Aula Básica de LUA! D:", 2000, fx_leinad)
Estes registos servem para que a macro surja tanto na Automatização (aegisub.register_macro) como também na exportação de legenda (aegisub.register_filter).

Imagem

E assim finalizo a aula básica onde expliquei a estrutura do script. Na próxima parte, irei aprofundar o essencial, porque é natural que ainda existam dúvidas sobre o que é o syl.start_time, l.style, e por aí adiante. Podem também ler o Manual do Aegisub para entender ainda melhor todo o código que provavelmente nem sequer irei mencionar.


Como Fazer Karaoke em LUA - Parte 3



Nesta parte as coisas começarão a ser mais "pesadas". Quem cursa informática ou esteja à vontade com linguagens de programação, não terá dificuldade alguma. E quando digo "pesada", é porque teremos de aprender diversas funções e nomes de variáveis que servem para se fazer os efeitos. Começarei por detalhar a linguagem Lua e só depois irei focar nas coisas fundamentais do Aegisub.

Linguagem LUA

Símbolos: São muito frequentes e é natural que temos de os conhecer para sabermos realizar operações matemáticas.
== igual a
~= não é igual a (diferente a)
< menor que
> maior que
<= menor ou igual que
>= maior ou igual que
+ somar
- subtrair
* multiplicar
/ dividir
^ potência

Função: As funções são criadas para nos poupar trabalho. E claro são necessárias se não queremos repetir sempre o mesmo código, então se houvesse um erro, teria de se corrigir em todas as repetições de código, e desta forma só se corrige a função.

Exemplo:
function Soma(a, b) -- Criação da função Somar, que recebe 2 valores: a e b
somar = a+b -- Criação de uma variável que ficará com o valor da soma de a + b
return somar -- Retorno da variável somar, que será o resultado a imprimir
end -- Fim da função
Modo de Uso:
Soma(5, 10)
>>15
(Ao escreverem Soma(5,10) o resultado que irá advir daí é 15. Portanto o >> é apenas para entenderem que se executassem essa função, seria imprimido o valor a frente de >>)

if – else – not – elseif: A condição if verifica se algo é verdadeiro ou falso. O if apenas nos devolve um valor True (verdadeiro) e um valor False (falso) que podemos definir se usarmos o else.

Exemplo 1:
var = rand(5, 10) -- Criação de uma variável com números aleatórios entre 5 e 10
if var == 10 then -- SE a variável VAR for IGUAL a 10 ENTÃO
val = 20 -- a variável VAL ficará com o valor 20 (valor True)
end -- Fim do if
Como não definimos um FALSE, o valor de var se não for igual a 10, continuará a ser o que lhe calhou aleatoriamente.
Exemplo: Se fosse 5, continuaria a ser 5, mas se fosse 10, seria alterado para 20, porque foi isso que definimos no valor TRUE.


Exemplo 2:
var = rand(5, 10) -- Criação de uma variável com números aleatórios entre 5 e 10
if var == 10 then -- SE a variável VAR for IGUAL a 10 ENTÃO
val = 20 -- a variável VAL ficará com o valor 20 (valor True)
else -- SENÃO
val = 30 -- a variável ficará com o valor 30 (valor False)
end -- Fim do if
Aqui já definimos um FALSE, portanto... todo o número diferente de 10, será automaticamente alterado para 30, que foi o valor que definimos.


Podemos também usar if nas funções e executar um not, onde aplicaremos se não existir um valor declarado na função. Pode ser muito útil, como podemos ter de considerar o seu uso.

Exemplo 3:
function Soma(a, b) –- Criação da função Somar, que recebe 2 valores: a e b
if not b then –- SE NÃO existir valor em b ENTÃO
somar = a+a –-Criação de uma variável que ficará com o valor da soma de a + a
else –- SENÃO (SE existir valor em b)
somar = a+b –- Criação de uma variável que ficará com o valor da soma de a + b
end –- Fim do if
return somar –- Retorno da variável somar, que será o resultado a imprimir
end –- Fim da função
Modo de Uso:
Soma(5, 10)
>>15
Soma(3)
>>6

Por último, temos um elseif que dá-nos a possibilidade de criar outra opção "True/False".

Exemplo 4:
function Soma(a, b, c) –- Criação da função Somar, que recebe 3 valores: a, b e c
if not b and c then –- SE NÃO existir valor em b e c ENTÃO
somar = a+a –- Criação de uma variável que ficará com o valor da soma de a + a
elseif not c then –- SENÃO SE NÃO existir valor em c ENTÃO
somar = a+b –- Criação de uma variável que ficará com o valor da soma de a + b
else –- SENÃO (SE existir valor em a, b e c)
somar = a+b+c –- Criação de uma variável que ficará com o valor da soma de a + b + c
end –- Fim do if
return somar –- Retorno da variável somar, que será o resultado a imprimir
end –- Fim da função
Modo de Uso:
Soma(5, 10, 3)
>>18
Soma(3)
>>6
Soma(2, 8)
>>10

for – while: Estes dois são estruturas de repetição, quero dizer com isso que podemos repetir X quantidade de vezes o código nele contido. O for é o mais usado para se fazer efeitos, visto que é mais rápido e simples.

Exemplo 1:
for j = 1, 5 do –- Criação de um for com variável j, que é a que controla a repetição. Neste caso irá repetir-se 5 vezes.
var = 5+j –- Criação de uma variável var com valor 5 + o valor actual de j que irá aumentar a cada ciclo.
end –- Fim do Ciclo
Resultado:
>>6
>>7
>>8
>>9
>>10
Como j se repete 5 vezes (de 1 a 5), a cada ciclo que ele faz vai somando a var o valor de j que está sempre a ser incrementado pelo próprio ciclo:
5+1=6, 5+2=7, 5+3=8, 5+4=9, 5+5=10. O valor a vermelho é o valor de j, que vai de 1 a 5.


O while é bem mais distinto, visto que temos de criar antes uma variável de incrementação que tem de ser menor que a quantidade a se repetir.

Exemplo 2:
ini = 0 -- Criação da variável de incremento, deverá ser (sempre) 0
while ini < 5 do -- Criação do ciclo while com a instrução que verifica se a variável ini é menor que 5, e se isso se verificar então executa o código da função
var = 5+ini -- Criação de uma variável var com valor igual a 5 + valor do incremento ini
ini = ini+1 -- Ao contrário do ciclo for, o incremento tem de ser feito por nós, e faremos um que incremente de 1 em 1 (0+1=1, 1+1=2, 2+1=3, 3+1=4, 4+1=5)
end -- Fim do ciclo
Resultado:
>>6
>>7
>>8
>>9
>>10

local – do – then – end – and – or: Quando usámos local, o que estamos a dizer é que iremos executar apenas de maneira local e não global. Normalmente as variáveis declaradas como local podem apenas ser usadas dentro das funções onde foram declaradas, e fora dessa função essa variável nem sequer é reconhecida, só se fosse global. O do é usado para iniciar um ciclo e o then para iniciar o if ou o elseif. O end é usado para dar um fim a alguma função ou ciclo ou condição. E por fim o and e o or são usados para dar mais alternativas nas condições if.

Exemplo:
local valor = 10 -- Variável local
if valor <= 10 and valor >=5 then -- Se VALOR for menor ou igual a 10 E maior ou igual a 5 ENTÃO

end

valor = 10 -- Variável global porque não se colocou local
if valor == 10 or valor == 5 then -- Se VALOR for igual a 10 OU igual a 5 ENTÃO

end

Biblioteca math: Esta biblioteca que vem incluída na linguagem Lua, serve para fazermos cálculos matemáticos, daí o math x'D. Existem várias funções math, mas apenas irei falar de alguma delas, as mais usadas para os efeitos de karaoke. A primeira será math.random, que nos dá um número aleatório de acordo com os limites estabelecidos. O primeiro valor tem de ser menor que o segundo e pode ser um valor negativo. Este math fazendo uso da leinadcollection passa a ser rque é uma função que faz uso delaso dela.

Exemplo 1:
var1 = math.random(16, 33)
var2 = math.random(-10, 0)
var3 = rand(-5, 11)
Possível Resultado:
>>21
>>-2
>>9

Agora falarei de math.ceil e math.floor, que nos serão úteis quando formos trabalhar com números reais. O math.ceil obtém o maior inteiro, enquanto que com o math.floor se obtém o menor inteiro.

Exemplo 2:
var1 = math.ceil(0.94)
var2 = math.floor(0.94)
Resultado:
>>1
>>0

Sobre o math.cos e math.sin, que serve para obtermos o coseno e o seno de algum ângulo.

Exemplo 3:
var1 = math.cos(360)
var2 = math.sin(360)
Resultado:
>>-0.28369109148653
>>0.95891572341431

Arrays: Os arrays são uma espécie de armazém onde podemos guardar informação, tanto letras, como números, inclusive variáveis como outros arrays. Eles são muito úteis já que ao guardarmos informação podemos utilizá-la quando quisermos e de uma forma simples.

Exemplo 1:
array1 = {'00ff00', 'ffffff', '0000ce'} -- Um array com cores
array2 = {'Olá', 'adeus'} -- Um array com palavras
array3 = {c1 = 'ec12ff', t1 = 'teste'} -- Um array com variáveis
array4 = {c2 = {'bc45ef'}, t2={'teste'}} -- Um array com outros 2 arrays dentro
Modo de Uso:
array1[1]
>>00ff00
array2[2]
>>adeus
array3.c1
>>ec12ff
array4.t2[1]
>>teste
Como podem ver no modo de uso array1[1] o valor que está entre [] é a posição do valor nesse array. É como se fosse uma caixa e na caixa número 1 do array1 temos o valor "00ff00".

Outra coisa interessante nos arrays é que podemos usá-lo juntamente com funções math, como math.random ou rand() e obter resultados aleatórios, o que o torna muito útil se o array for de cores ou números.

Exemplo 2:
array5 = {'00ff00', 'ffffff', '0000ce'} -- Um array com cores
Array6 = {20, 30, 40} -- Um array com números
Modo de Uso:
array5[math.random(1,3)] -- Colocando um limite entre 1 até ao número máximo de cores presentes no array, neste caso são 3.
>>ffffff
array6[rand(1, 3)] -- Idêntico ao caso de acima, apenas estamos a fazer uso de rand() da leinadcollection.
>>20

E com isto dou por terminado esta parte do tutorial que visava ensinar um pouco de programação, para se sentirem mais à vontade quando forem escrever funções para criar karaokes.
terechan, NintendoDark, Taikumavpr e 8 outros agradeceram
#128492
Como Fazer Karaoke em LUA - Parte 4



Vamos continuar com mais um pouco de programação, desta vez no que toca ao Aegisub. Irei explicar o significado de algumas expressões/palavras que são a essência para se criar um karaoke. Mas apenas irei explicar os mais usados, quanto aos restantes, usem o Manual do Aegisub e vejam o Automation 4 - karaskel.lua.


AEGISUB

karaskel.collect_head: Esta função lê o nosso ficheiro .ass e obtém a informação do seu cabeçalho (resolução, versão do .ass, etc.) e estilos inclusive. Devolvem-nos meta e style.

karaskel.preproc_line: Esta função proporciona-nos o tamanho e as posições de cada linha do nosso ficheiro, e para isso usa outras funções: karaskel.preproc_line_text, karaskel.preproc_line_size e karaskel.preproc_line_pos. A primeira retorna a duração e o texto da nossa linha. A segunda retorna o estilo e a altura e largura do texto. A terceira e última retorna a posição da linha.

line.kara.n: Indica a quantidade de sílabas por linha.

syl = line.kara: Esta atribuição, faz com que syl passe a ter o valor de line.kara, ou seja, passa a ter o texto de cada sílaba.

line.styleref: Estilo correspondente a linha actual. Extrai pelo karaskel.preproc_line_size. E para além de styleref existe mais expressões que funcionam sobre line., como por exemplo:

raw: Texto em bruto
name: Nome do estilo
fontname: Nome do Tipo de Letra
fontsize: Tamanho do Tipo de Letra
color1, color2, color3 e color4: Cores do Tipo de Letra
bold: Negrito
italic: Itálico
underline: Sublinhado
strikeoutc: Rasurado
scale_x e scale_y: Escala de x e y
angle: Ângulo do texto
outline: Tamanho da borda
shadow: Tamanho da sombra
align: Alinhamento segundo teclado numérico


line.text: Texto da linha.

line.text_stripped: Texto da linha sem Expressões. Na LeinadCollection usa-se syl(line).

syl.text: Texto da sílaba.

syl.text_stripped: Texto da sílaba sem Expressões. Na LeinadCollection usa-se syl(syl) ou syl().

line.layer: Nível da camada.

line.style: Estilo da linha.

line.width - line.height: Altura e Largura da linha.

syl.width - syl.height: Altura e Largura da sílaba.

line.top, line.middle e line.bottom: Corresponde à posição de Y em cima, a meio ou no fundo da linha.

line.x - line.y: Posições de X-Y da linha.

l.start_time: Variável que indica o início dos tempos.

l.end_time: Variável que indica o término dos tempos.

line.start_time: Tempo de entrada da linha.

line.end_time: Tempo de saída da linha.

line.duration: Tempo de duração da linha (line.end_time – line.start_time).

syl.start_time: Tempo de entrada da sílaba.

syl.end_time: Tempo de saída da sílaba.

syl.duration: Tempo de duração da sílaba, em milésimos de segundo (syl.end_time – syl.start_time).

syl.kdur: Tempo de duração da sílaba em centésimos de segundo. O mesmo valor que está presente na Expressão \k.

syl.i: "Index" das sílabas.

Imagem


E com isto dou por finalizado toda a programação inerente aos Karaoke em LUA. Presumo que após toda esta leitura e tentativa de compreensão, que já sabem mais ou menos fazer coisas simples usando funções, e que variáveis se usam e para o que servem. Na próxima e última parte pretendo juntar o que aprenderam até agora no nosso script Lua e aplicar assim o nosso primeiro efeito.


Como Fazer Karaoke em LUA - Última e Parte 5



Pois é, estamos no fim. E como é a última partezita do tutorial vou criar uma espécie de FAQ, desta forma, creio que dissipará maioria das possíveis dúvidas que poderiam surgir. Vou colocar algumas dúvidas que normalmente surgem, e a sua resolução.




1º Por que motivo ao aplicar o Efeito as sílabas ficam separadas?
R: É das dúvidas mais frequentes, e a sua resposta é muito simples. O motivo é por a resolução do script do .ass não ser a mesma da do vídeo. Para corrigir este problema basta no Aegisub clicar no botão para "Reavaliar Resolução", clicar em "Do vídeo" e "OK". Terminado isto, grava-se e reabre-se o .ass. E poderão re-aplicar o efeito.




Imagem








2º Como poderei passar efeitos do AfterEffects para o Aegisub?
R: Esta questão li no fórum do Aegisub e grisei-me por completo. A resposta é que não se pode, são duas coisas completamente distintas. Portanto, não insistam!








3º Como poderei fazer com que uma forma se repita X vezes e que se mova para diversos lados?
R: Se estiveste bem atento ao tutorial até aqui, deves relembrar-te das estruturas de repetição, que servem para repetirmos coisas, portanto, se queremos repetir um bloco de código de Lua onde temos uma forma, é tão simples quanto isto:
l = table.copy(line)
quant = 5 -- Quantidade de vezes que queremos que se repita
for j = 1, quant do -- Criámos o ciclo de repetição
l.text = "{"..an(5)..move(x,y,x+rand(20),y+rand(30))..color(1,line.styleref.color1)..bord(0)..t(alpha('ff')).."}"..p(2, Formas(5,8)) -- Formas(5,8) é uma estrela especial de uma função da biblioteca leinadformas.lua
l.start_time=line.start_time+syl.start_time
l.end_time=l.start_time+syl.duration+rand(200,400)
l.layer = 2
subs.append(l)
end -- Fim do ciclo



Se prestarem atenção à linha do efeito, dão-se conta que em \move coloquei rand() (o tal math.random, lembram-se?), e graças a isso os movimentos irão ser aleatórios para cada Forma. Coloquei também um rand() na variável de tempo de saída da linha, assim as formas não terminarão simultaneamente e cada uma delas terá o seu tempo. Posso acrescentar apenas que o valor de quant poderá ser aleatório, mas maior que 1 claro.








4º Como poderei fazer com que uma forma se mova desde um extremo ao outro na sílaba?
R: Esta pergunta até costuma ser frequente e a resposta está na lógica. Antes de mais, a nossa sílaba compõe-se pelas coordenadas x,y e por largura-altura. E sabendo isso, a resposta está quase dada. Algo que ajuda sempre é pegar num papel e desenhar 2 letras, fazer uma cruz no meio dessa sílaba que irá representar a coordenada (X,Y), e desenhar uma espécie de L gigante para representar a Largura-Altura. E como sabemos agora que o nosso x se encontra no centro da sílaba só nos resta saber como ir de um extremo ao outro e isso resolve-se da seguinte forma: Dividirmos a largura por 2 (largura/2) e depois em x subtrairmos: (x - largura/2).
Se compreenderem esta equação, compreendem a solução. Porque ao subtrair o (largura/2) a x, iremos obter o nosso extremo esquerdo, e se somarmos, iremos obter o extremo direito. Explicando de outra forma, ao dividirmos a largura a metade ficamos a meio da silaba e ficamos a ter o valor que vai do extremo ao centro, e claro se no centro subtrairmos esse valor, chegamos ao extremo esquerdo; E se somarmos chegamos ao extremo direito. Em baixo poderão ver uma imagem que retrata o que escrevi. E isto é só aplicar ao \move e voilá. (Nota que por vez de largura/2 poderá usar-se altura/2, dá resultados semelhantes, mas por vezes melhores.)




Imagem








5º Como poderei fazer para que uma forma tenha um Efeito de Entrada e ainda outro Efeito?
R: Mais acima neste tutorial, dei a conhecer o syl.i, que é o nosso índice de sílabas por linhas, isso significa que se a nossa linha tem 6 sílabas, irá construir um índice de 1 a 6, e se a linha seguinte tiver 10 sílabas, construirá um índice de 1 a 10 e não de 7 a 16. Agora, para que a nossa primeira e última sílaba tenham um Efeito tanto de Entrada como de Saída, basta fazer algo tão fácil como isto:
if syl.i == 1 then -- Para a primeira sílaba
...bláblá...whiskas...saquetas...
end




if syl.i == line.kara.n then -- Para a última sílaba
...bláblá...whiskas...saquetas...
end







6º Como poderei colocar uma palavra ou símbolo em vez de uma sílaba?
R: Apenas temos de trocar o sil() ou o char dependendo de como estivermos a trabalhar e criámos uma variável com o que queremos colocar:
palavra = "love"
l.text = "{"..an(5)..pos(x,y).."}"..palavra




forma = "m 5 0 b 2 0 0 2 0 5 b 0 8 2 10 5 10 b 8 10 10 8 10 5 b 10 2 8 0 5 0" -- Objecto Esfera
l.text = "{"..an(5)..pos(x,y).."}"..forma







7º Como podemos fazer um Efeito diferente para cada estilo?
R: Tens de saber à priori que para cada Efeito que se faça, temos de ter sempre os blocos de "Efeito de Entrada+Sílaba Estática+Efeito das Sílabas e/ou Efeito de Saída (Opcional)". E para fazer um efeito para cada estilo para realizar um if - elseif:
if line.style == 'Romaji' then -- Criar efeito para o estilo Romaji
bloco do efeito de entrada
bloco da sílaba estática
bloco do efeito das sílabas




elseif line.style == 'Tradução' then -- fim do anterior e começo do novo efeito para o estilo Tradução
bloco do efeito de entrada
bloco da sílaba estática
bloco do efeito das sílabas
bloco do efeito de saída
end -- fim de tudo







8º Como poderei fazer um gradiente vertical?
R: Para responder a essa questão apenas irei deixar o código de como o fazer, verão que é simples:
l = table.copy(line)
lim = syl.height-8 -- Este será o valor de repetição do ciclo. O 8 é por causa dos píxeis das bordas
topo = line.top -- Obtém-se o valor extremo da parte de cima da sílaba e a partir daí faz-se o gradiente
metade = syl.width/2+5 -- Calcula-se o valor da metade da sílaba para encaixar o \clip




for j = 1, lim do  -- Começo do ciclo
cores = RangeColor(1, j/lim, 'C37988', 'AFCFDE') -- Com isto ele vai percorrendo todas as cores entre as 2 colocadas, para construir o gradiente
clipe1 = clip(x-metade, topo+j, x+metade, topo+j+1) -- Construção do clip
--A composição do clip é "clip(esquerda da sílaba, topo da sílaba+ciclo, direita da sílaba, topo da sílaba+ciclo+1)"
--O valor "1" é porque o gradiente será de 1 píxel por cada linha.




l.text = "{"..fad(100,200)..an(5)..pos(x,y)..bord(2)..cores..clipe1..t(bord(0)).."}"..sil()
l.start_time= line.start_time+syl.start_time
l.end_time= l.start_time+syl.duration+400
l.layer=3
subs.append(l)
end







9º Qual a diferença entre \clip e \iclip e como os usar em lua?
Como maioria desconhece o \iclip, e há sempre dificuldade em usar \clip em .lua, para cortar as silabas ou seja para o que for, passo a ensinar como usar estas 2 Expressões, mas para isso irei dividir a questão em 2 partes:




1º Parte - Clip Rectangular: Este tipo de clip é o mais usado por ser simples de lidar, para além de dar para animar fazendo uso da expressão \t. Ao usar o \clip tudo o que estiver fora desse rectângulo deixa de existir, ou seja, não é mostrado. Esta expressão usa-se para fazer gradientes, como expliquei na questão 8, mas também serve para cortar letras ou píxeis, entre outros. Mas acaba por ser um pouco limitado, visto que com rectângulos também não podemos fazer muito, visto que os cortes serão sempre rectos e nunca esféricos.




Para animar um \clip a primeira coisa que temos de ter são as posições que o compõem, e seria “\clip( Esquerda, Topo, Direita, Fundo)”. Recordam-se de animar uma forma que ia de um extremo ao outro? Aqui é a mesma coisa, com a diferença de termos uma posição de topo e outra de fundo. Aqui deixo o código para se fazer uma animação com \clip como se estivéssemos a usar um \kf.
cl1 = x-(syl.width/2)
cl2 = line.top
cl3 = x+(syl.width/2)
cl4 = line.bottom




clipe = clip(cl1,cl2,cl3,cl4) -- Clip estático
clipm = clip(cl3+5,cl2,cl3,cl4) -- Clip com movimento




l.text = "{"..an(5)..pos(x,y)..color(1,line.styleref.color1)..clipe..t(clipm).."}"..sil()



Primeiro temos 4 variáveis para o \clip, a primeira é a nossa esquerda, e tal como animar uma forma, obtenho usando essa expressão. A segunda é o nosso topo, que se obtém com o topo da linha. A terceira é a nossa direita, similar a esquerda, apenas se soma, tal como no das formas. E por fim, obtemos o nosso fundo com o fundo da linha. Com isto a nossa variável clipe irá ter uma forma rectangular da nossa sílaba:




Imagem
Imagem




Para o clip em movimento (clipm) a nossa esquerda será a nossa direita mais 5 píxeis, desta forma teremos um rectângulo situado fora da nossa sílaba:




Imagem
Imagem




Mas ao colocá-lo num \t, automaticamente se anima e dá a sensação de um \kf:




Imagem
Imagem




Para fazermos o inverso, temos o \iclip, tudo o que está dentro do rectângulo é que não irá aparecer e tudo o resto fica visível:





Imagem
Imagem







2º Parte - Clip Vectorial: Este outro tipo de clipe é mais complicado, visto que trabalhamos com os mesmos valores que as formas nos .ass, ou seja, se queremos desenhar um píxel no clip seria algo como: \clip(m 0 0 l 0 1 l 1 1 l 1 0 ).




Mas há que ter cuidado, porque ao trabalhar com formas, a posição destes também tem de ser alterada no mesmo código. Se quisermos que permaneçam na nossa sílaba, temos de mudar os valores para X-Y e brincar com esses valores. Lembrem-se que as formas são compostas por dois valores que são X-Y. E uma vez que tenham compreendido a criação de formas, já poderão fazer clipes vectoriais.




Provavelmente estão confusos, passo a explicar com exemplo, se queremos fazer o mesmo exemplo do clip rectangular em que envolvemos apenas a sílaba, basta usar as mesmas fórmulas e fazer uso da nossa LeinadCollection, usando a função cpf(Coordenadas Para Formas).
cd1 = cpf("m", x-(syl.width/2), line.top)
cd2 = cpf("l", x-(syl.width/2), line.bottom)
cd3 = cpf("l", x+(syl.width/2), line.bottom)
cd4 = cpf("l", x+(syl.width/2), line.top)




fclip = clipf(cd1..cd2..cd3..cd4) -- Clip com a forma vectorial




l.text = "{"..an(5)..pos(x,y)..color(1,line.styleref.color1)..bord(0)..fclip..t(bord(1)).."}"..sil()



Como é vectorial não podemos animar usando \t, apenas via ciclos, repetindo os códigos e alterando os tempos.




Espero ter sido claro, não é nada fácil explicar certas coisas, mas espero que possam ter aprendido um pouco mais sobre como lidar com \clip, que também não é nenhum bicho de 7 cabeças, tem é de se compreender as bases fundamentais.




E FINALMENTE dou como terminado este Tutorial. Espero que tenham gostado e que tenham aprendido. E que claro possam ajudar a fansub neste cargo.  8)

É proibida a partilha deste tutorial para com terceiros sem a minha autorização.
#128494
Leinad4Mind :Mais um tutorial da minha parte, finalmente irei partilhar todos os meus conhecimentos ganhos em 8 anos de fansubbing, a minha retirada definitiva poderá estar para breve
isto foi a unica coisa que me captou a atençao xD
#128499
Ainda nem li, mas só de ver já fiquei curiosíssimo! :eheh:
Força, Leinad! Espero aprender com estes tutoriais! ;)
#128563
O L4M a citar Camões???
Vais fazer o Karaoke do grande poema???
#128568
Bom trabalho!
Quero ver se aprendo a fazer karaokes já que é a única área que me atrai no fansubbing.
Pode ser que depois me inscreva nalguma fansub. :P
#128594
Sinceramente não ligo patavina aos Karaokes dos animes...
Anyway, mais um excelente tutorial Leinad :godfather:
#128602
bem deixa ca aprender umas coisasitas para ser o próximo karalhoker da MA
#128697
Parte 3 do tutorial partilhada. Nesta parte ensino o essencial de programação LUA que vai ser essencial à criação de efeitos. :godfather:
#128812
NintendoDark :Ele deverá meter quando puder  :^^:
Acho que de nada vale estar a apressá-lo.
Naah, ele precisa de um empurrão... :well:
#128813
Quanto o mais chateares, com esse tipo de pedidos e com esse tipos de coisas, é bem pior... aguarda que ele quando tiver o material pronto adiciona.
#128817
piri_vm :Quanto o mais chateares, com esse tipo de pedidos e com esse tipos de coisas, é bem pior... aguarda que ele quando tiver o material pronto adiciona.
Pelo contrário, é bem melhor :uh:
E eu espero, é sem stress :b
#128829
Hmmm... eu até aprendia isto, mas acho que depois não lhe daria uso xDDD
Mas Leinas, obrigado por este valioso tutorial :D
#128831
Leinad4Mind :Pronto, aqui está a pedido a parte 4. Espero que gostem e aprendam algo.  :godfather:
Obrigado :^^:

https://soundcloud.com/user-171432682/a-partir-de[…]

podiam repor os links

[Convívio] Apresenta-te Aqui!

AYOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO :stuck_[…]

[Info] Jogos e Concursos

Nos que eu participava, não fazes tu