Kontakt und Kontakt-Script

Kontakt (Native Instruments): ab 2004, leistungsstarker Software Sampler, Multisampling, Multilayering, eigene Effekte und ab Kontakt 2 auch mit eigener Scriptsprache und Kontakt Script Prozessor (KSP).

 

Grundlagen fürs Scripting in Kontakt:

1. Instrument mit Ressources-Ordner und nkr-Datei anlegen

Unter "Files -> new instrument" ein neues instrument anlegen:


Kontakt 5 - Instrument anlegen

Im neuen Instrument auf den Werkzeugbutton oben links klicken:


Kontakt 5 - Neues Instrument

Das Instrument via "Files -> Save instrument as..." (z.b. als kontakt.nki) in einem beliebigen Ordner speichern und über den Werkzeugbutton links oben die verschiedenen Einstellungen der Library editieren: Dort unter "instrument options" auf "create" klicken


Kontakt Instrument Options

Es wird automatisch ein Resources-Ordner angelegt und ein *.nkr-File (um Bilder, Impulsantworten und Skripte abzulegen, z.B. kontakt.nkr). Immer, wenn neue Ressourcen den Ordnern hinzugefügt werden, werden mit einem Klick auf "create" diese auch dem *.nkr-File zugeordnet. Dabei muss folgendes beachtet werden:

  • Impulsantworten gehören in den Ordner: Resources\ir_samples\
  • Skripte gehören in den Ordner: Resources\scripts\
  • Bilder gehören in den Ordner: Resources\pictures\

zu jedem Bild gehört eine gleichnamige Textdatei (*.txt) im gleichen Ordner, in der die Bildeigenschaften eingestellt werden. Für ein Hintergrundbild (*.tga oder *.png z.B. wallpaper.png) bedeutet das im Textfile wallpaper.txt:

Has Alpha Channel: no
Number of Animations: 0
Horizontal Animation: no
Vertical Resizable: no
Horizontal Resizable: no
Fixed Top: 0
Fixed Bottom: 0
Fixed Left: 0
Fixed Right: 0

Unter "Instrument Wallpaper" lässt sich die wallpaper.png auswählen. Eine gute Wallpapergröße sollte in der Höhe zwischen 50 und 540px liegen und in der Weite stets bei 632px.

Die Kontakt-eigenen Grafiken liegen bei Kontakt 4 bei Windows unter:
...\Programme\Gemeinsame Dateien\Native Instruments\Kontakt 4\pictures

Die Kontakt-eigenen Grafiken liegen bei Kontakt 5 bei Windows unter:
C:\Users\[...]\Documents\Native Instruments\Kontakt 5\pictures

bei MacOs unter:
...\Library\Application Support\Native Instruments\Kontakt 4\pictures

 

Unter Files "save edited instrument as..." das Instrument abspeichern, entweder als "Patch" (es werden nur die Positionen der Samples abgespeichert) oder als "Patch+Samples" (Samples werden mit dem Patch in einem eigenen Ordner abgespeichert) oder als "Monolith" (Samples und Patch werden in einer einzigen Datei abgespeichert).

 

2. Wave-Dateien einladen und gruppieren

Unter den Werkzeugen den Mapping Editor öffnen und unter Files die gwünschten Wavedateien auswählen und via Drag & Drop in den Mapping Editor ziehen. Je weiter unten man im Mapping-Editor die Dateien ablegt, desto kleiner wird der Umfang, innerhalb dessen die einzelne Wavedatei auf verschiedenen Tonhöhen gespielt werden kann.

Will man pro Taste einen Klang haben, dann sollten die Dateien ganz unten im Velocitiy-Feld auf die entsprechenden Tasten abgelegt werden. Soll ein Klang über die ganze Tastatur in verschiedenen Tonhöhen spielbar sein, dann sollte er ganz oben abgelegt werden.

Klänge können im Velocity-Feld auch übereinander abgelegt werden, so dass z.B. im pp ein anderer Klang erklingt als im p, im mf, ff oder ff.

Meist werden sowohl für verschiedene Velocitystufen als auch für verschiedene Tonhöhen die Samples im Mapping Editor abgelegt.


