[Fansubbing] Karaoke bằng SSA Pawaa xD~

delacroix01

Eroge Addict
Messages
852
Reaction score
131
Points
43
Credits
0
Guide của 50119

SSA Pawaa xD~
Author: Tenka_Muteki-7X3
Website: http://ssapawaa.20.forumer.com/
Mail: tenka_muteki_jp@yahoo.co.jp

Hiện nay thì ai làm effect bằng ASS đều dùng lua trong Aegisub là chủ yếu, tuy nhiên cái này vừa lằng nhằng vừa khó hiểu, nhất là những ai không biết tí gì về lập trình (như tớ chẳng hạn "-|), it's really a pain in the ass to learn lua from scratch. Thế mới tìm học cái này đây, script được viết bằng Python đối với những ai chưa biết lập trình thì dễ hơn lua rất nhiều :ererer: mà hiệu ứng tạo ra cũng không thua nếu không muốn nói có một số mặt dùng cái này lợi hơn :))

Các hiệu ứng tenka làm bằng cái này, xem thử vài cái như Deathnote, _Gundam_ (nhất là cái này, mới nhìn toàn tưởng làm bằng AFX ">= ), Blackcat, Fantastic Children đi thì sẽ thấy >:)
http://www.mediafire.com/?sharekey=8982e667f28dc63d404ae16f1ac82c0633bab583f1f6b896
http://www.mediafire.com/?sharekey=8982e667f28dc63dc18d45d1eb43f78499ee82aea3f1d09f


Vào vấn đề chính, trước tiên down mấy cái này về cài:
http://www.python.org/download/
http://www.pythonware.com/products/pil/
http://www.mediafire.com/?sharekey=8982e667f28dc63d12e7fe3f20cedf49a81c8a634a94f479
Down về giải nén file ssa_pawaa_xd.pyc vào thư mục cài Python.

Vào đây đọc cho biết ít nhất Python là cái gì, nhưng mà thật ra cũng không cần thiết nữa o<:
http://wiki.python.org/moin/BeginnersGuide/Overview

Cần một soft edit code Python thay cho NotePad, tớ đang xài PyScripter:
http://mmm-experts.com/Downloads.aspx?ProductId=4

Xem bài hướng dẫn ngắn ở đây, mà thật ra cũng không cần hiểu hết, miễn biết nó hoạt động ra sao là ổn:
http://en.wikibooks.org/wiki/Non-Programmer's_Tutorial_for_Python/Contents

Bây giờ tới script, ở đây tớ comment lại trên script Karaoke_Base.py down từ link trên kia để nắm sơ qua ý của nó, rồi từ script này viết hiệu ứng mới:

Code:
[COLOR="Green"]# -*- coding: cp1252 -*-

# Karaoke Base - Rev. 1
# Copyright (c) 2005-2007 Tenka_Muteki-7X3 <tenka_muteki_jp@yahoo.co.jp>. All rights reserved.
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.[/COLOR]

from random import *
from string import *
from time import *
from ssa_pawaa_xd import *

TEM_INI_PRO = time()

nah, forget that, get to the good part:
Code:
[COLOR="Green"]# [dimensions và fps][/COLOR]
COL_INI_SCR = 0    [COLOR="Green"]#    ô dọc đầu tiên của script[/COLOR]
LIN_INI_SCR = 0    [COLOR="Green"]#    ô ngang đầu tiên của script[/COLOR]
COL_FIN_SCR = 1024    [COLOR="Green"]#*** ô dọc cuối cùng script[/COLOR]
LIN_FIN_SCR = COL_FIN_SCR * 9 / 16    [COLOR="Green"]#*** ô ngang cuối cùng của script[/COLOR]
VAL_FPS_VID = 23.976    [COLOR="Green"]#    video fps[/COLOR]
VAL_DUR_FPS = 100 / VAL_FPS_VID    [COLOR="Green"]#    thời gian của 1 frame[/COLOR]
chỉ là gán giá trị cho biến thôi, chắc không cần giải thích nhỉ i-)
Code:
[COLOR="Green"]# [formats][/COLOR]
VAL_1AH_SCR = '00'      [COLOR="Green"]#*** 1st alpha[/COLOR]
VAL_2AH_SCR = '00'      [COLOR="Green"]#*** 2nd alpha[/COLOR]
VAL_3AH_SCR = '00'      [COLOR="Green"]#*** 3rd alpha[/COLOR]
VAL_4AH_SCR = '00'      [COLOR="Green"]#*** 4th alpha[/COLOR]
VAL_1CH_SCR = 'FFFFFF'      [COLOR="Green"]#*** 1st color[/COLOR]
VAL_2CH_SCR = '0000FF'      [COLOR="Green"]#*** 2nd color[/COLOR]
VAL_3CH_SCR = 'FF0000'      [COLOR="Green"]#*** 3rd color[/COLOR]
VAL_4CH_SCR = '000000'      [COLOR="Green"]#*** 4th color[/COLOR]
VAL_BOR_SCR = 2         [COLOR="Green"]#*** border[/COLOR]
VAL_SOM_SCR = 2         [COLOR="Green"]#*** shadow[/COLOR]
VAL_NEG_SCR = 0         [COLOR="Green"]#*** bold[/COLOR]
VAL_ITA_SCR = 0         [COLOR="Green"]#*** italic[/COLOR]
VAL_SCX_SCR = 100       [COLOR="Green"]#*** scale x[/COLOR]
VAL_SCY_SCR = 100       [COLOR="Green"]#*** scale y[/COLOR]
MAR_VER_SCR = 30        [COLOR="Green"]#*** vertical margin[/COLOR]
MAR_HOR_SCR = 30        [COLOR="Green"]#*** horizontal margin[/COLOR]
VAL_COR_MAS = '000000'     [COLOR="Green"]#*** màu của script mask[/COLOR]
EST_PRI_SCR = 'rom'     [COLOR="Green"]#*** tên style chính[/COLOR]
thông tin để tạo style
Code:
[COLOR="Green"]# [positions][/COLOR]
COL_FRA_KAR = 50                [COLOR="Green"]#*** ô dọc bắt đầu câu[/COLOR]
LIN_FRA_KAR = 40                [COLOR="Green"]#*** ô ngang bắt đầu câu[/COLOR]
LIN_FRA_TRA = LIN_FIN_SCR - 30  [COLOR="Green"]#*** hàng của trans[/COLOR]
ALI_SIL_KAR = 4                 [COLOR="Green"]#*** syl alignment[/COLOR]
ALI_FRA_KAR = 1                 [COLOR="Green"]#*** alignment của câu [ 1 = trái ] [ 2 = giữa ] [ 3 = phải ][/COLOR]
vị trí kara
Code:
[COLOR="Green"]# [tên][/COLOR]
TIT_SCR_KAR = 'Karaoke Base'      [COLOR="Green"]#*** script title[/COLOR]
EXT_SCR_KAR = '.ass'      [COLOR="Green"]#    script extension[/COLOR]
DIR_SCR_KAR = 'D:\\Arquivos\\Temporarios\\Trabalho\\Karaokes\\'      [COLOR="Green"]#*** script directory[/COLOR]
NOM_SCR_PRI = 'Karaoke_Base'      [COLOR="Green"]#*** tên script chính[/COLOR]
NOM_SCR_MAS = NOM_SCR_PRI + '_(Mask)'      [COLOR="Green"]#    tên script mask (dùng overlay trong avisynth)[/COLOR]
DIR_NOM_PRI = DIR_SCR_KAR + NOM_SCR_PRI + EXT_SCR_KAR      [COLOR="Green"]#    đường lưu script chính[/COLOR]
DIR_NOM_MAS = DIR_SCR_KAR + NOM_SCR_MAS + EXT_SCR_KAR      [COLOR="Green"]#    đường lưu script mask[/COLOR]
chỗ đặt script
Code:
[COLOR="Green"]# [ajustments][/COLOR]
AJU_ESP_CAR = 1     [COLOR="Green"]#*** chỉnh độ rộng của space cho callarcar[/COLOR]
AJU_LAR_CAR = -3    [COLOR="Green"]#*** chỉnh độ rộng giữa các syl cho callarcar[/COLOR]
AJU_ALT_CAR = -10   [COLOR="Green"]#*** khoảng cách cho các hàng dọc (kanji)[/COLOR]
AJU_FON_PIX = -5    [COLOR="Green"]#*** chỉnh font cho calpospix[/COLOR]
AJU_COL_PIX = -20   [COLOR="Green"]#*** chỉnh cột dọc (pos) cho calpospix[/COLOR]
AJU_LIN_PIX = -19   [COLOR="Green"]#*** chỉnh hàng (pos) cho calpospix[/COLOR]
sẽ dùng để chỉnh pos khi làm fx, bây giờ chưa cần quan tâm tới nó i-)
Code:
[COLOR="Green"]# [fonts][/COLOR]
TAM_FON_SCR = 40            [COLOR="Green"]#*** font size[/COLOR]
COD_FON_SCR = 'br'          [COLOR="Green"]#*** font code[/COLOR]
NOM_FON_SCR = "Arial"       [COLOR="Green"]#*** font name[/COLOR]
NOM_FON_WIN = 'Arial.ttf'   [COLOR="Green"]#*** tên file font[/COLOR]
ENC_FON_ESC = 1             [COLOR="Green"]#*** font encoding type[/COLOR]
DAD_FON_SCR, DAD_FON_PIX = gerconfon(ENC_FON_ESC, NOM_FON_WIN, TAM_FON_SCR, AJU_LAR_CAR, AJU_FON_PIX)
font data dùng tính pos khi làm fx
Code:
[COLOR="Green"]# [raw karaoke input][/COLOR]
LIS_KAR_SCR = [
    'Dialogue: 0,0:00:02.00,0:00:04.00,Default,,0000,0000,0000,,{\k40}SSA {\k40}Pa{\k40}wa{\k40}a {\k40}xD~',
    'Dialogue: 0,0:00:05.00,0:00:07.00,Default,,0000,0000,0000,,{\k28}by {\k28}Ten{\k28}ka_{\k28}Mu{\k28}te{\k28}ki-{\k28}7X3',
    ]

