Asscalc Commands: Unterschied zwischen den Versionen

Aus WiFX - The Karaoke Wiki for ASSCalc, NyuFX, Lua, AFX, Tenfex & Templater
Wechseln zu: Navigation, Suche
Zeile 9: Zeile 9:
 
variablenname
 
variablenname
 
'''
 
'''
 +
 +
      |      ''lines'' ''' STRING '\n' '''                                  { fprintf( foutt, "%s", $2.name) }
 +
 +
Fügt einen String in die out.ass ein. Wie in anderen Programmiersprachen muss ein String in "" stehen. Strings und Variablenausgaben können <u>NICHT</u> in einer Codezeile kombiniert werden. Alles was als String angegeben wurde, kann in die out.ass geschrieben werden, auch Sonderzeichen. Eine neue Line wird in der out.ass Erzeugt indem man " + ENTER + " benutzt (siehe Beispiel unten).
 +
 +
'''<u>Beispiel:</u>
 +
 +
"{\t(0,200,\1c&HFFFFFF&)}"
 +
 +
"{\t(0,"
 +
tstart-wtstart
 +
")}"
 +
 +
"
 +
Dialog: "
 +
'''
 +
 
       |      ''lines'' ''' INSERT IDENTIFIER '\n' '''                        { print_identifier( $3.name ); }
 
       |      ''lines'' ''' INSERT IDENTIFIER '\n' '''                        { print_identifier( $3.name ); }
  
Zeile 99: Zeile 116:
  
 
Die umkehrfunktion von TEXTFIND. Wenn ein Text '''NICHT''' gefunden wird in der ganze Line, wird der Code nach Textfind weiterhin ausgeführt. Typisches Anwendungsbeispiel wäre die Kombination mit Textfind und 2 Dateien als Loop. Eine Datei benötigt den Text um ausgeführt zu werden, die zweite wird nur ausgeführt, wenn der Text NICHT ausgeführt wird.
 
Die umkehrfunktion von TEXTFIND. Wenn ein Text '''NICHT''' gefunden wird in der ganze Line, wird der Code nach Textfind weiterhin ausgeführt. Typisches Anwendungsbeispiel wäre die Kombination mit Textfind und 2 Dateien als Loop. Eine Datei benötigt den Text um ausgeführt zu werden, die zweite wird nur ausgeführt, wenn der Text NICHT ausgeführt wird.
 +
 +
'''<u>Beispiel:</u>
  
 
!textfind Q
 
!textfind Q
 
loopfile "standard effect.txt" 1
 
loopfile "standard effect.txt" 1
 
'''
 
'''
 
      |      ''lines'' ''' STRING '\n' '''                                  { fprintf( foutt, "%s", $2.name) }
 
  
 
       |      ''lines'' ''' PRINTS STRING '\n' '''                            { printf( "%s", $3.name ); }
 
       |      ''lines'' ''' PRINTS STRING '\n' '''                            { printf( "%s", $3.name ); }
 +
 +
Fügt einen '''String''' in das Consolenfenster ein. Dient zur Fehlersuche und überwachung. Verlangsamt durch deutlich mehr Textausgabe in der Console den Berechnungsprozess. Funktioniert nur in Version 1. In der UTF8 Version wird nur leerer Text ausgegeben. Absätze wie im Punkt Strings weiter oben können hier genau so genutzt werden, ansonsten werden sie als Fließtext eingefügt.
 +
 +
'''<u>Beispiel:</u>
 +
 +
PRINTS "
 +
Nein das ist kein fucking Hallo World Ausgabetext
 +
"
 +
'''
 
       |      ''lines'' ''' PRINTV expr '\n' '''                              { printf( "%f", $3.value ); }
 
       |      ''lines'' ''' PRINTV expr '\n' '''                              { printf( "%f", $3.value ); }
  
 +
Fügt eine '''Variable''' in das Consolenfenster ein. Dient zur Fehlersuche und überwachung. Verlangsamt durch deutlich mehr Textausgabe in der Console den Berechnungsprozess. Funktioniert nur in Version 1. In der UTF8 Version wird nur leerer Text ausgegeben. Werden als Fließtext eingefügt. Für eine bessere Übersicht und Absätze muss man die Funktion mit PRINTS kombinieren.
 +
'''<u>Beispiel:</u>
 +
 +
PRINTV Variablenname
 +
