Code line e Code block      


Le Code line (linee di codice) e i Code block (blocchi di codice) nel Karaoke Templater, permettono di creare effetti avanzati incorporando piccoli frammenti di codice Lua.
Questi possono essere semplici espressioni matematiche che sommano due numeri, fino a funzioni più complesse quali, ad esempio, quelle in grado di generare varie forme in diversi colori che si ciclano tra loro.
Sia le Code line che i Code block lavorano in un ambiente di esecuzione separato e semi-chiuso, questo significa che fondamentalmente non vengono disturbati dall’ambiente primario di Lua in cui viene eseguito lo script stesso del Karaoke Templater.

N.B.
Con questo argomento ci addentriamo ancora un po' di più nel mondo del Lua vero e proprio. Troverete quindi funzioni specifiche create per l'ambiente Lua. Cercherò di spiegarle man mano che compaiono. Prendete confidenza con queste in attesa del tutorial specifico che ci porterà nel mondo del Lua. :D

Code line

Una Code line è una particolare riga di template (indicata con la parola chiave: code nel campo Effect). Essa contiene solo un codice Lua e, da sola, non produce nessuna nuova riga.
Le Code line sono sempre righe di commento.
I due utilizzi principali delle Code line sono:

  • Definire/aggiornare delle variabili che verranno usate successivamente nei template.
  • Definire delle funzioni che verranno usate successivamente nei template.

Esempio:
Se avete bisogno di un numero casuale (random), ma dovete usarlo più volte in uno stesso template, potete usare una Code line che generi il numero e depositarlo in una variabile, poi usare quella variabile nella riga di template.
Allo stesso modo, la Code line può contenere una funzione che produce un colore random.

Classi per le Code line

