VDJPedia



 

Go back to German content


VDJScript - Virtual DJ Script
(Übersetzung aus dem Englischen von H. Jakovski)

VDJScript ist die neue Skiptsprache die in allen Komandofunktionen von VirtualDJ verwendung findet.
Sie kann in Skins, Tastaturkürzeln (Shortcuts) und beim mappen von Kontrollern verwendet werden.

Die Sprache wurde so designt das sie leicht erlernbar ist, eine kurze Schreibweise besitzt, jedoch mächtig genug ist komplexe Scripte und Makros abzubilden.
In der einfachsten Form können sog. "Verben" wie "play", "pause", "goto_cue 1", "volume 70%", "pitch +0.5%", etc. verwendet werden.
Oder aber je nach Anwendung können komplexe Makros erstellt werden wie z.B.:

"play ? crossfader +12.3% & effect 'flanger' activate : deck 2 loop 4 & set $myvar 42"

(Eine Erklärung dieses Beispiels würde gleich am Anfang etwas den Rahmen sprengen. Nur soviel sei gesagt, die "42" erklärt sich aus dem Film "Per Anhalter durch die Galaxis" ;-) - Anmerkung d. Übersetzers)

Verben:

Die Basiselemente von VDJScript sind sogenannte "Verben" (Liste in Englisch).
Eine Liste der "Verben" die VirtualDJ verarbeiten kann finden sich im Bereich "config=>Mapper" im Bereich "See also...".

Alternativ kann auch die Datei "Eigene Dateien/Virtual DJ/Language/English.xml" geöffnet werden. Unter dem Element "<action>" sind alle Verben
mit jeweils einer kurzen Erklärung angegeben.

Von "armin mc" wurde hierzu für Euch eine deutsche Language XML Datei geschrieben. Diese steht für Euch im Downloadcenter für Euch bereit.


Kommandos:

Die Grundkommandos bestehen im Prinzip lediglich aus einem Verb (wie z.B. "play" oder "pause")
Diese "Verben" können optional durch andere "Kommandos" oder Optionen ergänzt werden.

- "deck" - Durch voranstellen des "deck" KOmmandos kann bestimmt werden auf welchem Laufwerk die Aktion durchgeführt werden soll.
Gültige Werte sind z.B. "1", "2", "left", "right", "default" oder "active". Also z.B. "deck left stop".

- "parameter" - Nach einem Verb können ein oder zwei Parameter (je nach Verb) übergeben werden. Gültige Werte sind:
"Text", Prozentangaben (z.B. "20%"), Wahr oder falsch ("true", "false"), Zeitangaben ("+1400ms"), Ganze Zahlen (z.B. 1, 7, 124) und
Dezimalzahlen wie "1.5" oder "2.87".

- "effect" - Zum Ansprechen von Effekten dient das Kommando "effect" so kann z.B. mit "effect activate" der Effekt angeschaltet werden.
Um gezielt ein Deck anzusprechen sollte das "deck" Kommando vorangestellt werden, also z.B. "deck 2 effect activate".
Ein Effekt kann zum einen über die Slotnummer, oder direkt über den Namen angesprochen werden:
"effect 'flanger' slider 1 70%" - der Zusatz Slider steuert die Parameterregler des Effekts. Möglich wäre also auch folgendes:
"deck 1 effect 3 slider 1 70% slider2 30%" um am linken Player den Effekt im Slot 3 zu aktivieren und die Parameterregler
entsprechend einzustellen. Auch hier kann wieder durch voranstellen von z.B. "deck right" das gewünschte Laufwerk ausgewählt werden.

- "sampler" - Zum ansprechen des Samplers gefolgt von der Slot Nummer. Z.B. "sampler activate" oder "sampler 3 volume 70%". Auch hier kann wieder
das Kommando "deck" vorangestellt werden.

- Abfragen - Einige spezielle Abfragen benötigen das Kommando "get" vorangestellt. So z.B. "get time_ms", bzw. "deck left get time_ms".

- Temporäre Aktionen - Das Anhängen von "while_pressed" am Ende eines "Verbs" bewirkt das Ausführen nur solange die Taste betätigt wird.
Z.B. "volume 100% while_pressed"