'''
 
       |      ''lines'' ''' COLORING_OFF '(' expr ',' expr ')' '\n' '''      { ColoringOff( $4.value, $6.value );  }
 
       |      ''lines'' ''' COLORING_OFF '(' expr ',' expr ')' '\n' '''      { ColoringOff( $4.value, $6.value );  }
 +
 +
Fügt Colorchanges in die jeweilige Stelle ein. Diese Funktion ist sehr komplex und schwierig zu vermitteln. Deswegen etwas ausführlicher.
 +
Man beginnt damit, im Originalscript Farbwechsel zum Bild zu timen / einzufügen. Dabei sind folgende Regeln zu beachten:
 +
 +
* Jede Farbe (1/2/3/4) muss einzelnd getimed werden {\t(100,200,\1c&HFF00FF)}{\t(100,200,\3c&HFF00FF)}
 +
* Harte Farbwechsel wie bei Szenenwechseln üblich sollten immer mit der Zeit der Startframes anfangen und mit der des Endframes aufhören, da es sonst zu verschiebungen um 1 Frame kommen kann, wenn man nur 1 bis 2 ms transfomiert. Hierbei rundert der VSFilter einfach selber ab und enscheidet sich meißt falsch...
 +
* Eine Startfarbe für die Line wird OHNE \t() eingefügt {\1c&HFF00FF}{\3c&HFF00FF} ansonsten wird die Stylefarbe als Startzeit immer eingefügt.
 +
 +
Als nächstes fügt man in seinen Code den COLORING_OFF() Befehl ein. Dieser hat zwei Wertangaben, die Farbnummer und die Startzeitverschiebung / Startzeitanpassung. COLORING_OFF(1,wtstart) zum Beipspiel. Dies würde bedeuten, dass er die Colorchanges genau so einfügt, wie wir sie getimet haben im Originalscript.
 +
 +
Will man nun aber die Line bei wtstart (Startzeit der aktuellen Line) minus 300ms starten, würden alle Colorchanges nun 300ms zu früh erscheinen. Um dies zu korrigieren, rechnet die Colorchange Funktion selbständig die von uns getimeten Farbwechsel um und gibt diese aus, vorrausgesetzt man gibt dies an => COLORING_OFF(1,wtstart-0.3)
 +
 +
Sollte nun ein Colorchange nicht mehr in den Bereich der Silbe fallen, da die Startzeit später ist als der vorhandenen \t(), wird dieser von der Funktion einfach weg gelassen um Ausgabetext zu minimieren.
 +
 +
Nun sollte auch klar sein, warum die Startfarbe kein \t() bekommt. Wenn man dies einfügen würde und verschiebt nun die Line um -300ms würde die Colorchange Funktion nun alle im Originalscripot angegebenen \t() um +300ms verschieben. Wenn wir nun der Startfarbe ein \t(0,2,\1c&HFFFFFF&) zuweisen, würde diese auch verschoeben und die Line hätte dan welche Farbe für die ersten 300ms? Genau, die des vorhandenen Styles!
 +
 +
'''<u>Beispiel (danke neo2011):</u>
 +
 +
COLORING_OFF( <farbnummer>, <startzeitderzeile>)
 +
COLORING_OFF(1, wtstart)
 +
farbnummer:
 +
- 1 = foreground
 +
- 2 = 2nd foreground
 +
- 3 = outline
 +
- 4 = shadow
 +
startzeit der zeile ist wohl meist wtstart
 +