[COLOR="Green"]# [translation][/COLOR]
LIS_TRA_SCR = [
    'Trad 1',
    'Trad 2',
    ]
cái này dùng hẳn karaoke trong script luôn chứ không lấy input từ ngoài
Code:
[COLOR="Green"]# [events lists][/COLOR]
LIS_CAB_COM = []
LIS_EST_PRI = []
LIS_EST_MAS = []
LIS_EST_COM = []
LIS_EVE_FUN = []
LIS_EVE_FRE = []
LIS_EVE_FIN = []
LIS_EVE_TRA = []
LIS_EVE_MAS = []
list các event (nếu không hiểu event là gì thì lấy đại 1 cái file ass rồi xài notepad mở nó lên đi)
Code:
[COLOR="Green"]# [flags][/COLOR]
GER_FRA_HOR = True      [COLOR="Green"]#*** tạo các câu nằm ngang[/COLOR]
GER_CAB_SCR = True      [COLOR="Green"]#*** tạo phần mở đầu trong script[/COLOR]
GER_FRA_KAR = True      [COLOR="Green"]#*** tạo các câu karaoke[/COLOR]
GER_FRA_TRA = True      [COLOR="Green"]#*** tạo translation[/COLOR]
GER_EFE_FIN = False     [COLOR="Green"]#*** tạo event end effect (sẽ giải thích sau)[/COLOR]
GER_CON_SIL = False     [COLOR="Green"]#*** vẽ ô xác định chiều dài rộng của \k[/COLOR]
GER_SSA_PRI = True      [COLOR="Green"]#*** tạo script chính[/COLOR]
GER_SSA_MAS = False     [COLOR="Green"]#*** tạo script mask (overlay trong avisynth)[/COLOR]
GER_DIV_LET = True      [COLOR="Green"]#*** làm effect cho từng char trong syl[/COLOR]
GER_DIV_TEM = False     [COLOR="Green"]#*** chia thời gian effect ra cho từng char trong syl[/COLOR]
your options
Code:
[COLOR="Green"]# [lấy thông tin từ raw kara][/COLOR]
DAD_EXT_KAR = callarcar(GER_DIV_LET, GER_DIV_TEM, LIS_KAR_SCR, DAD_FON_SCR, AJU_ESP_CAR, COD_FON_SCR)
LIS_TEM_KAR = DAD_EXT_KAR[0] [COLOR="Green"]# thời gian của syl[/COLOR]
LIS_SIL_KAR = DAD_EXT_KAR[1] [COLOR="Green"]# syl[/COLOR]
LIS_LAR_KAR = DAD_EXT_KAR[2] [COLOR="Green"]# độ rộng của syl[/COLOR]
LIS_ALT_KAR = DAD_EXT_KAR[3] [COLOR="Green"]# chiều cao của syl[/COLOR]
bắt đầu vào làm kara rồi đây, cái function trên kia là để lấy thông tin từ raw kara, không cần hiểu lắm đâu i-)
Code:
[COLOR="Green"]####################################################################################################
## script                                                                                         ##
####################################################################################################
[/COLOR]
LIS_CAB_COM = LIS_CAB_COM + gercabssa(TIT_SCR_KAR, COL_FIN_SCR, LIN_FIN_SCR, GER_CAB_SCR)