Come per le Template line, anche le Code line hanno varie classi, alcune delle quali sono identiche per entrambe.
La classe viene dichiarata nel campo Effect, dopo la parola "code".
Le classi possibili sono:

  • once
    Esiste solo per le Code line (mentre non lo avevamo per i template).
    Le code once vengono eseguite solo una volta dal Karaoke Templater, prima che venga applicato qualsiasi template.
    E vengono eseguite nell’ordine in cui sono state dichiarate.
    Queste sono generalmente le righe ideali per definire funzioni e tabelle di valori che serviranno in seguito.
    Questa è la classe predefinita, quindi, se non viene specificata nessuna classe, il programma la considera in automatico una code once.

    Esempio 1
    code once, piuma = "m -34 15 b -46 20 -38 13 -34 12 b -30 10 -28 9 -25 7 b -25 6 -26 6 -26 5 b -25 5 -25 4 -24 5 b -24 3 -23 3 -23 2 b -23 3 -22 3 -22 4 b -22 3 -22 1 -22 0 b -21 -1 -20 -1 -19 -2 b -19 -1 -18 -1 -18 0 b -18 -1 -18 -2 -17 -3 b -15 -4 -12 -5 -10 -7 b -10 -7 -9 -5 -9 -5 b -9 -7 -9 -8 -8 -9 b -6 -10 -4 -11 -2 -13 b 2 -15 3 -14 2 -14 b 3 -15 3 -16 3 -16 b 5 -16 9 -20 10 -21 b 11 -21 12 -20 12 -19 b 12 -20 12 -21 12 -22 b 14 -24 17 -25 20 -27 b 24 -29 25 -26 25 -24 b 25 -19 22 -15 21 -11 b 20 -11 19 -11 18 -11 b 18 -11 18 -11 19 -10 b 18 -8 16 -7 16 -5 b 14 -6 15 -5 13 -6 b 13 -5 15 -5 14 -4 b 13 -3 10 -1 9 0 b 7 -1 8 0 7 -2 b 7 -1 7 -1 7 1 b 5 3 4 3 2 4 b 1 4 0 4 -1 4 b -1 4 0 5 0 5 b -2 5 -6 7 -7 8 b -8 7 -8 7 -9 6 b -9 7 -9 7 -9 8 b -12 9 -13 11 -15 12 b -16 12 -17 11 -18 11 b -18 12 -18 12 -17 13 b -19 12 -19 13 -20 14 b -21 14 -21 14 -22 13 b -23 14 -22 14 -23 15 b -24 13 -25 13 -25 12 b -28 11 -29 13 -34 15 "
    template syl noblank notext, {move($scenter,$smiddle,!$scenter+math.random(-100,100)!,!$smiddle-math.random(200,300)!)\p1}!piuma!

    La riga Code once definisce una forma vettoriale, che in questo caso corrisponde ad una piuma. La riga di Template usa la variabile appena assegnata come se fosse una forma vettoriale quasiasi (infatti vedete che tra i tag è presente il \p1 che indica appunto l'attivazione della modalità disegno).
    Nel template si deve usare il modificatore notext per evitare di comprendere le sillabe testuali originali, che vengono, invece, sostituite dalla forma vettoriale.

    N.B. la variabile indicata nel code once DEVE essere sempre inserita nella riga racchiusa tra due punti esclamativi.

    Come sapete da esempi fatti in precedenza (Disegni al posto delle sillabe), si potrebbe mettere tranquillamente tutto il codice del disegno vettoriale direttamente nella riga di template, ma usando il code once permette di avere una riga più "pulita" in modo da non creare confusione nelle successive righe di template.



    Nella riga di template troviamo la prima funzione nuova: math.random.
    math.random è una funzione di una libreria standard del Lua, di cui parleremo più dettagliatamente in un tutorial apposito.
    Dal mio punto di vista math.random è una delle funzioni più utili e agisce generando dei numeri random.
    math.random(superiore) genera un numero intero tra 1 e superiore.
    math.random(inferiore, superiore) genera un numero intero tra inferiore e superiore.

    Nell'esempio specifico, creava una randomizzazione delle coordinate della piuma in modo che non andassero tutte nello stesso punto.

    Esempio 2
    code once, colore_piuma = {"HCCC798","H505AAE","H9FDFEA","HA48B91","H34434C","HE7E6D9"}
    template syl noblank notext, {\3c&!colore_piuma[math.random(1,6)]!&\p1}!piuma!

    La riga Code once definisce un elenco di codici colore (devono essere racchiusi all'interno di parentesi graffe).
    Poi, nella riga di template impostiamo la variabile. Siamo abituati a mettere il tag \3c per indicare il colore del bordo, seguito dal codice html del colore scelto (es. &HCCC798&).
    Nel nostro caso, al posto del codice a 7 cifre, inseriamo il richiamo alla nostra tabella: !colore_piuma[math.random(1,6)]!, sempre racchiuso tra due punti esclamativi.
    In questo caso abbiamo una tabella con 6 elementi diversi (sei colori diversi) e noi vogliamo che il colore venga scelto a caso tra questi sei.
    Abbiamo appena detto che per generare un numero random abbiamo la funzione math.random, in questo caso math.random(1,6) genera un numero a caso tra 1 e 6.
    Per scegliere un elemento della tabella dei colori, si deve scrivere il nome della tabella seguito dal numero a cui corrisponde il colore scelto, racchiuso tra parentesi quadre.
    Nel nostro caso i colori corrispondono ai seguenti numeri: {"HCCC798" = 1,"H505AAE" = 2,"H9FDFEA" =3,"HA48B91" =4,"H34434C" =5,"HE7E6D9" =6}
    Quindi scrivere: !colore_piuma[3]!, significa scrivere: H9FDFEA.
    In conclusione, !colore_piuma[math.random(1,6)]! indica uno dei 6 colori scelto in modo casuale.

    Esempio 3

    code once function setlayer(newlayer) line.layer = newlayer; return ""; end

    Con questo esempio ci addentriamo un po' di più nel mondo del Lua, infatti la riga Code once crea, con una sintassi specifica, una funzione che si chiama setlayer che cambia il campo Layer nella riga.

    Nota:
    line.layer è una variabile globale della libreria karaskel.lua, che contiene varie funzioni e variabili utili a sviluppare effetti karaoke.
    Com'è facilmente intuibile, line.layer indica il layer della linea, vedremo in altri tutorial spiegazioni più dettagliate.

  • line
    Esiste sia per le righe di template sia per le Code line, ma le Code line non possono avere un nome come invece è possibile per i template line.
    Vengono eseguite una volta per ogni riga che incontrano, sia essa una template line o pre-line, e nell’ordine in cui si trovano.

    Esempio
    code line fxgroup.funky = line.actor == "funky"

    Questa Code line viene eseguita una volta per ogni riga, e abilita/disabilita il gruppo effetto chiamato “funky”, a seconda se nel campo "Attore" di quella riga sia presente “funky”.

  • syl
    Le Code line syl vengono eseguite ogni volta che incontrano una nuova sillaba, una volta per ogni sillaba.

    Code block

    Un Code block è un blocco di codice Lua all’interno di una riga di template.
    I Code block vengono usati per inserire calcoli ed espressioni più complesse.
    I Code block devono essere singole espressioni Lua, che restituiscono un valore. Questo significa che all’interno di un Code block, non si possono assegnare delle variabili o usare comandi di controllo (come ad esempio "if").
    In un Code block, invece, è possibile usare delle variabili $, infatti i valori di tali variabili sono calcolati prima che venga eseguito il Code block, quindi l’interprete del Lua li considera valori costanti e non variabili.
    Il Code block si scrive inserendo il codice tra due punti esclamativi, in questo modo:
    {\t($start,!syl.start_time+20!,\bord0)}

    Nota:
    Anche syl.start_time è una variabile globale del karaskel.lua.
    Com'è facilmente intuibile syl.start_time indica il momento d'inizio della sillaba in millisecondi, in relazione all'inizio della linea, vedremo in altri tutorial spiegazioni più dettagliate.

    Come avrete capito, ogni volta che, negli esempi precedenti, abbiamo richiamato una variabile creata con una riga Code once all'interno di una linea di template, abbiamo creato un code block. :)

    Note:
    All'interno di un Code block possiamo usare espressioni matematiche usate nel modo classico che già si conosce; 1+1, 5-3, 3*5, 20/4.
    Le regole di precedenza degli operatori, sono le stesse dell’aritmetica (moltiplicazione e divisione vengono prima di addizione e sottrazione).
    Un Code block dovrebbe sempre restituire una stringa o un valore numerico, se restituisce un valore booleano, una tabella o altro, potrebbe causare un avvertimento di errore e la riga creata potrebbe contenere un risultato sbagliato.
    Per creare delle semplici condizioni in un Code block, si possono usare gli operatori "and" e "or" per concatenare valori e condizioni.
    Esempio:
    {\k!(syl.duration>100) and "f" or ""!$kdur}

    Se la durata della sillaba è maggiore di 100 ms, la sub-espressione è vera e il Code block restituisce una "f", altrimenti l’intera espressione è falsa, e viene restituito l’argomento che si trova indicato dopo l’espressone "or", in questo caso nulla.

    Questa espressione non fa altro che decidere se il tag usato per la sillaba sia un \k o un \kf... vi ricorda qualcosa?

    Nota:
    Anche syl.duration è una variabile globale del karaskel.lua.
    Com'è facilmente intuibile, syl.duration indica la durata della sillaba in millisecondi, vedremo in altri tutorial spiegazioni più dettagliate.

    Unendo alcuni esempi fatti con il code once, aggiungendo qualche altro effetto e inserendo un template per mostrare il karaoke otteniamo:

    This text will be replaced