'''
  
 
       |      ''lines'' ''' BORDERLINE '(' expr ',' expr ')' '\n' '''        { PrintBorderline( $4.value, $6.value );  }
 
       |      ''lines'' ''' BORDERLINE '(' expr ',' expr ')' '\n' '''        { PrintBorderline( $4.value, $6.value );  }
 +
 +
kommt später, ist zu Komplex für mal eben
  
 
       |      ''lines'' ''' KILLTHISLOOP '\n' '''                            { KillThisLoop(); }
 
       |      ''lines'' ''' KILLTHISLOOP '\n' '''                            { KillThisLoop(); }
 +
 +
  
 
       |      ''lines'' ''' LOWKILL '(' expr ',' expr ')' '\n' '''            { if( $4.value<$6.value ){printf( "lowkill yes %f<%f\n",$4.value,$6.value);
 
       |      ''lines'' ''' LOWKILL '(' expr ',' expr ')' '\n' '''            { if( $4.value<$6.value ){printf( "lowkill yes %f<%f\n",$4.value,$6.value);

Version vom 23. Januar 2012, 14:41 Uhr

Commandos in ASSCalc können als feste Funktionen angesehen werden. Sie können für verschiedene Zwecke eingesetzt werden, haben aber auch gewisse Macken, welche man kennen sollte, aber seht selbst ;) Grundsätzlich beziehen sich diese Funktionen auf die "lines", d.h. sie sind dafür ausgelegt im P Layer benutzt zu werden, im Header funktionieren sie meißt falsch oder eher gar nicht.

      |       lines  expr '\n'                                      { print_tval_of( $2.value );/*fprintf( foutt, "%.12g", $2.value) */}

Die Grundfunktion, wie eine Variable in Calc ausgegeben wird. Das lines bezieht sich auf den Teil in dem die Funktion steht (nicht im Header). expr ist die Bezeichnung für Variable. Hier kann alles stehen, aber man sollte Zahlen vermeiden. Sonderzeichen und nicht englischsprachige Zeichen sind Tabu. \n bedeutet, dass immer eine weitere Leerzeile benötigt wird. Diese kann auch am Scriptende stehen, aber muss vorhanden sein, sonst hagelt es nur Fehler. Wichtig ist auch zu wissen, dass Variablen nur Zahlen sein können und diese bei der Ausgabe um den Faktor 1000 multipliziert werden, da ASSCalc in milisekunden rechnet. Für eine modifizierte Ausgabe, einfach unten weiter lesen (pos of, hex of etc.)

Beispiel:

variablenname

      |       lines  STRING '\n'                                    { fprintf( foutt, "%s", $2.name) }

Fügt einen String in die out.ass ein. Wie in anderen Programmiersprachen muss ein String in "" stehen. Strings und Variablenausgaben können NICHT in einer Codezeile kombiniert werden. Alles was als String angegeben wurde, kann in die out.ass geschrieben werden, auch Sonderzeichen. Eine neue Line wird in der out.ass Erzeugt indem man " + ENTER + " benutzt (siehe Beispiel unten).

Beispiel:

"{\t(0,200,\1c&HFFFFFF&)}"

"{\t(0," tstart-wtstart ")}"

" Dialog: "

      |       lines  INSERT IDENTIFIER '\n'                         { print_identifier( $3.name ); }

Fügt Daten aus dem Grundscript in die out.ass ein. Bisher wird dies für Farben und Text/Zeichen/Silbe benötigt. Diese Daten können nicht verarbeitet werden, sondern nur direkt eingefügt werden, sozusagen CopyPasta ;)

Beispiel:

insert text fügt die aktuelle Silbe oder Text ein, je nach Berechnungsart

insert text_all fügt die ganze Line als Text ein

insert text_copy fügt die ganze Line aus dem Originalscript ein, incl. \ass Tags und sonstigem Code welcher in der Line steht

insert stylecolor1 fügt die Primary Farbe des gelockten Styles ein, gilt auch für die Secondary, Border und Shadowfarbe

insert stylecolor1.stylename fügt die Primary Farbe vom Style "stylename" ein, gilt auch für Secondary, Boder und Shadowfarbe

insert @stylecolor1 nicht ganz schlüssig, eigentlich für die Verbindung mit Farnbtransforms und Colorchanges gedacht, aber funktionierte noch nie....

      |       lines  TEXTINDEX STORE '(' expr ')' '\n'              { TextindexStore( $5.value ); }

Kann die aktuelle Silbe/Zeichen im aktuellen P-Layer Durchlauf in eine Variable schreiben. TEXTINDEX funktioniert hierbei als festes String Array in welches 255 Plätze besitzt.

Beispiel:

TEXTINDEX STORE (1)

      |       lines  TEXTINDEX GET '(' expr ')' '\n'                { TextindexGet( $5.value ); }

Fügt den gespiechterten TEXT aus TEXTINDEX STORE () in die out.ass ein. Ist wie "insert text" zu behandeln und kann keine weitere modifikation oder umspeicherung in einen anderen Slot vorgenommen werden.

Beispiel:

TEXTINDEX GET (1)

      |       lines  RANDOMINS STRING expr '\n'                     { rand_ins( $3.name, $4.value ); }

Keine Erklärumng vorhanden, bitte eiunfügen fals bekannt!

      |       lines  STYLELOCK IDENTIFIER '\n'                      { if( !stylelock_identifier( $3.name ) )return EXIT_SUCCESS; }

Diese Funktion funktioniert im Header und muss dort auch vorhanden sein (alternativ TEXTLOCK). Sie gibt an, auf welchen Style der aktuelle P-Layer zugreifen soll. Stylelock steht in pX.txt und pXh.txt ganz oben in der Datei. Es kann sein, dass man den Stylelock nur im Header benötigt, aber wenn man keine Lust hat auf unvorhersehbare Fehlermeldungen, sollte man sich angewöhnen einfach immer in jedem Layer in 2 Dateien einen Stylelock stehen zu haben.

Beispiel:

stylelock japro


      |       lines  TEXTLOCK IDENTIFIER '\n'                       { if( !textlock_identifier( $3.name ) )return EXIT_SUCCESS; }

Funktioniert ähnlich wie Stylelock, aber benutzt den angegebenen Text als Identifier für seine Suche. Leider klappt dies nicht so richtig und wenn man Textlock in pX.txt und pXh.txt doppelt benutzt, scheint er keinen Zugriff auf die Text Variable zu´bekommen und gibt keinen Text aus und nur den Dialog vorher. => Bitte updaten, fals jemand bessere Erfahrungswerte damit gemacht hat.

Beispiel:

textlock bla


      |       lines  TEXTFIND IDENTIFIER '\n'                       { if( !textfind_identifier( $3.name ) )return EXIT_SUCCESS; }

Mit dieser Funktion kann nach TEXT in einer Line gesucht werden. Wird der Text gefunden, dann wird der Code nach Textfind ausgeführt, wenn nicht, wird er weg gelassen. Groß und Kleinschreibung wird beachtet. Zusätzlich ist es NICHT Silbenabhängig, das bedeutet, wenn der Text erst am Ende der Line steht, ist der Textfind trotzdem für jede Line TRUE. Als typisches Anwendungsbeispiel wäre wohl ein Event zu nennen. Wenn z.B. ein Extra Effekt nur für eine spezielle Line ausgeführt werden soll, oder man eine Variable für eine Line abändern will etc. Textfind geht nicht mit Sonderzeichen! Textfind findet jeden Text, dies gilt nicht nur für Silben. So können z.B. einfache Identifier wie {Q} {X} {FX1} in das Originalscript geschrieben werden und anhand dieser wird Textfind dann entweder ausgeführt oder nicht.

Beispiel:

Originalscript: {Q}{\k22}bla

textfind bla loopfile "special effect.txt" 1

oder

textfind Q loopfile "special effect.txt" 1


      |       lines  '!' TEXTFIND IDENTIFIER '\n'                   { if( textfind_identifier( $4.name ) )return EXIT_SUCCESS; }

Die umkehrfunktion von TEXTFIND. Wenn ein Text NICHT gefunden wird in der ganze Line, wird der Code nach Textfind weiterhin ausgeführt. Typisches Anwendungsbeispiel wäre die Kombination mit Textfind und 2 Dateien als Loop. Eine Datei benötigt den Text um ausgeführt zu werden, die zweite wird nur ausgeführt, wenn der Text NICHT ausgeführt wird.

Beispiel:

!textfind Q loopfile "standard effect.txt" 1

      |       lines  PRINTS STRING '\n'                             { printf( "%s", $3.name ); }

Fügt einen String in das Consolenfenster ein. Dient zur Fehlersuche und überwachung. Verlangsamt durch deutlich mehr Textausgabe in der Console den Berechnungsprozess. Funktioniert nur in Version 1. In der UTF8 Version wird nur leerer Text ausgegeben. Absätze wie im Punkt Strings weiter oben können hier genau so genutzt werden, ansonsten werden sie als Fließtext eingefügt.

Beispiel:

PRINTS " Nein das ist kein fucking Hallo World Ausgabetext "

      |       lines  PRINTV expr '\n'                               { printf( "%f", $3.value ); }

Fügt eine Variable in das Consolenfenster ein. Dient zur Fehlersuche und überwachung. Verlangsamt durch deutlich mehr Textausgabe in der Console den Berechnungsprozess. Funktioniert nur in Version 1. In der UTF8 Version wird nur leerer Text ausgegeben. Werden als Fließtext eingefügt. Für eine bessere Übersicht und Absätze muss man die Funktion mit PRINTS kombinieren. Beispiel:

PRINTV Variablenname

      |       lines  COLORING_OFF '(' expr ',' expr ')' '\n'        { ColoringOff( $4.value, $6.value );  }

Fügt Colorchanges in die jeweilige Stelle ein. Diese Funktion ist sehr komplex und schwierig zu vermitteln. Deswegen etwas ausführlicher. Man beginnt damit, im Originalscript Farbwechsel zum Bild zu timen / einzufügen. Dabei sind folgende Regeln zu beachten:

  • Jede Farbe (1/2/3/4) muss einzelnd getimed werden {\t(100,200,\1c&HFF00FF)}{\t(100,200,\3c&HFF00FF)}
  • Harte Farbwechsel wie bei Szenenwechseln üblich sollten immer mit der Zeit der Startframes anfangen und mit der des Endframes aufhören, da es sonst zu verschiebungen um 1 Frame kommen kann, wenn man nur 1 bis 2 ms transfomiert. Hierbei rundert der VSFilter einfach selber ab und enscheidet sich meißt falsch...
  • Eine Startfarbe für die Line wird OHNE \t() eingefügt {\1c&HFF00FF}{\3c&HFF00FF} ansonsten wird die Stylefarbe als Startzeit immer eingefügt.

Als nächstes fügt man in seinen Code den COLORING_OFF() Befehl ein. Dieser hat zwei Wertangaben, die Farbnummer und die Startzeitverschiebung / Startzeitanpassung. COLORING_OFF(1,wtstart) zum Beipspiel. Dies würde bedeuten, dass er die Colorchanges genau so einfügt, wie wir sie getimet haben im Originalscript.

Will man nun aber die Line bei wtstart (Startzeit der aktuellen Line) minus 300ms starten, würden alle Colorchanges nun 300ms zu früh erscheinen. Um dies zu korrigieren, rechnet die Colorchange Funktion selbständig die von uns getimeten Farbwechsel um und gibt diese aus, vorrausgesetzt man gibt dies an => COLORING_OFF(1,wtstart-0.3)

Sollte nun ein Colorchange nicht mehr in den Bereich der Silbe fallen, da die Startzeit später ist als der vorhandenen \t(), wird dieser von der Funktion einfach weg gelassen um Ausgabetext zu minimieren.

Nun sollte auch klar sein, warum die Startfarbe kein \t() bekommt. Wenn man dies einfügen würde und verschiebt nun die Line um -300ms würde die Colorchange Funktion nun alle im Originalscripot angegebenen \t() um +300ms verschieben. Wenn wir nun der Startfarbe ein \t(0,2,\1c&HFFFFFF&) zuweisen, würde diese auch verschoeben und die Line hätte dan welche Farbe für die ersten 300ms? Genau, die des vorhandenen Styles!

Beispiel (danke neo2011):

COLORING_OFF( <farbnummer>, <startzeitderzeile>) COLORING_OFF(1, wtstart) farbnummer: - 1 = foreground - 2 = 2nd foreground - 3 = outline - 4 = shadow startzeit der zeile ist wohl meist wtstart

      |       lines  BORDERLINE '(' expr ',' expr ')' '\n'          { PrintBorderline( $4.value, $6.value );  }

kommt später, ist zu Komplex für mal eben

      |       lines  KILLTHISLOOP '\n'                              { KillThisLoop(); }


      |       lines  LOWKILL '(' expr ',' expr ')' '\n'             { if( $4.value<$6.value ){printf( "lowkill yes %f<%f\n",$4.value,$6.value);
                                                                      return EXIT_SUCCESS;}else printf( "lowkill no %f>=%f\n",$4.value,$6.value); }
      |       lines  IDENTIFIER '=' expr '\n'                       { set_identifier( $2, $4.value ); }
      |       lines  IDENTIFIER '[' expr ']' '=' expr '\n'          { set_identifier_arr( $2, $7.value, $4.value ); }
      |       lines  FONTMATCHUSE STRING '\n'                       { fontmatchuse( $3.name ); }
      |       lines  SETFLAG STRING '\n'                            { set_flag( $3.name ); }
      |       lines  TIMEOF expr '\n'                               { print_time_of( $3.value ); }
      |       lines  POSOF expr '\n'                                { print_pos_of( $3.value ); }
      |       lines  HEXOF expr '\n'                                { print_hex_of( $3.value ); }
      |       lines  CHAROF expr '\n'                               { print_char_of( $3.value ); }
      |       lines  COLOROF expr '\n'                              { print_color_of( $3.value ); }
      |       lines  TVALOF expr '\n'                               { print_tval_of( $3.value ); }
      |       lines  LOOPFILE STRING expr '\n'                      { loop_file( $3.name, $4.value, 1 ); }
      |       lines  LOOPFILE2 STRING '(' expr ',' expr ')' '\n'    { loop_file( $3.name, $5.value, $7.value ); }
      |       lines  EXIT '\n'                                      { return EXIT_SUCCESS; }
      |                 /* empty */ 
      |                 error '\n'               { printf("\n error \n"); yyerrok; }