ael(LIS_CAB_COM, 'Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\n', GER_CAB_SCR)
ael(LIS_EST_PRI, 'Style: ' + EST_PRI_SCR + ',' + NOM_FON_SCR + ',' + str(TAM_FON_SCR) + ',&H' + VAL_1AH_SCR + VAL_1CH_SCR + ',&H' + VAL_2AH_SCR + VAL_2CH_SCR + ',&H' + VAL_3AH_SCR + VAL_3CH_SCR + ',&H' + VAL_4AH_SCR + VAL_4CH_SCR + ',' + str(VAL_NEG_SCR) + ',' + str(VAL_ITA_SCR) + ',0,0,' + str(VAL_SCX_SCR) + ',' + str(VAL_SCY_SCR) + ',0,0,1,' + str(VAL_BOR_SCR) + ',' + str(VAL_SOM_SCR) + ',' + str(ALI_SIL_KAR) + ',' + str(MAR_VER_SCR) + ',' + str(MAR_VER_SCR) + ',' + str(MAR_HOR_SCR) + ',0\n', GER_CAB_SCR)
ael(LIS_EST_MAS, 'Style: ' + EST_PRI_SCR + ',' + NOM_FON_SCR + ',' + str(TAM_FON_SCR) + ',&H' + VAL_1AH_SCR + VAL_COR_MAS + ',&H' + VAL_2AH_SCR + VAL_COR_MAS + ',&H' + VAL_3AH_SCR + VAL_COR_MAS + ',&H' + VAL_4AH_SCR + VAL_COR_MAS + ',' + str(VAL_NEG_SCR) + ',' + str(VAL_ITA_SCR) + ',0,0,' + str(VAL_SCX_SCR) + ',' + str(VAL_SCY_SCR) + ',0,0,1,' + str(VAL_BOR_SCR) + ',' + str(VAL_SOM_SCR) + ',' + str(ALI_SIL_KAR) + ',' + str(MAR_VER_SCR) + ',' + str(MAR_VER_SCR) + ',' + str(MAR_HOR_SCR) + ',0\n', GER_CAB_SCR)
ael(LIS_EST_COM, '\n', GER_CAB_SCR)
ael(LIS_EST_COM, '[Events]\n', GER_CAB_SCR)
ael(LIS_EST_COM, 'Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text\n', GER_CAB_SCR)
ael(LIS_EST_COM, 'Comment: 0,0:00:00.00,0:00:00.00,Default,,0000,0000,0000,,\n', GER_CAB_SCR)

CON_LIN_KAR = 0 [COLOR="Green"]# đếm số dòng kara[/COLOR]
tạo phần đầu của script
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: rom,Arial,40,&H00FFFFFF,&H000000FF,&H00FF0000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,4,30,30,30,0

[Events]
Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text
Comment: 0,0:00:00.00,0:00:00.00,Default,,0000,0000,0000,,
Code:
[COLOR="Green"]####################################################################################################
## start - câu
##[/COLOR]