- holding <zeit in ms> - Um eine Taste z.B. für Shift zu nutzen und trotzdem die Original Funktion der Taste zu erhalten.
Die Taste löst erst die gewünschte Funktion aus wenn sie eine gewisse Zeit gedrückt/gehalten wird.

holding 1000ms ? <holding action> : <standard action>
(1000ms = 1 Sekunde)

- Blinken von LEDs - "blink" oder "blinkfast" bewirkt das Blinken einer LED am Kontroller wenn das vorangestellte Verb wahr ist. Also z.B.
"play blink" bewirkt das Blinken der LED wenn der Player läuft. "pause blinkfast" - im Pause Modus würde die LED dann
schnell blinken. Auch hier bewirkt das voranstellen des "deck" Kommandos das ansprechen eines bestimmten Players.

Die komplette Kommando Syntax lautet: deck [deck]

effect [effect]

sampler [slot]

[get] verb [param1[param2]]

blink

blinkfast

while_pressed


Macros:

Um kompliziertere Abläufe zu programmieren werden Makros verwendet. Mit dem "&" Zeichen werden mehrere Befehle miteinander verkettet.
Beispiel: "goto_cue 1 & pause" - springt an den Cuepunkt 1 und schaltet auf pause. Entsprechend würde "goto_cue 1 & play" zum Cuepunkt springen und
direkt mit der Wiedergabe starten. Die einzelnen "Verben" werden der Reihe nach abgearbeitet. Das auch hier wieder die Verknüpfung mit dem "deck"
Kommando möglich ist sei an dieser Stelle zum letzten mal erwähnt. (Ich denke mal das hat jetzt jeder verstanden ;-))


Variablen:

Variablen kann man sich ungefähr wie kleine gelbe Klebezettel vorstellen. Auf dem Zettel steht der Name der Variable und deren Wert.
"set $test 1" oder "set $test true" oder "set $test 42" ;-) Der Wert ist in der Variable gespeichert und kann an anderer Stelle im Skript verwendet werden.
Alle Variablen beginnen entweder mit dem "$" Zeichen und sind somit überall im Skript verwendet werden, oder mit "%" und sind dann lokal nur auf dem
jeweiligen Player verwendbar. "deck 1 set %test 1" und "deck 2 set %test 5" - Somit hat die Variable auf Deck 1 den Wert "1" und auf Deck 2 den Wert "5".

Um eine Variable zu setzen können Verben wie "set", "toggle" und "cycle" verwenden.
Um eine Variable zu lesen können Verben wie "var", "var_equal", "var_smaller", etc. verwendet werden.
Ein typisches Beispiel für die Verwendung von Variablen ist es eine Taste als sogenannte "Shift" Taste zu belegen. Wird diese Taste vorher gedrückt,
bzw. zusammen mit einer zweiten Taste festgehalten, so kann die 2. Taste zusammen mit Shift eine andere Funktion haben als im normalen Betrieb.
Also z.B. "set $myshift while_pressed" für die Shift Taste und "var $myshift ? Kommando1 : Kommando2" für die andere Taste programmiert.
Die 2, Taste wird im Normalfall das Kommando2 ausführen (false) und zusammen mit gedrückter Shift Taste das Kommando1 ausführen.


