{ Nils Liberg's articulation switching script, version 0.2 This is a Kontakt2 script that automatically switches between different articulations (playing styles) of an instrument based on how fast you play. For usage instructions see: http://nilsliberg.se/ksp/scripts/scripts.html See my web page about K2 scripting tools: http://nilsliberg.se/ksp/ } on init declare const $TIMEBASE_TEMPO_BPM := 0 declare const $TIMEBASE_100BPM := 1 declare const $TIMEBASE_CC := 2 declare const $KS_BELOW := 1 declare const $KS_ABOVE := 2 declare const $PERIOD_AT_100BPM := 600000 declare ui_knob $speed1(1,500,1) declare ui_knob $speed2(1,500,1) declare ui_knob $speed3(1,500,1) declare ui_knob $speed4(1,1000,1) declare ui_value_edit $keysw1(0, 127, 1) declare ui_value_edit $keysw2(0, 127, 1) declare ui_value_edit $keysw3(0, 127, 1) declare ui_value_edit $keysw4(0, 127, 1) declare ui_button $mute1 declare ui_button $mute2 declare ui_button $mute3 declare ui_button $mute4 declare ui_button $is_playing1 declare ui_button $is_playing2 declare ui_button $is_playing3 declare ui_button $is_playing4 declare ui_button $learn_ks1 declare ui_button $learn_ks2 declare ui_button $learn_ks3 declare ui_button $learn_ks4 declare ui_button $learn_ks_limit declare ui_value_edit $CC(0, 127, 1) declare ui_value_edit $lock_CC(-1, 127, 1) declare ui_menu $ks_limit_menu declare ui_value_edit $ks_limit(0,127,1) declare ui_label $time_base_label(2,1) declare ui_menu $time_base declare $last_time declare $last_was_keyswitch { if last note was manual key switch } declare $interval declare $speed declare $keyswitch $last_time := $ENGINE_UPTIME $keysw4 := 24 $keysw3 := 25 $keysw2 := 26 $keysw1 := 27 $ks_limit := 32 $speed4 := 450 $speed3 := 200 $speed2 := 120 $speed1 := 80 $last_was_keyswitch := 0 $CC := 1 $lock_CC := -1 add_menu_item($ks_limit_menu, "KS keys below:", $KS_BELOW) add_menu_item($ks_limit_menu, "KS keys above:", $KS_ABOVE) $ks_limit_menu := 1 set_text($time_base_label, " Time base (100% speed=):") add_menu_item($time_base, "Tempo BPM", $TIMEBASE_TEMPO_BPM) add_menu_item($time_base, "100 BPM", $TIMEBASE_100BPM) add_menu_item($time_base, "CC at max", $TIMEBASE_CC) move_control($keysw1,1,3) move_control($keysw2,2,3) move_control($keysw3,3,3) move_control($keysw4,4,3) move_control($speed1,1,1) move_control($speed2,2,1) move_control($speed3,3,1) move_control($speed4,4,1) move_control($mute1,1,5) move_control($mute2,2,5) move_control($mute3,3,5) move_control($mute4,4,5) move_control($is_playing1,1,6) move_control($is_playing2,2,6) move_control($is_playing3,3,6) move_control($is_playing4,4,6) move_control($learn_ks1,1,4) move_control($learn_ks2,2,4) move_control($learn_ks3,3,4) move_control($learn_ks4,4,4) move_control($time_base,6,2) move_control($ks_limit_menu,6,3) move_control($ks_limit,6,4) move_control($learn_ks_limit,6,5) move_control($CC,6,6) move_control($lock_CC,5,6) make_persistent($keysw1) make_persistent($keysw2) make_persistent($keysw3) make_persistent($keysw4) make_persistent($speed1) make_persistent($speed2) make_persistent($speed3) make_persistent($speed4) make_persistent($mute1) make_persistent($mute2) make_persistent($mute3) make_persistent($mute4) make_persistent($learn_ks1) make_persistent($learn_ks2) make_persistent($learn_ks3) make_persistent($learn_ks4) make_persistent($time_base) make_persistent($ks_limit_menu) make_persistent($ks_limit) make_persistent($CC) make_persistent($lock_CC) SET_CONDITION(NO_SYS_SCRIPT_PEDAL) $is_playing1 := 1 end on on note { if in key switch learning mode, learn the key and exit } if ($learn_ks1 = 1) $keysw1 := $EVENT_NOTE $learn_ks1 := 0 exit end if if ($learn_ks2 = 1) $keysw2 := $EVENT_NOTE $learn_ks2 := 0 exit end if if ($learn_ks3 = 1) $keysw3 := $EVENT_NOTE $learn_ks3 := 0 exit end if if ($learn_ks4 = 1) $keysw4 := $EVENT_NOTE $learn_ks4 := 0 exit end if if ($learn_ks_limit = 1) $ks_limit := $EVENT_NOTE $learn_ks_limit := 0 exit end if { if key switch, remember this and exit } if ($ks_limit_menu = $KS_BELOW and $EVENT_NOTE <= $ks_limit or ... $ks_limit_menu = $KS_ABOVE and $EVENT_NOTE >= $ks_limit) $last_was_keyswitch := 1 exit end if { determine speed } $interval := $ENGINE_UPTIME - $last_time select ($time_base) case $TIMEBASE_TEMPO_BPM $speed := $DURATION_QUARTER * 100 / ($interval * 1000) case $TIMEBASE_100BPM $speed := $PERIOD_AT_100BPM * 100 / ($interval * 1000) case $TIMEBASE_CC $speed := %CC[$CC] * 100 / 127 end select message("speed: " & $speed) { only do special handling if the note speed isn't too fast which would indicate polyphonic playing } if ($speed < $speed4 or $time_base = $TIMEBASE_CC) $last_time := $ENGINE_UPTIME if ($last_was_keyswitch = 1) $last_was_keyswitch := 0 exit end if ignore_event($EVENT_ID) { select which keyswitch to use and highlight the corresponding is_playing button } $is_playing1 := 0 $is_playing2 := 0 $is_playing3 := 0 $is_playing4 := 0 if ($speed >= $speed3) if ($mute4 = 1) exit end if $keyswitch := $keysw4 $is_playing4 := 1 else if ($speed >= $speed2) if ($mute3 = 1) exit end if $keyswitch := $keysw3 $is_playing3 := 1 else if ($speed >= $speed1) if ($mute2 = 1) exit end if $keyswitch := $keysw2 $is_playing2 := 1 else if ($mute1 = 1) exit end if $keyswitch := $keysw1 $is_playing1 := 1 end if end if end if if ($lock_CC = -1 or %CC[$lock_CC] < 64) play_note($keyswitch, 100, 0, -1) end if play_note($EVENT_NOTE, $EVENT_VELOCITY, 0, -1) end if end on