Mapping von fünf Wave-Dateien nebeneinander auf der Tastatur, im Velocity-Feld ganz unten abgelegt.


Mapping von einer Wave-Datei im Velocity-Feld ganz oben abgelegt.


Verschiedene Klänge für verschiedene Velocity-Stufen auf einer Taste

 

3. Keyswitch zwischen verschiedenen Artikulationen erstellen

  • Group- und Mapping-Editor öffnen.

  • im Group Editor: Samples für die erste Group hineinziehen und die Gruppe entsprechend benennen (z.B. "a").

  • über "Create Empty Group" zweite Gruppe erstellen und im Mapping Editor "selected groups only" anklicken, so dass jeweils nur der Inhalt der ausgewählten Gruppe angezeigt wird. "Edit all groups" dissablen, damit nicht alle Gruppen gleichzeitig bearbeitet werden.

  • Samples für die zweite Group hineinziehen und die Gruppe entsprechend benennen (z.B. "e").

  • Zur Gruppe "a" wechseln und in "Group starts" "on key" auswählen und bei "if key is between ... and ..." die Taste für den Keyswitch auswählen (z.B. "between C0 and C0"). Dann zur Gruppe "e" wechseln, ebenfalls "on key" auswählen und den zweiten Keyswitch anlegen (z.B. "between D0" and D0").

  • für "i", "o" und "u" die Schritte entsprechend wiederholen.


Keyswitch mit der Gruppe "a" aktiviert


Keyswitch mit der Gruppe "e" aktiviert

kompletter Monolith: kontakt_keyswitch.nki

 

4. Round Robin zwischen verschiedenen Artikulationen erstellen

automatisch zwischen den Gruppen wechseln (damit bei gleicher Tonhöhe dennoch leicht unterschiedliche Klangfarben erklingen), funktioniert ähnlich wie der Keyswitch:

  • Group- und Mapping-Editor öffnen.

  • im Group Editor: Samples für die erste Group hineinziehen und die Gruppe entsprechend benennen (z.B. "a").

  • über "Create Empty Group" zweite Gruppe erstellen und im Mapping Editor "selected groups only" anklicken, so dass jeweils nur der Inhalt der ausgewählten Gruppe angezeigt wird. "Edit all groups" dissablen, damit nicht alle Gruppen gleichzeitig bearbeitet werden.

  • Samples für die zweite Group hineinziehen und die Gruppe entsprechend benennen (z.B. "e").

  • für "i", "o" und "u" die Schritte entsprechend wiederholen.

  • Zur Gruppe "a" wechseln und in "Group starts" "cycle round robin" oder "random round robin" auswählen und bei "Position in round robin chain" die gewünschte Position eingeben (z.B. 1). Dann zur Gruppe "e" wechseln, ebenfalls "cycle round robin"auswählen und die nächste Position anlegen (z.B. 2) und für "i", "o" und "u" die Schritte entsprechend wiederholen.

- cycle round robin = bei jedem Tastendruck wird in festgelegter Reihenfolge eine Gruppe nach der anderen aufgerufen
kompletter Monolith: kontakt_round_robin_cycle.nki

- random round robin = bei jedem Tastendruck wird in zufälliger Reihenfolge eine Gruppe aufgerufen:
kompletter Monolith: kontakt_round_robin_random.nki

 

 

5. Scripte anlegen

Von Native Instruments werden schon direkt beim Start eine Reihe von Scripten mitgeliefert, die man unter dem Tab "Script Editor" (ganz rechts) und dann "Preset" (ganz links) findet. Pro Instrument können fünf verschiedene Scripte angelegt werden; die Scripte werden von links nach rechts abgearbeitet.

Über "edit" (links unten) gelangt man in den Script-Editor, in dem man vorgefertigte Scripte anschauen und verändern kann oder eigene Scripte anfertigen kann.


Kontakt Script Editor
Kontakt-SängerInnen-Bausatz


sobald man ein Script aufgeschrieben hat, kann man es mit einem Klick auf die Taste "Apply" (ganz rechts im Editor) ausführen. Eigene Scripte kann man auch mit einem Passwort schützen (via "lock with password") und/oder auch via "Preset -> Save Preset" für die spätere Weiterverwendung unter "User" abspeichern.

 

Events (gedrückte Taste, geklickter Button, gedrehtes Modulationsrad etc.) lösen sogenannte callbacks aus. Es gibt verschiedene Arten von callbacks:

 

5.1 on init

on init […] end on:
Initialisierung beim Starten. Hier wird das User-Interface mit Größe und Art/Position der Knöpfe festgelegt.

Als Initialisierungsscript bietet sich so z.B. an:
(Script aus dem Kontakt-SängerInnen-Bausatz)

{########Initialisierung#######}
on init
message ("") {Messages loeschen}
make_perfview {GUI auf Wallpapergroesse aufziehen}
set_ui_height_px(350) {Wallpaperhoehe festlegen}

declare ui_switch $Schalter {Schalter deklarieren}
move_control_px($Schalter, 200,200) {Schalter positionieren}
declare $ID_schalter {Variable fuer ID des Schalters deklarieren}
$ID_schalter:=get_ui_id($Schalter) {ID des Schalters holen}
set_control_par_str($ID_schalter, $CONTROL_PAR_TEXT, "Saengerin"){mit ID Schalter-Text umbenennen}

declare ui_knob $Drehknopf (0,12,1){Drehknopf deklarieren: min, max, Schrittweite}
move_control_px($Drehknopf, 350,200){Drehknopf positionieren}
make_persistent($Drehknopf){Drehknopf persistent machen = wird in der gleichen Position wieder geladen}
declare $ID_drehknopf {Variable fuer ID des Drehknopfs deklarieren}
$ID_drehknopf:=get_ui_id($Drehknopf){ID des Drehknopfs holen}
set_control_par_str($ID_drehknopf, $CONTROL_PAR_TEXT, "Intervall"){mit ID Drehknopf-Text umbenennen}


declare ui_slider $s1(0,1){Slider deklarieren, um mit Bild zu belegen: min, max}
set_control_par_str(get_ui_id($s1), $CONTROL_PAR_PICTURE, "saenger"){Bild Saenger auf den Slider legen}
move_control_px($s1, 530,0){Slider positionieren}
set_control_par(get_ui_id($s1), $CONTROL_PAR_MOUSE_BEHAVIOUR, 0){Slider fuer Mausbewegung aktivieren}
set_control_par(get_ui_id($s1), $CONTROL_PAR_PICTURE_STATE, 0){Ausgangsbild des Sliders festlegen}

declare ui_slider $s2(0,1){Slider deklarieren, um mit Bild zu belegen: min, max}
set_control_par_str(get_ui_id($s2), $CONTROL_PAR_PICTURE, "saengerin"){Bild Saengerin auf den Slider legen}
move_control_px($s2, 0,0){Slider positionieren}
set_control_par(get_ui_id($s2), $CONTROL_PAR_MOUSE_BEHAVIOUR, 0){Slider fuer Mausbewegung aktivieren}
set_control_par(get_ui_id($s2), $CONTROL_PAR_PICTURE_STATE, 0){Ausgangsbild des Sliders festlegen}
declare $zufall {Variable Zufall deklarieren}
end on


Mit Hilfe von {...} kann man Kommentare setzen = gut, um den Überblick zu behalten oder Scriptteile auszukommentieren.
Mit
message ("") werden eventuelle Ausgaben gelöscht, die in der Statusleiste des Instruments angezeigt werden (gut zum debuggen).
mit
make_perfview wird die Performance-Ansicht aufgerufen, die mit set_ui_height_px(540)in ihrer Höhe festgelegt wird.
Über
declare werden Variablen deklariert ($zufall, $s1, $s2, $Drehknopf, $Schalter) und können Schalter (ui_switch) und Drehknöpfe (ui_knob) eingerichtet und mit einer Variablen versehen werden (s.u.):
ui_switch hat 1 Einstellung: aus/an
ui_knob
hat 3 Einstellungen: Minimum - Maximum - Schrittgröße
ui_slider hat 2 Einstellungen: Minimum - Maximum
make_persistent bewirkt, dass der eingestellte Wert auch nach dem Schließen des Instruments noch erhalten bleibt.
Mit
move_control_px(...) kann man die x- und y-Position eines Bedienelements in Pxeln festlegen.

 

5.1.1 Variablen

Mit dem Zeichen $ wird eine Variable vergeben (z.B. $Schalter und $Drehknopf und $Schieber sind Variablen = veränderliche Werte, die den gleichnamigen UI-Elementen zugeordnet sind).

Variablen können Zahlen (mit $) oder Texte (mit @) sein und werden bei on init über den Befehl declare deklariert.

Zahlenwerte können einer Variablen direkt über := zugewiesen werden, z.B.

$Drehknopf := 100

Variablen können auch in Arrays (Listen) zusammengefasst werden (mit % bei Zahlen und mit ! bei Texten). Beim Deklarieren wird auch gleich die Anzahl der Variablen pro Array in eckigen Klammern mitgegeben, z.B.:

declare %Drehknopfliste[5]

Zahlen und Texte können den einzelnen Array-Elementen zugewiesen werden; dabei werden sie in ihrer Zählung von 0 beginnend über runde Klammern angesprochen, z.B.:

%Drehknopfliste(0) :=10
%Drehknopfliste(1) :=127
%Drehknopfliste(2) :=99
%Drehknopfliste(3) :=50
%Drehknopfliste(4) :=66

Konstante Variablen (die nur einmal definiert werden und sich dann nicht mehr ändern, z.B. für Konvertierungen) werden mit dem Zusatz const gekennzeichnet.

 

5.2 on note

on note […] end on:
Callback wird aufgerufen, wenn eine MIDI-Note gedrückt wird: via Script kann die Note verändert (pitch, velocity, volume, panning, tuning etc.) oder als Begleitung vervielfacht werden

Als Notenscript bietet sich z.B. an, Dur-Akkorde zu erzeugen, z.B.:

on note
play_note($EVENT_NOTE+4,$EVENT_VELOCITY,0,-1)
play_note($EVENT_NOTE+7,$EVENT_VELOCITY,0,-1)
end on

play_note($EVENT_NOTE+4,$EVENT_VELOCITY,0,-1) = Dem Notenwert ($EVENT_NOTE) wird eine um 4 Halbtöne hörere Note hinzugefügt mit der gleichen Anschlagsgeschwindigkeit ($EVENT_VELOCITY)

Das kann man auch via if (...)...end if mit einem Schalter verbinden:

on note
if ($Schalter=1)

play_note($EVENT_NOTE+4,$EVENT_VELOCITY,0,-1)
play_note($EVENT_NOTE+7,$EVENT_VELOCITY,0,-1)
end if
end on

Und über den Drehknopf ($Drehknopf) und den Schieberegler ($Schieber) könnte man die zusätzlichen Noten einstellen:

on note
if ($Schalter=1)

play_note($EVENT_NOTE+$Drehknopf,$EVENT_VELOCITY,0,-1)
play_note($EVENT_NOTE+$Schieber,$EVENT_VELOCITY,0,-1)
end if
end on

Man kann das Script noch weiter abändern, indem man sagt, dass man gar nicht die original gespielte Note haben möchte, sondern nur noch die beiden zusätzlich generierten Noten, und diese auch noch auf den linken und rechten Kanal verteilt. Über ignore_event($EVENT_ID) wird die gespielte Note unterdrückt und mit change_pan(...) lässt sich die generierte Note im Stereofeld verteilen (vorausgesetzt $ton_ID1 und $ton_ID2 sind im Eingangsscript initialisiert):

on note
if ($Schalter=1)
ignore_event($EVENT_ID)
$ton_ID1 := play_note($EVENT_NOTE+$Drehknopf,$EVENT_VELOCITY,0,-1)
change_pan($ton_ID1,-1000,0)
$ton_ID2 := play_note($EVENT_NOTE+$Schieber,$EVENT_VELOCITY,0,-1)
change_pan($ton_ID2,1000,0)
end if
$ton_ID1 := 0
$ton_ID2 := 0
end on

Als on-note-Script bietet sich so z.B. an:
(Script aus dem Kontakt-SängerInnen-Bausatz)

{########Beim Druck einer Taste#######}
on note
message($EVENT_NOTE){MIDI-Noten-Nummer ausgeben}
disallow_group($ALL_GROUPS){alle Gruppen muten}

if ($EVENT_NOTE=24){wenn MIDI-Note = 24, Kontra-C Key fuer Saengerin}
set_control_par_str($ID_schalter, $CONTROL_PAR_TEXT, "Saengerin"){Schalter in Saengerin umbenennen}
$Schalter:=0 {Schalterwert auf 0 setzen}
end if

if ($EVENT_NOTE=26){wenn MIDI-Note = 26, Kontra-D Key fuer Saenger}
set_control_par_str($ID_schalter, $CONTROL_PAR_TEXT, "Saenger"){Schalter in Saenger umbenennen}
$Schalter:=1{Schalterwert auf 1 setzen}
end if

if($Schalter=0) {Wenn Schalter =0}
$s2 :=1 {Bild der Saengerin wird auf aktiv gesetzt}
$zufall:=random(0,4){Zufallszahl zwischen 0 und 4 wird gewaehlt}
allow_group($zufall){Gruppe mit Zufallszahl wird aktiviert = eine aus den ersten fünf Gruppen wird angesprochen: f_a/e/i/o/u}
end if

if($Schalter=1){Wenn Schalter =1}
$s1 :=1 {Bild des Saengers wird auf aktiv gesetzt}
$zufall:=random(5,9){Zufallszahl zwischen 5 und 9 wird gewaehlt}
allow_group($zufall){Gruppe mit Zufallszahl wird aktiviert = eine aus den zweiten fünf Gruppen wird angesprochen: m_a/e/i/o/u}
end if

if ($Drehknopf>1){wenn Drehknopf hoeher ist als 1}
play_note($EVENT_NOTE+$Drehknopf,$EVENT_VELOCITY,0,-1){eine zusaetzliche Note in gleicher Dynamik(Velocity) und in dem vom Drehknopf festgelegten Intervall wird gespielt}
end if
end on

 

5.3 on release

on release […] end on:
Callback wird aufgerufen, wenn eine MIDI-Note beendet wird: z.B. gut für typische Instrumentengeräusche, Nachhall oder Pitch-Veränderungen. Man könnte hier z.B. beginnen, eine leiser werdende chromatische Skala aufwärts spielen zu lassen (mit wait(...) kann man die Abstände zwischen den Noten einstellen). Dies klappt am besten via while (...)... end while (wenn vorher in der Initialisierung eine Variable $zaehler zum Mitzählen deklariert wurde; am Ende der Schleife muss $zaehler jedoch wieder auf 0 gesetzt werden):

on release
if ($Schalter=0)
while ($zaehler<11)
play_note($EVENT_NOTE+$zaehler,$EVENT_VELOCITY,0,-1)
$zaehler:=$zaehler+1
wait(200000)
end while
end if
$zaehler:=0
end on

Als on-release-Script bietet sich so z.B. an:
(Script aus dem Kontakt-SängerInnen-Bausatz)

{########Beim Loslassen einer Taste#######}
on release
$s1 :=0 {Bild von Saenger wird deaktiviert}
$s2 :=0 {Bild von Saengerin wird deaktiviert}
end on

 

5.4 on controller

on controller […] end on:
Callback wird aufgerufen, wenn ein Controller bewegt wird (z.b. Modulationsrad, pitch bend etc..). Um den Wert eines bestimmten Controllers zu erhalten, verwendet man die Variable $CC_NUM. Um einen bestimmten Controller anzusprechen verwendet man das Array %CC.

1 = Mod wheel
2 = Breath Contoller
5 = Portamento Time
7 = Main Volume
64 = Damper Pedal (Sustain)
66 = Sustain-Pedal (Sostenuto)
121 = Controller reset
123 = all notes off

Um also das Modulationsrad anzusprechen schreibt man

on controller
if ($CC_NUM = 1 )
message ( "ModWheel-Wert: " & %CC[l] )
end if
end on

Um mit dem Modulationsrad z.B. den Drehknopf zu bewegen schreibt man z.B.:
(Script aus dem Kontakt-SängerInnen-Bausatz)

{########Beim Bewegen eines Controllers#######}
on controller
if ($CC_NUM = 1){Wenn MIDI-Controller 1 = Modulationsrad betaetigt wird}
message(%CC[$CC_NUM]){gebe den Wert des Controllers aus, hier: 0-127}
$Drehknopf := %CC[1]/10 {teile den Wert des Modulationsrads durch 10, um ihn auf 12 gleiche Schritte entsprechend der Drehknopf-Skalierung zu skalieren. um den Drehknopf in einem Wertebereich von -12 bis +12 anzusprechen, müsste mann die 127 Werte des Modulationsrads durch fünf teilen und das Ergebnis (also ca. 0-24) von 12 abziehen: $Drehknopf := 12-(%CC[1]/5)}
end if
end on

 

5.5 on ui_control und on ui_update

on ui_control(<variable>) […] end on:
Callback wird aufgerufen, wenn ein Element des User-Interfaces bewegt wird. Z.B. können die Werte des Schalters, oder des Drehknopfs direkt in der Statusleiste wiedergegeben werden:

on ui_control($Schalter)
message($Schalter)
end on

on ui_control($Drehknopf)
message($Drehknopf)
end on

Über set_engine_par(...) lassen sich die verschiedenen Effekte mit samt ihren Parametern via Drehknöpfen und Schaltern setzen und über get_engine_par(...) lassen sich die Effekte mit ihren Parametern holen.

Dafür müssen zunächst jedoch im Group-Editor überhaupt Effekte hinzugefügt werden:
Hierfür gibt es pro Gruppe eine Reihe von Slots, die mit Effekten befüllt werden können, die Zählung dieser Reihe beginnt bei 0, das Tiefpassfilter in diesem Beispiel liegt also im Slot 0 und ist der ersten Guppe (wird ebenfalls als 0 gezählt) zugeordnet. Ein weiterer Parameter gibt an, ob der Effekt als Insert (-1) oder als Send (0) eingesetzt werden soll. So ist also die Schreibweise für
set_engine_par(...):

set_engine_par($zu_ändernder_Effekt,$Wert,$Gruppe,$Slot,$Einsatz)

 


Group-Editor mit aktiviertem Tiefpass-Filter (SV LP1) im ersten Slot

Für eine Filterveränderung über 5 Gruppen würde man dann schreiben:

on ui_control($Filter)
message($Filter)
set_engine_par($ENGINE_PAR_CUTOFF,$Filter,0,0,- 1)
set_engine_par($ENGINE_PAR_CUTOFF,$Filter,0,1,- 1)
set_engine_par($ENGINE_PAR_CUTOFF,$Filter,0,2,- 1)
set_engine_par($ENGINE_PAR_CUTOFF,$Filter,0,3,- 1)
set_engine_par($ENGINE_PAR_CUTOFF,$Filter,0,4,- 1)
end on

Um mit einem Schalter vom graphischen User Interface (ui_ ...) einen Tastendruck und damit einen Keyswitch auszulösen (um zwischen verschiedenen Gruppen zu wechseln) würde sich z.B. folgendes Script anbieten:
(Script aus dem Kontakt-SängerInnen-Bausatz)

{########Beim Bewegen eines Schalters oder Drehknopfs#######}
on ui_control($Schalter)

if ($Schalter=0){Wenn der Schalter auf 0 ist}
set_control_par_str($ID_schalter, $CONTROL_PAR_TEXT, "Saengerin"){Schalter-Beschriftung in "Saengerin" umbenennen}
play_note(24,1,0,-1){Note 24 = Key fuer Saengerin wird gespielt}
end if

if ($Schalter=1){Wenn der Schalter auf 1 ist}
set_control_par_str($ID_schalter, $CONTROL_PAR_TEXT, "Saenger"){Schalter-Beschriftung in "Saenger" umbenennen}
play_note(26,1,0,-1){Note 26 = Key fuer Saenger wird gespielt}
end if

end on

 

 

5.5.1 eigene animierte Grafiken hinzufügen

Eigene Grafik in den verschiedenen Zuständen erstellen und diese horizontal oder vertikal in einem einzigen Bild nebeneinander aufgereiht im Ordner "[...]/Resources/pictures" abspeichern (*.tga oder *png), z.B. saenger.png und saengerin.png (Grafiken aus dem Kontakt-SängerInnen-Bausatz) :

Dazu ein gleichnamiges Textfile (hier also saenger.txt oder saengerin.txt) im gleichen Ordner abspeichern mit der Angabe, wie viele Animationsschritte etc im Bild enthalten sind:

Has Alpha Channel: yes
Number of Animations: 2
Horizontal Animation: no
Vertical Resizable: no
Horizontal Resizable: no
Fixed Top: 0
Fixed Bottom: 0
Fixed Left: 0
Fixed Right: 0

Im Script bei der Initialisierung einen Schieberegler (ui_slider(...) ) deklarieren und diesem über set_control_par_str(...) und $CONTROL_PAR_PICTURE das Bild zuweisen (über get_ui_id(...) erhält man die interne id des Schiebereglers). Über move_control_px(...) das Bild auf seine Position setzen und mit Hilfe von $CONTROL_PAR_PICTURE_STATE den Ausgangszustand des Bildes bestimmen sowie über $CONTROL_PAR_MOUSE_BEHAVIOUR die Reaktion auf die Maus abschalten:
(Ausschnitt aus dem Initialisierungsscript (s.o.)
aus dem Kontakt-SängerInnen-Bausatz))

{########Initialisierung#######}
on init
declare ui_slider $s1(0,1){Slider deklarieren, um mit Bild zu belegen: min, max}
set_control_par_str(get_ui_id($s1), $CONTROL_PAR_PICTURE, "saenger"){Bild Saenger auf den Slider legen}
move_control_px($s1, 530,0){Slider positionieren}
set_control_par(get_ui_id($s1), $CONTROL_PAR_MOUSE_BEHAVIOUR, 0){Slider fuer Mausbewegung deaktivieren}
set_control_par(get_ui_id($s1), $CONTROL_PAR_PICTURE_STATE, 0){Ausgangsbild des Sliders festlegen}

declare ui_slider $s2(0,1){Slider deklarieren, um mit Bild zu belegen: min, max}
set_control_par_str(get_ui_id($s2), $CONTROL_PAR_PICTURE, "saengerin"){Bild Saengerin auf den Slider legen}
move_control_px($s2, 0,0){Slider positionieren}
set_control_par(get_ui_id($s2), $CONTROL_PAR_MOUSE_BEHAVIOUR, 0){Slider fuer Mausbewegung deaktivieren}
set_control_par(get_ui_id($s2), $CONTROL_PAR_PICTURE_STATE, 0){Ausgangsbild des Sliders festlegen}
declare $zufall {Variable Zufall deklarieren}
end on

Über die dem Slider zugewiesene Variable (hier z.B. $1 und $s2 ) kann man dann (z.B. über einen Tastendruck oder ein Modulationsrad oder in Abhängigkeit von anderen Variablen) den Zustand des Bildes auf eine beliebige Position setzen, indem man einfach der Variablen eine Zahl zuweist, die dem jeweiligen Bild entspricht, z.B. (Ausschnitt aus dem Initialisierungsscript (s.o.) aus dem Kontakt-SängerInnen-Bausatz)) :

{########Beim Druck einer Taste#######}

on note
if($Schalter=0) {Wenn Schalter =0}
$s2 :=1 {Bild der Saengerin wird auf aktiv gesetzt}
end if
if($Schalter=1){Wenn Schalter =1}
$s1 :=1 {Bild des Saengers wird auf aktiv gesetzt}
end if
end on

{########Beim Loslassen einer Taste#######}
on release
$s1 :=0 {Bild von Saenger wird deaktiviert}
$s2 :=0 {Bild von Saengerin wird deaktiviert}
end on