while CON_LIN_KAR < len(LIS_TEM_KAR) :

    print 'Frase:', CON_LIN_KAR, LIS_SIL_KAR[CON_LIN_KAR][0]
    
    DUR_IND_INT = 40    [COLOR="Green"]#*** thời gian (centi giây) của lead in từng \k[/COLOR]
    DUR_INT_INT = 1     [COLOR="Green"]#*** thời gian (centi giây) giữa từng lead in của từng \k[/COLOR]
    DUR_ANT_FRA = 0     [COLOR="Green"]#*** thời gian cộng vào trước câu (centi giây)[/COLOR]
    DUR_POS_FRA = 0     [COLOR="Green"]#*** thời gian cộng vào sau câu (centi giây)[/COLOR]
    DUR_INT_ENC = 1     [COLOR="Green"]#*** thời gian (centi giây) giữa từng lead out của từng \k[/COLOR]
    DUR_IND_ENC = 40    [COLOR="Green"]#*** thời gian (centi giây) lead out của từng \k[/COLOR]
    
    TEM_ANT_FRA = temparval(ltrim(LIS_TEM_KAR[CON_LIN_KAR][0], 10)) - DUR_ANT_FRA                                   [COLOR="Green"]# thời gian trước câu[/COLOR]
    TEM_INI_FRA = temparval(ltrim(LIS_TEM_KAR[CON_LIN_KAR][0], 10))                                                 [COLOR="Green"]# thời gian bắt đầu câu[/COLOR]
    TEM_FIN_FRA = temparval(rtrim(LIS_TEM_KAR[CON_LIN_KAR][len(LIS_TEM_KAR[CON_LIN_KAR]) - 1], 10))                 [COLOR="Green"]# thời gian kết thúc câu[/COLOR]
    TEM_POS_FRA = temparval(rtrim(LIS_TEM_KAR[CON_LIN_KAR][len(LIS_TEM_KAR[CON_LIN_KAR]) - 1], 10)) + DUR_POS_FRA   [COLOR="Green"]# thời gian sau câu[/COLOR]

    LIS_FRA_ESQ = []    [COLOR="Green"]#*** list số câu left alignment[/COLOR]
    LIS_FRA_DIR = []    [COLOR="Green"]#*** list số câu right alignment[/COLOR]
                  
    ALI_FRA_TEL = geralikar(CON_LIN_KAR, LIS_FRA_ESQ, LIS_FRA_DIR, ALI_FRA_KAR) [COLOR="Green"]# alignment value của từng câu[/COLOR]
    LAR_FRA_ATU = sum(LIS_LAR_KAR[CON_LIN_KAR])                                 [COLOR="Green"]# độ rộng của câu[/COLOR]
    COL_INI_CAR = calposfra(COL_FIN_SCR, MAR_VER_SCR, LAR_FRA_ATU, ALI_FRA_TEL) [COLOR="Green"]# ô dọc bắt đầu syl đầu tiên của câu[/COLOR]
    COL_ACU_CAR = 0                                                             [COLOR="Green"]# tổng độ rộng các syl[/COLOR]
    LIN_INI_CAR = LIN_FRA_KAR                                                   [COLOR="Green"]# giá trị dòng đầu của kara (kanji)[/COLOR]
    LIN_ACU_CAR = 0                                                             [COLOR="Green"]# giá trị dòng của các syl trước (kanji)[/COLOR]
    QUA_KAR_FRA = len(LIS_TEM_KAR[CON_LIN_KAR])                                 [COLOR="Green"]# số lượng \k trong câu[/COLOR]
    CON_COL_KAR = 0                                                             [COLOR="Green"]# đếm số syl của câu[/COLOR]
    TEM_INT_ACU = QUA_KAR_FRA * DUR_INT_INT + DUR_INT_INT                       [COLOR="Green"]# tổng thời gian lead in[/COLOR]
    TEM_ENC_ACU = DUR_INT_ENC                                                   [COLOR="Green"]# tổng thời gian lead out[/COLOR]

    if GER_FRA_HOR == False :     [COLOR="Green"]# nếu tạo câu nằm dọc (kanji)[/COLOR]
        
        LAR_FRA_ATU = conkarval(LIS_LAR_KAR[CON_LIN_KAR]) * LIS_ALT_KAR                             [COLOR="Green"]# độ rộng của câu[/COLOR]
        LIN_INI_CAR = LIN_FRA_KAR + calposfra(LIN_FIN_SCR, MAR_HOR_SCR, LAR_FRA_ATU, ALI_FRA_TEL)   [COLOR="Green"]# hàng của syl đầu trong câu[/COLOR]
bắt đầu vào kara từ đây :ererer: phần này lấy thông tin từ raw để tính thời gian, vị trí,... của các syl của từng câu. Mấy cái biến trên kia mới đọc vào chưa hiểu hết nổi đâu :-?? cứ đợi tới lúc viết script dùng tới rồi sẽ biết nó là cái gì >:)
Code:
    [COLOR="Green"]####################################################################################################
    ## start - syl
    ##[/COLOR]

    while CON_COL_KAR < len(LIS_TEM_KAR[CON_LIN_KAR]) :

        TEM_SIL_ATU = LIS_TEM_KAR[CON_LIN_KAR][CON_COL_KAR] [COLOR="Green"]# thời gian hiện tại[/COLOR]
        SIL_FRA_ATU = LIS_SIL_KAR[CON_LIN_KAR][CON_COL_KAR] [COLOR="Green"]# đếm syl/char hiện tại[/COLOR]
        LAR_SIL_ATU = LIS_LAR_KAR[CON_LIN_KAR][CON_COL_KAR] [COLOR="Green"]# độ rộng syl/char hiện tại[/COLOR]
        ALT_SIL_ATU = LIS_ALT_KAR                           [COLOR="Green"]# chiều cao syl/char hiện tại[/COLOR]

        TEM_INT_FRA = TEM_ANT_FRA - TEM_INT_ACU             [COLOR="Green"]# thời gian lead in của câu[/COLOR]
        TEM_ENC_FRA = TEM_POS_FRA + TEM_ENC_ACU             [COLOR="Green"]# thời gian lead out của câu[/COLOR]
        TEM_IND_INT = TEM_INT_FRA - DUR_IND_INT             [COLOR="Green"]# thời gian lead in của từng \k[/COLOR]
        TEM_IND_ENC = TEM_ENC_FRA + DUR_IND_ENC             [COLOR="Green"]# thời gian lead out của từng \k[/COLOR]
        TEM_INI_KAR = temparval(ltrim(TEM_SIL_ATU, 10))     [COLOR="Green"]# thời gian bắt đầu của \k[/COLOR]
        TEM_FIN_KAR = temparval(rtrim(TEM_SIL_ATU, 10))     [COLOR="Green"]# thời gian kết thúc \k[/COLOR]
        
        QUA_CEN_ATU = TEM_FIN_KAR - TEM_INI_KAR             [COLOR="Green"]# thời gian của câu (centi giây)[/COLOR]
        QUA_FRA_ATU = confrasil(QUA_CEN_ATU, VAL_DUR_FPS)   [COLOR="Green"]# số lượng frame[/COLOR]
        TEM_ENC_FRA = TEM_POS_FRA + TEM_ENC_ACU             [COLOR="Green"]# thời gian lead out[/COLOR]

        VAL_AJU_COL = gerajucol(ALI_SIL_KAR, LAR_SIL_ATU)   [COLOR="Green"]# ajustment value của từng syl/char[/COLOR]

        if SIL_FRA_ATU != '' :

            DAD_ALI_POS = gerdadali(SIL_FRA_ATU, GER_FRA_HOR, COL_INI_CAR, COL_ACU_CAR, VAL_AJU_COL, LIN_FRA_KAR, LAR_SIL_ATU, LIN_ACU_CAR, COL_FRA_KAR, LIN_INI_CAR, ALT_SIL_ATU, AJU_ALT_CAR) [COLOR="Green"]# generate giá trị position và alignment[/COLOR]
            COL_SIL_ATU = DAD_ALI_POS[0]    [COLOR="Green"]# giá trị ô dọc của \k[/COLOR]
            LIN_SIL_ATU = DAD_ALI_POS[1]    [COLOR="Green"]# giá trị ô ngang của \k[/COLOR]
            COL_ACU_CAR = DAD_ALI_POS[2]    [COLOR="Green"]# tổng giá trị ô dọc của các kí tự \k hiện tại[/COLOR]
            LIN_ACU_CAR = DAD_ALI_POS[3]    [COLOR="Green"]# tổng giá trị ô ngang của các kí tự \k hiện tại[/COLOR]