Verzweigungen: (jetzt wird's etwas komplizierter)

Mit den Zeichen "?" und ":" ist es möglich bedingte Verzweigungen zu programmieren. Die Syntax sieht folgendermaßen aus:
"Bedingung ? wahr : falsch" - Hier wird eine Bedingung geprüft. Ist diese wahr wir das erste Statement ausgeführt, ist sie falsch wird das zweite
Statement ausgeführt. Speziell in Verbindung mit der Verwendung von Variablen kann einiges realisiert werden.
Dies soll kurz an ein paar Beispielen erläutert werden:

"$test ? deck 1 loop 4 : deck 1 loop 8" - Wenn die Variable $test wahr ist, also NICHT null wird ein 4'er Loop auf Deck 1 gestartet, ansonsten ein 8'er Loop
auf dem Deck 1.


Verb vs Abfrage

"Verben" können als Aktion oder als Abfrage verwendet werden, je nachdem in welchem Kontext sie stehen. Wenn z.B. in einem Controller Mapping
bei einer Taste das Verb "play" steht wird das Drücken der Taste die Wiedergabe starten. Steht jedoch bei einer LED das Verb "play" wird eine
Abfrage des Zustandes durchgeführt. Ist die Abfrage wahr (also läuft der Player) wird die LED leuchten. Ist der Player gestoppt, also ein falsch als
Antwort bleibt die LED dunkel.

Einige Kommandos können Boolsche Werte (wahr=true/falsch=false) oder einen Wert zurückgeben, abhängig von den Parametern:
- "crossfader" - liefert einen Wert zwischen 0.0 und 1.0 wenn er in einer Abfrage geschrieben wird.
- "crossfader 42%" - liefert wahr (true) zurück wenn der Crossfader auf 42% steht, ansonsten ist der Rückgabewert falsch (false).

Kommandos die mit "get" am Anfang aufgerufen werden können ebenfalls einen Rückgabewert enthalten. Entweder einen String (Text) oder eine Zahl,
abhängig vom verwendeten Verb.


Parameter

VDJScript kennt 6 verschiedene Parameter Typen:

- text - muss immer in einzelnen (') oder doppelten (") Hochkommas stehen. Z.B.: "load 'myfile.mp3'"

- Boolscher Wert - Kann die Werte "on" - "1", "off" - "0", "true" - "1", "false" - "0" oder "toggle" - "-1" haben.
Bei "toggle" wird der Wert von "0" nach "1", bzw. "1" nach "0" geändert.

- Zeiten - Zeiten werden in Millisekunden (ms) angegeben. 1000ms sind 1 Sekunde. Z.B. "nudge +100ms"

- Integer - Sind ganze Zahlen (1, 2, 3, 4, 5, ...) Also zum Beispiel: "effect select +1"

- Dezimalzahlen - Sind Zahlen mit Kommastelle (ACHTUNG! Punkt statt Komma verwenden). Zum Beispiel: "crossfader 0.5"

- Prozentzahlen - Beispiel: "crossfader 50%"

Die meisten der Zeitangaben, Dezimalzahlen, Prozentwerte werden gleich behandelt (50% / 100 = 0.5).
Einige Ausnahmen gibt es jedoch. So setzt z.B. "pitch 100%" den Pitch in der Mitte, während "pitch 1.0" den Pitch auf den Maximum Wert setzt.
Beachtet auch das ein "nudge +1" und "nudge +1.0" nicht das selbe sind. Der erste Befehl bewegt um 1 Beat, während der zweite das selbe bewirkt
wie "nudge +100%" nämlich an das Ende des Songs zu springen. In der Regel sollte mit Prozentzahlen gearbeitet werden. Beim arbeiten mit Dezimalzahlen
müsst Ihr halt etwas genauer testen ob alles so läuft wie Ihr euch das gedacht habt ;-).

Implizierte Parameter

Wenn Ihr ein Kommando für einen Slider, Drehknopf, Jogwheel oder ähnliches nutzt wird AUTOMATISCH der Wert der auf dem Slider eingestellt wird
an den Parameter angehängt !!! Also wenn Ihr z.B. als Aktion "volume" schreibt und den Slider auf 42% stellt wird daraus automatisch "volume 0.42".
Wenn Ihr allerdings schreiben würdet "volume 10%" würde daraus "volume 10% 0.42" - in diesem Fall wir der zweite Parameter, also die "0,42" verworfen da
das Verb "volume" lediglich einen Parameter kennt.

Wenn Ihr den Implizierten Parameter beeinflussen möchtet könnt Ihr das mit Verben wie z.B. "parameter_multiply", "parameter_add", etc. erreichen.
Wenn also der Slider auf 42% steht würde "parameter_multiply 0.1 & volume" die Lautstärke auf 4.2% setzen (42% x 0.1).

WICHTIG !!!
Wenn Ihr ein Makro verwendet wird der Implizierte Parameter an JEDES der Verben automatisch angehängt, also würde aus "crossfader & loop" ein
"crossfader 0.42 & loop 0.42" werden. Um zu verhindern das bei der Loop auch der (in diesem Falle) falsche Wert angehängt wird muss mit dem Verb
"value" die Position gesetzt werden an der der Wert eingesetzt werden soll. In diesem Fall wird an die anderen Verben im Makro KEIN Wert angehängt.
Aus "crossfader value & loop" wird dann "crossfader 0.42 & loop". Es können beliebig viele "value" in das Makro eingesetzt werden - jeder "value" wird dann
durch den entsprechenden Wert ersetzt.

Slider liefern Dezimalwerte als Implizierten Parameter zurück, also "crossfader" => "crossfader 0.42".

Jogwheels liefern einen relativen Wert zurück "crossfader" => "crossfader +0.42" (+1.0 stellt eine komplette Umdrehung des Jogwheels dar)

Endlosregler (Endlospotis) addieren einen relativen Integer Wert (Ganzzahlig 1, 2, 3, 4, ...) - "crossfader" => "crossfader +1"

Wenn Ihr einen Endlosregler an Stelle eines Sliders verwendet wird der Integer automatisch in einen Dezimalwert konvertiert indem er durch 32 geteilt wird.
Das bedeutet: es werden 32 Schritte am Endlosregler benötigt um von 0% bis 100% zu faden.
In unserem vorherigen Beispiel würde das folgendes bedeuten: "crossfader +1" entspricht "crossfader +0.03125". Mit dem Verb "parameter_multiply" könnt Ihr selbst
eine entsprechende Umrechnung des Wertes vornehmen und so die Auflösung ändern.

(Übersetzung aus dem Englischen von H. Jakovski)



An dieser Stelle bin ich mal so frei und bringe ein paar nützliche Beispiele für die neue VDJScriptsprache:

EQ Patch (H. Jakovski) wrote :

<map value="HIGH" action="eq_high & param_equal 0% ? eq_kill_high 1 : eq_kill_high 0" />
<map value="MED" action="eq_mid & param_equal 0% ? eq_kill_mid 1 : eq_kill_mid 0" />
<map value="LOW" action="eq_low & param_equal 0% ? eq_kill_low 1 : eq_kill_low 0" />

Wenn einer EQ Regler (Bass/Mid/High) komplett nach links, also auf den kleinsten Wert eingestellt werden, wird automatisch der Kill-Switch für den jeweiligen Kanal (Bass/Mid/High) aktiviert. Wenn der Regler wieder nach rechts gedreht wird schaltet sich der Kill-Switch wieder aus.



Tasten am Controller mehrfach belegen (H. Jakovski) wrote :

Wenn Ihr Tasten am Controller doppelt belegen wollt benötigt Ihr zuerst mal eine Taste am Controller die Ihr nicht standardmäßig benötigt. Diese Taste wird dann als 'Shift' Taste belegt. Wenn Ihr jetzt z.B. auf die Taste 'Play' eine zweite Funktion zuweisen wollt habt Ihr zwei Möglichkeiten. Entweder Ihr haltet die Shift Taste gedrückt und betätigt dann die Play Taste um die zweite Funktion aufzurufen:

<map value="Name der Taste" action="down ? set $shift 1 : set $shift 0" />

wenn Ihr wollt kann die Shift Taste so belegt werden das sie beim ersten betätigen aktiviert wird und beim zweiten betätigen wieder abgeschaltet wird:

<map value="Name der Taste" action="toggle $shift" />

Wenn die Shift Taste eine eigene LED besitzt könnt Ihr Euch mit dieser LED z.B. den Zustand der Shift Taste anzeigen lassen:

<map value="Name der Leuchtdiode" action="var $shift" />

So, jetzt müsst Ihr lediglich noch folgendermaßen die zweite Funktion auf die Taste 'play' programmieren:

<map value="PLAY" action="var $shift ? hot_cue 1 : play_pause" />

in diesem Fall würde die Taste ganz normal Play/Pause machen und zusammen mit Shift als 'Hotcue 1' arbeiten.



Regler einzeln ansprechen wenn sie nur einen gemeinsamen Namen haben (H. Jakovski) wrote :

Wenn Ihr z.B. 2 Volumen Regler am Controller habt könnt Ihr diese nicht so ohne weiteres getrennt ansprechen da beide in der Mapperliste dem Namen z.B. VOLUME zugeordnet sind. Um die Regler jetzt trotzdem getrennt voneinander verwenden zu können verwendet Ihr folgenden Befehl:

action_deck 1 ? deck 1 volume : pitch

jetzt würde der Linke Regler ganz normal die Lautstärke regeln während der rechte Regler als Pitch Regler funktioniert.
Wenn der Rechte Regler NUR das Deck 1 steuern soll würdet Ihr entsprechend:

action_deck 1 ? deck 1 volume : deck 1 pitch

schreiben. Ab Version 7 bitte anstelle von action_deck die neue Action device_side 'left' ? linke action : rechte action verwenden.



Umschalten zwischen Deck 1 & 3 auf der linken- und Deck 2 & 4 auf der rechten Seite mittels 2 Tasten am Controller (ab Version 7) wrote :

Wenn Ihr einen Controller habt könnt Ihr eine Taste pro Deck nutzen um zwischen den Decks umzuschalten. Hierbei wird z.B. die Effekt-Taste (linkes und rechtes Deck) benutzt - hierbei unterscheidet VDJ automatisch ob auf der linken oder der rechten Seite die Taste betätigt wird.

device_side 'left' ? deck 1 select ? deck 3 select & deck 3 leftdeck : deck 1 select & deck 1 leftdeck : deck 2 select ? deck 4 select & deck 4 rightdeck : deck 2 select & deck 2 rightdeck



Umschalten zwischen Deck 1 & 3 auf der linken- und Deck 2 & 4 auf der rechten Seite (ab Version 7) wrote :

Umschalten zwischen Deck 1 & 3:
deck 1 select ? deck 3 select & deck 3 leftdeck : deck 1 select & deck 1 leftdeck

Umschalten zwischen Deck 2 & 4:
deck 2 select ? deck 4 select & deck 4 rightdeck : deck 2 select & deck 2 rightdeck



Hercules RMX - Umschalten der Jogs - Vinyl Mode / CD Mode wrote :

deck 1 vinyl_mode on ? deck 1 vinyl_mode off & deck 2 vinyl_mode off & deck 3 vinyl_mode off & deck 4 vinyl_mode off : deck 1 vinyl_mode on & deck 2 vinyl_mode on & deck 3 vinyl_mode on & deck 4 vinyl_mode on



Looplänge mit Fader verändern wrote :
loop ? param_smaller 12% ? loop 0.125 ? nothing : loop 0.125 : param_smaller 24% ? loop 0.25 ? nothing : loop 0.25 : param_smaller 36% ? loop 0.5 ? nothing : loop 0.5 : param_smaller 48% ? loop 1 ? nothing : loop 1 : param_smaller 60% ? loop 2 ? nothing : loop 2 : param_smaller 72% ? loop 4 ? nothing : loop 4 : param_smaller 84% ? loop 8 ? nothing : loop 8 : loop 16 ? nothing : loop 16 : nothing



Quote :
SHIFT TASTE: toggle "SHIFT" while_pressed

JOGWHEEL: device_side 'left' ? SHIFT ? browser_window "folders" & browser_scroll & vinyl_mode='0' & wheel_mode "browser" : vinyl_mode 1 & touchwheel & wheel_mode "jog" : SHIFT ? browser_window "songs" & browser_scroll & vinyl_mode='0' & wheel_mode "browser" : vinyl_mode 1 & touchwheel & wheel_mode "jog"

Wenn bei Euch eine andere Action für die Jogs hinterlegt ist müsst Ihr das touchwheel entsprechend ändern.




Bitte beachtet das die Beispiele immer für die neuste VDJ Version gedacht sind da teilweise neue Updates auch neue Actions mitbringen !

Gruß, Heiko


Go back to German content