[COLOR="Green"]        # với các syl không phải khoảng trống:[/COLOR]
        if SIL_FRA_ATU != ' ' and SIL_FRA_ATU != '' :

            COM_BAS_SIL = an(ALI_SIL_KAR)
            ESC_FIN_EVE = 100
            COM_BAS_FIN = alpha(255) + fscxy(ESC_FIN_EVE)
            COM_FIN_EVE, CON_FIN_EVE = dadfineve(GER_EFE_FIN, COM_BAS_FIN, 'A')

            COM_POS_KAR = pos(COL_SIL_ATU, LIN_SIL_ATU)
                
[COLOR="Green"]            # vẽ ô xác định chiều rộng, cao của syl[/COLOR]
            ael(LIS_EVE_FRE, mes(sta = TEM_INI_FRA, end = TEM_FIN_FRA, tex = '{' + pos(0, LIN_SIL_ATU) + bord(1) + a1(255) + a3(64) + c3('0000FF') + an(ALI_SIL_KAR) + p(1) + '}m ' + str(COL_SIL_ATU) + ' ' + str(0) + ' l ' + str(COL_SIL_ATU + LAR_SIL_ATU) + ' ' + str(0) + ' ' + str(COL_SIL_ATU + LAR_SIL_ATU) + ' ' + str(DAD_EXT_KAR[3]) + ' ' + str(COL_SIL_ATU) + ' ' + str(DAD_EXT_KAR[3]) + '{' + p(0) + COM_FIN_EVE + '}' + CON_FIN_EVE), GER_CON_SIL)
tính vị trí, toàn bộ thời gian,... cho từng syl/char 1, bắt đầu thực hiện hiệu ứng từ khúc này trở xuống, các biến trên kia sẽ được dùng cho fx
Code:
[COLOR="Green"]            # events generation flags, là các flag tạo các event ở khúc dưới:[/COLOR]
            GER_INI_BLO = defgereve(DUR_IND_INT)
            GER_INT_BLO = defgereve(DUR_INT_INT)
            GER_PRI_BLO = defgereve(DUR_ANT_FRA)
            GER_SEG_BLO = True
            GER_TER_BLO = True
            GER_QUA_BLO = True
            GER_QUI_BLO = defgereve(DUR_POS_FRA)
            GER_ENC_BLO = defgereve(DUR_INT_ENC)
            GER_FIN_BLO = defgereve(DUR_IND_ENC)

            [COLOR="Green"]####################################################################################################
            ## start - karaoke effect
            ##[/COLOR]

            if GER_FRA_KAR == True :

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # lead in từng syl/char (lead in start -> lead in end)[/COLOR]

                COM_INI_BLO = fscxy(200) + alpha(255) + fr(360) + frx(360) + t(fscxy(100) + alpha(0) + fr(0) + frx(0))

                ael(LIS_EVE_FRE, mes(sta = TEM_IND_INT, end = TEM_INT_FRA, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_INI_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_INI_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # lead in của câu (lead in end -> đầu câu)[/COLOR]

                COM_INT_BLO = ''

                ael(LIS_EVE_FRE, mes(sta = TEM_INT_FRA, end = TEM_ANT_FRA, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_INT_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_INT_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # khoảng trước câu[/COLOR]

                COM_PRI_BLO = ''

                ael(LIS_EVE_FRE, mes(sta = TEM_ANT_FRA, end = TEM_INI_FRA, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_PRI_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_PRI_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # trước kara (đầu câu -> đầu syl)[/COLOR]

                COM_SEG_BLO = ''

                ael(LIS_EVE_FRE, mes(sta = TEM_INI_FRA, end = TEM_INI_KAR, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_SEG_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_SEG_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # kara (đầu syl - cuối syl)[/COLOR]

                COM_TER_BLO = bord(5) + t(bord(VAL_BOR_SCR))

                ael(LIS_EVE_FRE, mes(sta = TEM_INI_KAR, end = TEM_FIN_KAR, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_TER_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_TER_BLO)

[COLOR="Red"]##                lis_pix_car = calpospix(SIL_FRA_ATU, DAD_FON_PIX, COD_FON_SCR)
##
##                con_ite_lis = 0
##
##                while con_ite_lis < len(lis_pix_car) :
##
##                    val_col_pix = lis_pix_car[con_ite_lis][0]
##                    val_lin_pix = lis_pix_car[con_ite_lis][1]
##                    val_alp_pix = lis_pix_car[con_ite_lis][2]
##
##                    pos_col_pix = COL_SIL_ATU + val_col_pix + AJU_COL_PIX
##                    pos_lin_pix = LIN_SIL_ATU + val_lin_pix + AJU_LIN_PIX
##
##                    com_pos_pix = pos(pos_col_pix, pos_lin_pix)
##                    com_bas_pix = an(5) + bord(0) + shad(0) + fscxy(150) + alpha(val_alp_pix)
##                    com_adi_pix = ''
##                    com_dia_pix = p(1)
##                    com_pic_pix = ppix()
##                    com_tra_pix = p(0)
##                    
##                    ael(LIS_EVE_FRE, mes(sta = TEM_INI_KAR, end = TEM_FIN_KAR, tex = mte(com_pos_pix + com_bas_pix + com_adi_pix + com_dia_pix, com_pic_pix, com_tra_pix + COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_TER_BLO)
##
##                    con_ite_lis = con_ite_lis + 1[/COLOR]

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # sau kara (cuối syl -> cuối câu)[/COLOR]

                COM_QUA_BLO = ''

                ael(LIS_EVE_FRE, mes(sta = TEM_FIN_KAR, end = TEM_FIN_FRA, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_QUA_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_QUA_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # khoảng sau câu[/COLOR]

                COM_QUI_BLO = ''

                ael(LIS_EVE_FRE, mes(sta = TEM_FIN_FRA, end = TEM_POS_FRA, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_QUI_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_QUI_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # lead out của câu[/COLOR]

                COM_ENC_BLO = ''

                ael(LIS_EVE_FRE, mes(sta = TEM_POS_FRA, end = TEM_ENC_FRA, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_ENC_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_ENC_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#
                # lead out của từng syl/char[/COLOR]

                COM_FIN_BLO = t(fscxy(200) + alpha(255) + fr(360) + frx(360))

                ael(LIS_EVE_FRE, mes(sta = TEM_ENC_FRA, end = TEM_IND_ENC, tex = mte(COM_POS_KAR + COM_BAS_SIL + COM_FIN_BLO, SIL_FRA_ATU, COM_FIN_EVE, CON_FIN_EVE, GER_EFE_FIN)), GER_FIN_BLO)

                [COLOR="Green"]#--------------------------------------------------------------------------------------------------#

            ##
            ## end - karaoke effect
            ####################################################################################################[/COLOR]
            TEM_INT_ACU = TEM_INT_ACU - DUR_INT_INT
            TEM_ENC_ACU = TEM_ENC_ACU + DUR_INT_ENC

        CON_COL_KAR = CON_COL_KAR + 1

[COLOR="Green"]    ##
    ## end - syl
    ####################################################################################################[/COLOR]
trong script này kara được chia làm nhiều phần nhỏ rồi làm effect cho từng phần, ở chỗ này có thể thêm tags, phần mới,v.v... :ererer:
phần màu đỏ là cách dùng calpospix để làm effect pixel dot (xem hiệu ứng của ergo proxy trên kia đi thì thấy o<)
Code:
[COLOR="Green"]####################################################################################################
    ## start - translation
    ##[/COLOR]

    COL_FRA_TRA, VAL_ALI_TRA = geralitra(CON_LIN_KAR, LIS_FRA_ESQ, LIS_FRA_DIR, MAR_VER_SCR, COL_FIN_SCR)
    
    POS_FRA_TRA = pos(COL_FRA_TRA, LIN_FRA_TRA)
    COM_BAS_TRA = fad(150, 150) + bord(0) + fscxy(90) + an(VAL_ALI_TRA)
    COM_FRA_TRA = c1(VAL_1CH_SCR)

    ael(LIS_EVE_TRA, mes(sta = TEM_INI_FRA, end = TEM_FIN_FRA, tex = '{' + POS_FRA_TRA + COM_BAS_TRA + COM_FRA_TRA + '}' + LIS_TRA_SCR[CON_LIN_KAR] + '\n'), GER_FRA_TRA)

[COLOR="Green"]    ##
    ## end - translation
    ####################################################################################################[/COLOR]

    CON_LIN_KAR = CON_LIN_KAR + 1

[COLOR="Green"]##
## end - câu
####################################################################################################[/COLOR]

gerscrssa(TEM_INI_PRO, GER_SSA_PRI, GER_SSA_MAS, DIR_NOM_PRI, DIR_NOM_MAS, LIS_CAB_COM, LIS_EST_PRI, LIS_EST_MAS, LIS_EST_COM, LIS_EVE_FUN, LIS_EVE_FRE, LIS_EVE_FIN, LIS_EVE_TRA)
translation và tạo output file
nhìn chung thì script khá dài nhưng lúc tạo hiệu ứng mới thì chỉ cần sửa một số chỗ trong đó thôi i-)
cái này nhìn thì khó hiểu nhưng cứ bắt tay vào làm thử thì thấy dễ liền thôi :tra:
Trans lại mô tả 1 số function trong ssa_pawaa_xd.pyc, đọc cái này cái script ở trên dễ hiểu hơn nhiều >:):

#--------------------------------------------------------------------------------------------------#

ael (list, event, flag of generation)
Thêm event vào list

Ex.:

>>> lista = []
>>> ael(lista, mes(sta = 0, end = 100, tex = 'dòng 1'))
>>> ael(lista, mes(sta = 0, end = 100, tex = 'dòng 2'), True)
>>> ael(lista, mes(sta = 0, end = 100, tex = 'dòng 3'), False)
>>> lista
[('Dialogue: 0,0:00:00.00,0:00:01.00,rom,,0000,0000,0000,,dòng 1', True), ('Dialogue: 0,0:00:00.00,0:00:01.00,rom,,0000,0000,0000,,dòng 2', True), ('Dialogue: 0,0:00:00.00,0:00:01.00,rom,,0000,0000,0000,,dòng 3', False)]

#--------------------------------------------------------------------------------------------------#

calbezcur (x start, y start, x final, y final, số điểm giữa, limit x start, limit y start, limit x final, limit y final)
Tính toán tọa độ của các điểm trên đường cong Bezier trả về dạng list.
x start, y start = tọa độ điểm bắt đầu
x final, y final = tọa độ điểm kết thúc
số điểm giữa = số điểm nằm giữa start và end
limit = giới hạn vùng vẽ các điểm nằm giữa

#--------------------------------------------------------------------------------------------------#

calcoocir (bán kính, góc)
Tính tọa độ của điểm trên đường tròn.
Lưu ý cách tính góc ở def này không giống cách tính góc trong ass.

Ex.:
>>> calcoocir(30, 90)
[0, 30]
>>> calcoocir(30, 180)
[-30, 0]
>>> calcoocir(30, 270)
[0, -30]
>>> calcoocir(30, 360)
[30, 0]

#--------------------------------------------------------------------------------------------------#

calpospix (kí tự, font data, font code)
Tính các điểm nằm trên chữ qua ảnh, trả về giá trị tọa độ và alpha dưới dạng list.

#--------------------------------------------------------------------------------------------------#

dv (1st value, 2nd value)
Trả về '1st value, 2nd value,'

Ex.:

>>> dv(0, 100)
'0,100,'
>>> t(dv(0, 200) + bord(5))
'\\t(0,200,\\bord5)'

#--------------------------------------------------------------------------------------------------#

fscxy (scale x, scale y)
Trả về tage cho \fscx và \fscy, nếu chi cho 1 giá trị thì dùng cho cả 2.

Ex.:

>>> fscxy(100)
'\\fscx100\\fscy100'
>>> fscxy(100, 200)
'\\fscx100\\fscy200'

#--------------------------------------------------------------------------------------------------#

gercorale ()
Trả về giá trị màu bất kì.

Ex.:

>>> gercorale()
'3042F8'
>>> gercorale()
'20C83F'

#--------------------------------------------------------------------------------------------------#

gernegpos ()
Trả về 1 hoặc -1.

Ex.:

>>> gernegpos()
-1
>>> gernegpos()
1

#--------------------------------------------------------------------------------------------------#

liscordeg (số lần cắt, màu 1, màu 2)
Chuyển màu 1 -> màu 2, giá trị trả về list BBGGRR.
Def có vấn đề, dùng def khác ở dưới.

Ex.:

>>> liscordeg(2, 'FF0000', '0000FF')
['FF0000', '0000FF']
>>> liscordeg(5, 'FF0000', '0000FF')
['FF0000', '00003F', '3F007F', '7F00BF', '0000FF']

#--------------------------------------------------------------------------------------------------#

mes (typ = 'Dialogue', lay = 0, sta = 0, end = 0, sty = 'rom', act = '', lef = 0, rig = 0, ver = 0, efe = '', tex = '')
Trả về câu với cấu trúc SSA.

Ex.:

>>> mes()
'Dialogue: 0,0:00:00.00,0:00:00.00,rom,,0000,0000,0000,,'
>>> mes(typ = 'Comment', sty = 'kanji', lay = 10)
'Comment: 10,0:00:00.00,0:00:00.00,kanji,,0000,0000,0000,,'
>>> mes(sta = 0, end = 100, tex = 'teste')
'Dialogue: 0,0:00:00.00,0:00:01.00,rom,,0000,0000,0000,,teste'

#--------------------------------------------------------------------------------------------------#

movcoopix (x start, y start, x end, y end, time start, time end)
Trả về giá trị tọa độ của đường di chuyển dưới dạng list.

Ex.:

>>> movcoopix(0, 0, 10, 10, 0, 100)
[[1, 1, 10], [2, 2, 20], [3, 3, 30], [4, 4, 40], [5, 5, 50], [6, 6, 60], [7, 7, 70], [8, 8, 80], [9, 9, 90], [10, 10, 100]]
>>> movcoopix(0, 0, 10, 10, 0, 50)
[[1, 1, 5], [2, 2, 10], [3, 3, 15], [4, 4, 20], [5, 5, 25], [6, 6, 30], [7, 7, 35], [8, 8, 40], [9, 9, 45], [10, 10, 50]]

#--------------------------------------------------------------------------------------------------#

mte (tags, text, end tags, end text, generation flag)
Trả về text dưới dạng {tags}text{tags end}text end.

Ex.:

>>> mte(an(6), 'a', fscxy(0) + t(fscx(500)), ' ')
'{\\an6}a{\\fscx0\\fscy0\\t(\\fscx500)} '
>>> mte(bord(3), 'a')
'{\\bord3}a'

#--------------------------------------------------------------------------------------------------#

pbri ()
Trả về lệnh \p vẽ cái hình ở dưới.

Ex.:

>>> pbri()
'm 0 0 l 50 49 100 0 51 50 100 100 50 51 0 100 49 50 0 0 m 45 45 s 55 45 55 55 45 55 c'

#--------------------------------------------------------------------------------------------------#

pcha ()
Trả về lệnh \p vẽ lửa.

Ex.:

>>> pcha()
'm 0 9 b 3 3 6 3 9 6 b 12 9 15 2 19 4 b 24 5 23 11 18 13 b 15 13 13 13 10 10 b 6 6 2 6 0 10'

#--------------------------------------------------------------------------------------------------#

pcir ()
Trả về lệnh \p vẽ vòng tròn.

Ex.:

>>> pcir()
'm 50 0 b 100 0 100 100 50 100 b 0 100 0 0 50 0'

#--------------------------------------------------------------------------------------------------#

pest (number)
Trả về lệnh \p vẽ sao.

Ex.:

>>> pest()
'm 10 49 l 52 19 0 19 42 49 26 0'
>>> pest(0)
'm 10 49 l 52 19 0 19 42 49 26 0'
>>> pest(1)
'm 50 0 l 60 30 70 40 100 50 70 60 60 70 50 100 40 70 30 60 0 50 30 40 40 30'

#--------------------------------------------------------------------------------------------------#

pfum ()
Trả về lệnh \p ngẫu nhiên vẽ khói.

Ex.:

>>> pfum()
'm 79 45 b 10 23 38 176 46 67 b 99 11 29 84 51 174'
>>> pfum()
'm 38 109 b 158 112 120 101 43 140 b 189 162 36 124 174 196'
>>> pfum()
'm 46 118 b 18 143 57 88 167 58 b 60 46 200 53 165 98'

#--------------------------------------------------------------------------------------------------#

pgot ()
Trả về lệnh \p vẽ giọt nước.

Ex.:

>>> pgot()
'm 0 -5 b -8 7 8 7 0 -5'

#--------------------------------------------------------------------------------------------------#

ppix ()
Trả về \p pixel dot.

Ex.:

>>> ppix()
'm 0 0 l 1 0 1 1 0 1'

#--------------------------------------------------------------------------------------------------#


Các function với tag trong ssa:

Ex.:

>>> bord(5)
'\\bord5'

>>> b(1)
'\\b1'

>>> fn('Arial')
'\\fnArial'

>>> fr(360)
'\\fr360'

>>> clip(0, 0, 100, 100)
'\\clip(0,0,100,100)'

>>> t(shad(0) + bord(0))
'\\t(\\shad0\\bord0)'
....

Không có lệnh clip shape nên cái đó phải làm bằng tay, vd: '\\clip(m 0 0 l 100 0 0 100)'

Với màu và alpha phải viết ngược lại do trong Python function không bắt đầu bằng số: 1c, 2c, 3c, 4c, 1a, 2a, 3a, 4a -> c1, c2, c3, c4, a1, a2, a3, a4

Theo như tenka thì các tag với màu và alpha trả về tag và số nhận dạng để tạo script mask, cái này chưa rõ lắm, có hỏi nhưng hắn chưa trả lời.

Code:

Ex.:

>>> a1(255)
'[alp_sta]0[alp_end]'

>>> a4(0)
'[alp_sta]1[alp_end]'

>>> c2('FFFFFF')
'[cor_sta]0[cor_end]'

>>> alpha(254)
'[alp_sta]2[alp_end]'

>>> fad(100, 100)
'[fad_sta]0[fad_end]'

Karaoke_Base.py vẫn còn nhiều function khác trong đó nhưng không nói ở đây do mấy cái đó chỉ được dùng cho cấu trúc file ssa và cũng không cần đụng vào khi làm kara, thành ra cũng không cần quan tâm tới nó lắm.

def thay cho function bị lỗi ở trên, bới smallkirby:
Code:
def cut_color(no, str_color, end_color):
    from string import upper
    scr=int(str_color[0:2],16)
    scg=int(str_color[2:4],16)
    scb=int(str_color[4:6],16)
    enr=int(end_color[0:2],16)
    eng=int(end_color[2:4],16)
    enb=int(end_color[4:6],16)
    return_color=[]
    no_t=0
    while no_t<no :
        r_return=upper(hex(scr+no_t*(enr-scr)/(no-1))[2:5])
        g_return=upper(hex(scg+no_t*(eng-scg)/(no-1))[2:5])
        b_return=upper(hex(scb+no_t*(enb-scb)/(no-1))[2:5])
        if len(r_return)==1:
            r_return='0'+r_return
        if len(g_return)==1:
            g_return='0'+g_return
        if len(b_return)==1:
            b_return='0'+b_return
        return_color.append(r_return+g_return+b_return)
        no_t=no_t+1
    return return_color
lũ THORA làm air hồi nào mình không biết nhỉ, đi check thử o<
à mà tụi này cũng đâu thấy có cái kara nào đẹp :-/
they only have nice encodes, but that's enough o<

Link Here

nếu nói về tận dụng hết sức mạnh thì ass không đơn giản là tới đó đâu, xem mấy cái như deathnote hay gundam của thằng tenka đi rồi sẽ thấy >:)
còn AFX thì mấy cái trên kia chưa coi, nhưng gặp phải mấy thằng xài effect bạt mạng như link trên kia với ở đây thì thôi thua :-?? chúa cũng không bắt chước trong ass nổi "-| hai cái naruto op ấy :ererer:

example scripts

vài cái MISC tiếp trong bài:

-về event end: cài này dùng để tạo các chuyển động phức tạp cho particle trong ass, ví dụ vẽ một dấu chấm kế chữ a, tớ cho nguyên cụm đó vừa di chuyển vừa xoay 5 vòng, sau đó cho chữ a alpha 255, ta sẽ có cái chấm hồi nãy chuyển động theo một vòng xoay tròn mà không thể làm bằng lệnh move được, có thể dùng thêm scale, org, whatever,...
tham khảo deathnote op, shippuuden op: vận dụng cái này rất tốt

-có thể dùng vector clip + movcoopix để làm chữ vỡ mảnh ra
tham khảo saint seiya

-có thể tận dũng overlay trong avisynth để tạo màu gradient hay các color change phức tạp một cách rất đơn giản bằng script mask :))
tham khảo ergo proxy OP
ngoài ra có thể dùng overlay để dùng hình lên như trong AFX
tham khảo Inu OP 4, Fantastic Children ED
do Python đơn giản hơn nhiều ngôn ngữ khác nên việc viết vài function mới để tạo script avisynth cũng không khó đâu :ererer:

-1 cái sơ đồ minh họa cho 1 số biến trong khi làm effect
có cái này dễ hiểu hơn
 
Top