Synth Collection Arpeggiator Author: Native Instruments Written by: Josef Natterer, Nicki Marinic Modified: September 11, 2009 *************************************************} on init set_script_title("Arpeggiator") set_ui_height(5) message("") {PGS STUFF FOR K4} _pgs_create_key(ARP_ON_OFF,1) {END PGS STUFF FOR K4} declare const $REC_TIME := 30 declare const $LATCH_TIME := 300 declare const $LATCH_TIME_TRANS := 1000 declare $repeat := 1 {if up/down: 1 = No Repeat, 2 = Repeat top, 3 = Repeat bottom, 5 = Repea t both} declare $latch_mode make_persistent($latch_mode) $latch_mode := 1 declare $Str_Vel := 100 declare $count := 0 declare !note_class[12] !note_class[0] := "C" !note_class[1] := "Db" !note_class[2] := "D" !note_class[3] := "Eb" !note_class[4] := "E" !note_class[5] := "F" !note_class[6] := "Gb" !note_class[7] := "G" !note_class[8] := "Ab" !note_class[9] := "A" !note_class[10] := "Bb" !note_class[11] := "B" declare !note_names [128] $count := 0 while ($count < 128) !note_names[$count] := !note_class[$count mod 12] & (($count/12) -2) inc ($count) end while declare ui_knob $Latch_knob (0,3,1) make_persistent($latch_knob) set_text($Latch_knob,"Mode") $latch_knob := 1 _read_persistent_var($latch_mode) if(_pgs_key_exists(ARP_ON_OFF)) $Latch_knob := _pgs_get_key_val(ARP_ON_OFF,0) $latch_mode := $latch_knob end if select ($latch_mode) case 0 set_knob_label($latch_knob,"Off") case 1 set_knob_label($latch_knob,"On") case 2 set_knob_label($latch_knob,"Hold") case 3 set_knob_label($latch_knob,"Hold +-") end select declare ui_knob $Dur (1, 200, 1) set_text($Dur,"Duration") set_knob_unit($Dur,$KNOB_UNIT_PERCENT) set_knob_defval($Dur,100) make_persistent($Dur) $Dur := 100 declare ui_knob $Strike (1, 5, 1) make_persistent($Strike) $Strike := 1 declare ui_value_edit $Steps (2,32, 1) make_persistent($Steps) $Steps := 16 _read_persistent_var($steps) declare ui_table %rhythm[32] (2,2,100) make_persistent(%rhythm) declare ui_knob $Swing (-50,50,1) make_persistent($Swing) set_knob_unit($Swing,$KNOB_UNIT_PERCENT) $Swing := 0 set_knob_defval($Swing,0) declare ui_knob $Octave (-6,6,1) make_persistent($Octave) $Octave := 0 set_knob_defval($Octave,0) declare ui_menu $note_order add_menu_item ($note_order,"Select Note Order",99) add_menu_item ($note_order, "--------------",99) add_menu_item ($note_order, "As Played",1) add_menu_item ($note_order, "--------------",99) add_menu_item ($note_order, "Up",2) add_menu_item ($note_order, "Down",3) add_menu_item ($note_order, "Up & Down",4) add_menu_item ($note_order, "Down & Up",5) add_menu_item ($note_order, "--------------",99) add_menu_item ($note_order, "Zig-Zag Up",6) add_menu_item ($note_order, "Zig-Zag Down",7) add_menu_item ($note_order, "Zig-Zag Up-Dn",8) add_menu_item ($note_order, "Zig-Zag Dn-Up",9) add_menu_item ($note_order, "--------------",99) add_menu_item ($note_order, "Move in", 10) add_menu_item ($note_order, "Move out",11) add_menu_item ($note_order, "Move in & out",12) add_menu_item ($note_order, "Move out & in",13) add_menu_item ($note_order, "--------------",99) add_menu_item ($note_order, "Random",14) add_menu_item ($note_order, "Random (Urn)",15) add_menu_item ($note_order, "--------------",99) add_menu_item ($note_order, "All (Chord)",16) declare $last_note_order := 2 $note_order := 2 make_persistent($note_order) make_persistent($last_note_order) declare ui_switch $Velo_button set_control_par_str(get_ui_id($Velo_button),$CONTROL_PAR_TEXT,"Fix Veloc ity") make_persistent($Velo_button) declare ui_switch $midi_thru set_control_par_str(get_ui_id($midi_thru),$CONTROL_PAR_TEXT,"MIDI Thru") make_persistent($midi_thru) {**** from retrigger script*********} declare const $Tempo_knob_X := 4 declare const $Tempo_knob_Y := 3 declare @knob_name @knob_name := "Rate" declare !tempo_names[18] !tempo_names[0] := "1/128" !tempo_names[1] := "1/64" !tempo_names[2] := "1/32" !tempo_names[3] := "1/16 T" !tempo_names[4] := "3/64" !tempo_names[5] := "1/16" !tempo_names[6] := "1/8 T" !tempo_names[7] := "3/32" !tempo_names[8] := "1/8" !tempo_names[9] := "1/4 T" !tempo_names[10] := "3/16" !tempo_names[11] := "1/4" !tempo_names[12] := "1/2 T" !tempo_names[13] := "3/8" !tempo_names[14] := "1/2" !tempo_names[15] := "3/4" !tempo_names[16] := "4/4" !tempo_names[17] := "Bar" declare ui_knob $Rate_knob (0,1000000,1) set_text ($Rate_knob,"Rate") make_persistent ($Rate_knob) declare ui_knob $Sync_knob (0,17,1) set_text ($Sync_knob,@knob_name) $Sync_knob := 5 set_knob_defval ($Sync_knob,5) set_knob_label ($Sync_knob,!tempo_names[$Sync_knob]) make_persistent ($Sync_knob) declare $fill_buffer := 11 make_persistent($fill_buffer) {**** from retrigger script*********} declare %pressed_id[128] declare %note_buffer[512] declare %ordered[128] declare %velo[128] declare $cursor declare $old_latch_time declare $a declare $aa declare $sema declare $rand declare $bb declare $b declare $loop_cursor declare %loop_buffer[512] declare $id declare $check_id declare $min declare $min_note declare $max_note declare $helper declare %help_buffer[512] declare $step_length declare $strike_count declare $duration declare $note declare $velo declare $act_step declare $last_order declare $oct_cursor declare $swing_cursor declare const $PRESET_LENGTH := 43 declare ui_menu $edit_preset add_menu_item($edit_preset,"Select Preset...",100) add_menu_item($edit_preset,"--------------",99) declare %helper_preset[42] := (... 100,100,100,100,100,100,100,100,100,100,... 100,100,100,100,100,100,100,100,100,100,... 100,100,100,100,100,100,100,100,100,100,... 100,100,16,2,1,0,1,294118,100,0,0,250) declare %helper_rhythm[33] := (... 100,100,100,100,100,100,100,100,100,100,... 100,100,100,100,100,100,100,100,100,100,... 100,100,100,100,100,100,100,100,100,100,100,100,16) make_persistent(%helper_preset) declare %default_preset[42] := (... 100,100,100,100,100,100,100,100,100,100,... 100,100,100,100,100,100,100,100,100,100,... 100,100,100,100,100,100,100,100,100,100,... 100,100,16,2,1,0,1,294118,100,0,0,250) declare %preset_arr[12*42] make_persistent(%Preset_arr) $a := 0 while($a < 12*42) %preset_arr[$a] := %default_preset[$a mod 42] inc($a) end while $a := 0 set_table_steps_shown(%rhythm, $steps) _read_persistent_var($Sync_knob) set_knob_label ($Sync_knob,!tempo_names[$Sync_knob]) $Rate_knob := ($sync_knob *1000001) / 17 set_knob_defval ($Rate_knob,(5 *1000001) / 17) set_knob_label ($Rate_knob,!tempo_names[$sync_knob]) set_knob_unit($Rate_knob,$KNOB_UNIT_NONE) declare ui_label $note_order_label (1,1) set_text ($note_order_label,"Note Order:") set_control_par(get_ui_id($note_order_label),$CONTROL_PAR_TEXT_ALIGNMENT ,1) declare ui_label $Global_label (3,1) set_text ($Global_label,"Global Settings") set_control_par(get_ui_id($Global_label),$CONTROL_PAR_TEXT_ALIGNMENT,1) declare ui_label $Pitch_label (3,1) set_text ($Pitch_label,"Pitch") set_control_par(get_ui_id($Pitch_label),$CONTROL_PAR_TEXT_ALIGNMENT,1) declare ui_label $Timing_label (3,1) set_text ($Timing_label,"Timing") set_control_par(get_ui_id($Timing_label),$CONTROL_PAR_TEXT_ALIGNMENT,1) declare ui_label $Rhythm_label (3,1) set_text ($Rhythm_label,"Rhythm") set_control_par(get_ui_id($Rhythm_label),$CONTROL_PAR_TEXT_ALIGNMENT,1) move_control($Global_label,1,2) move_control($Pitch_label,4,2) move_control($Timing_label,1,7) move_control($Rhythm_label,4,7) move_control($note_order_label,4,3) move_control(%rhythm,5,8) move_control($swing,3,8) move_control($steps,4,8) move_control($Dur,2,8) move_control($note_order,4,4) move_control($strike,6,3) move_control($Octave,5,3) move_control($latch_knob,1,3) move_control($edit_preset,0,0) move_control($Velo_button,4,9) move_control($midi_thru,3,4) move_control($Rate_knob,1,8) move_control($Sync_knob,0,0) {******************** SET CONTROL HELP ********************************* *******} set_control_help($Latch_knob,"Arpeggiator Mode: Choose among three arpeg giator modes. <On> enables the normal arpeggiator mode. <Hold> will latch all pl ayed keys. <Hold+-> will latch all played keys and subsequently played keys will be added or taken away from the note buffer. <Off> turns the arpeggiator off.") set_control_help($Dur,"Duration: Sets the duration of the arpeggiated MI DI notes in percent. This will only hange the length o the MIDI notes, not the v olume envelope.") set_control_help($Strike,"Strike: Sets the number of strikes of each not e of the note buffer. When <Strike> is set to any other value other than 1, each note of the note buffer will be repeated by the amount specified with <Strike>. ") set_control_help(%rhythm,"Rhythm Grid: Sets the rhythmic pattern of the arpeggiated notes. The columns set the velocity of each note. If a column is set to 0 (e.g. by Cmd/Ctrl cliking on a table column), the step will not be played. The actual velocity depends on the <Fix Velocity> button, the length of the pat tern can be set with <Steps>.") set_control_help($Swing,"Swing: Offsets every other step by the specifie d amount in percent in order to create a swing feel. Positive values delay every other step, negative values push every other step forward.") set_control_help($Steps,"Steps: Sets the number of steps of the rhythmic pattern.") set_control_help($Octave,"Octave: Sets the octave displacement, i.e. the distribution of the arpeggio pattern in various octaves. The arpeggio pattern c ycles from the played octave to the octave set upwards.") set_control_help($note_order_label,"Note Order: Defines the pattern for the order in which notes are arpeggiated.") set_control_help($note_order,"Note Order: Defines the pattern for the or der in which notes are arpeggiated.") set_control_help($velo_button,"Fix Velocity: When enabled, played veloci ties are ignored and taken from the columns in the rhythmic grid. When deactivat ed, played velocities will be scaled by the columns of the rhythmic grid.") set_control_help($edit_preset,"Preset Menu: Selection of factory presets .") set_control_help($Global_label,"Global Settings: Adjust the arpeggiator' s global settings.") set_control_help($Pitch_label,"Pitch Settings: Adjust the arpeggiator's pitch settings, which determine the octaves and note repititions played.") set_control_help($Pitch_label,"Timing Settings: Adjust the arpeggiator's timing settings, which determine the rate and duration of the notes and the amo unt of swing.") set_control_help($Pitch_label,"Rhythm Settings: Adjust the arpeggiator's rhythm settings, which determine the velocities of the notes and the number of velocity steps played.") set_control_help($Sync_knob,"Rate (Sync): Adjust the tempo in rhythmical values, synced to the master clock. T stands for triplet.") set_control_help($midi_thru,"MIDI Thru: When activated, played notes wil l be merged with the arpeggiated notes.") set_control_help($Rate_Knob,"Rate: Sets the rate of the arpeggiator.") {******************** SET CONTROL HELP ********************************* *******} end on on note if ($latch_mode = 0) exit end if %velo[$EVENT_NOTE] := $EVENT_VELOCITY {only one event per Note} set_event_par($EVENT_ID,0,2) if ($midi_thru = 0) ignore_event($EVENT_ID) end if if (%pressed_id[$EVENT_NOTE] > 0) exit else %pressed_id[$EVENT_NOTE] := $EVENT_ID end if {which notes should be in the buffer} select ($latch_mode) case 1 %note_buffer[$cursor] := $EVENT_NOTE inc($cursor) case 2 if ($ENGINE_UPTIME - $old_latch_time > $LATCH_TIME) $a := 0 while($a < $cursor) %note_buffer[$a] := 0 inc($a) end while $cursor := 0 end if %note_buffer[$cursor] := $EVENT_NOTE inc($cursor) $old_latch_time := $ENGINE_UPTIME case 3 $a := 0 $b := $cursor $cursor := 0 while($a < $b) if ($EVENT_NOTE # %note_buffer[$a]) %note_buffer[$cursor] := %note_buffer[$a ] inc($cursor) end if inc($a) end while if ($b = $cursor) %note_buffer[$cursor] := $EVENT_NOTE inc($cursor) end if end select if ($cursor < 2 and $check_id = 0) $check_id := $EVENT_ID $aa := 0 $act_step := 0 $oct_cursor := 0 $last_order := -1 $swing_cursor := 0 wait($REC_TIME*1000) while($cursor > 0) $a := 0 while($a < 128) if ($a < $cursor) %ordered[$a] := %note_buffer[$a] else %ordered[$a] := 0 %note_buffer[$a] := 0 end if inc($a) end while $min_note := %ordered[$cursor-1] $max_note := %ordered[0] sort(%ordered,1) select ($note_order) case 1 $loop_cursor := $cursor $a := 0 while($a < $cursor) %loop_buffer[$a] := %note_buffer [$a] inc($a) end while case 2 {up } $loop_cursor := $cursor $a := 0 while($a < $cursor ) %loop_buffer[$a] := %ordered[$cu rsor - 1 - $a] inc($a) end while case 3 {down } $loop_cursor := $cursor $a := 0 while($a < $cursor ) %loop_buffer[$a] := %ordered[$a] inc($a) end while case 4 {up_down } $loop_cursor := $cursor $a := 0 while($a < $cursor ) %loop_buffer[$a] := %ordered[$cu rsor -1 - $a] inc($a) end while if ($cursor > 2) select ($repeat) case 1 $loop_cursor := ($cursor*2)-2 $a := 0 while($a < $curs or-2 ) %loop_bu ffer[$a+$cursor] := %ordered[$a+1] inc($a) end while case 2 $loop_cursor := ($cursor*2)-1 $a := 0 while($a < $curs or-1 ) %loop_bu ffer[$a+$cursor] := %ordered[$a] inc($a) end while case 3 $loop_cursor := ($cursor*2)-1 $a := 0 while($a < $curs or-1 ) %loop_bu ffer[$a+$cursor] := %ordered[$a+1] inc($a) end while case 5 $loop_cursor := ($cursor*2) $a := 0 while($a < $curs or ) %loop_bu ffer[$a+$cursor] := %ordered[$a] inc($a) end while end select end if case 5 {down_up } $loop_cursor := $cursor $a := 0 while($a < $cursor ) %loop_buffer[$a] := %ordered[$a] inc($a) end while if ($cursor > 2) select ($repeat) case 1 $loop_cursor := ($cursor*2)-2 $a := 0 while($a < $curs or-2 ) %loop_bu ffer[$a+$cursor] := %ordered[$cursor -2- $a] inc($a) end while case 3 $loop_cursor := ($cursor*2)-1 $a := 0 while($a < $curs or-1 ) %loop_bu ffer[$a+$cursor] := %ordered[$cursor -1 - $a] inc($a) end while case 2 $loop_cursor := ($cursor*2)-1 $a := 0 while($a < $curs or-1 ) %loop_bu ffer[$a+$cursor] := %ordered[$cursor -2- $a] inc($a) end while case 5 $loop_cursor := ($cursor*2) $a := 0 while($a < $curs or ) %loop_bu ffer[$a+$cursor] := %ordered[$cursor -1- $a] inc($a) end while end select end if case 6 {zickzack up} if ($cursor = 1) %loop_buffer[0] := $min_note $loop_cursor := 1 end if if ($cursor = 2) %loop_buffer[0] := $min_note %loop_buffer[1] := $max_note $loop_cursor := 2 end if if ($cursor = 3) %loop_buffer[0] := %ordered[2] %loop_buffer[1] := %ordered[0] %loop_buffer[2] := %ordered[1] $loop_cursor := 3 end if if ($cursor > 3) $a := 0 while($a < $cursor-2) %loop_buffer[($a*2)] := %ordered[$cursor-$a-1] %loop_buffer[($a*2)+1] : =%ordered[$cursor-$a-3] inc($a) end while $loop_cursor := (2*$cursor)-4 end if case 7 {zickzack_down } if ($cursor = 1) %loop_buffer[0] := $min_note $loop_cursor := 1 end if if ($cursor = 2) %loop_buffer[0] := $max_note %loop_buffer[1] := $min_note $loop_cursor := 2 end if if ($cursor = 3) %loop_buffer[0] := %ordered[0] %loop_buffer[1] := %ordered[2] %loop_buffer[2] := %ordered[1] $loop_cursor := 3 end if if ($cursor > 3) $a := 0 while($a < $cursor-2) %loop_buffer[($a*2)] := %ordered[$a] %loop_buffer[($a*2)+1] : =%ordered[$a+2] inc($a) end while $loop_cursor := (2*$cursor)-4 end if case 8 {zickzack updn} if ($cursor = 1) %loop_buffer[0] := $min_note $loop_cursor := 1 end if if ($cursor = 2) %loop_buffer[0] := $min_note %loop_buffer[1] := $max_note $loop_cursor := 2 end if if ($cursor = 3) select($repeat) case 1 %loop_buffer[0] := %ordered[2] %loop_buffer[1] := %ordered[0] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[0] $loop_cursor := 4 case 3 %loop_buffer[0] := %ordered[2] %loop_buffer[1] := %ordered[0] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[1] %loop_buffer[4] := %ordered[0] $loop_cursor := 5 case 2 %loop_buffer[0] := %ordered[2] %loop_buffer[1] := %ordered[0] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[0] %loop_buffer[4] := %ordered[2] $loop_cursor := 5 case 5 %loop_buffer[0] := %ordered[2] %loop_buffer[1] := %ordered[0] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[1] %loop_buffer[4] := %ordered[0] %loop_buffer[5] := %ordered[2] $loop_cursor := 6 end select end if if ($cursor > 3) select ($repeat) case 1 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$cursor-$a-1] %loop_bu ffer[($a*2)+1] :=%ordered[$cursor-$a-3] inc($a) end while $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)] := %ordered[$a+2] %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] :=%ordered[$a+1] inc($a) end while $loop_cursor := (4*$cursor)-10 case 2 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$cursor-$a-1] %loop_bu ffer[($a*2)+1] :=%ordered[$cursor-$a-3] inc($a) end while %loop_buffer[($c ursor-2)*2] :=%ordered[0] $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] := %ordered[$a+2] %loop_bu ffer[($a*2)+(($cursor-2)*2)+2] :=%ordered[$a+1] inc($a) end while $loop_cursor := (4*$cursor)-9 case 3 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$cursor-$a-1] %loop_bu ffer[($a*2)+1] :=%ordered[$cursor-$a-3] inc($a) end while $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)] := %ordered[$a+2] %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] :=%ordered[$a+1] inc($a) end while %loop_buffer[(4* $cursor)-9-1] :=%ordered[$cursor-1] $loop_cursor := (4*$cursor)-9 case 5 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$cursor-$a-1] %loop_bu ffer[($a*2)+1] :=%ordered[$cursor-$a-3] inc($a) end while %loop_buffer[($c ursor-2)*2] :=%ordered[0] $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] := %ordered[$a+2] %loop_bu ffer[($a*2)+(($cursor-2)*2)+2] :=%ordered[$a+1] inc($a) end while %loop_buffer[(4* $cursor)-8-1] :=%ordered[$cursor-1] $loop_cursor := (4*$cursor)-8 end select end if case 9 if ($cursor = 1) %loop_buffer[0] := $min_note $loop_cursor := 1 end if if ($cursor = 2) %loop_buffer[0] := $max_note %loop_buffer[1] := $min_note $loop_cursor := 2 end if if ($cursor = 3) select($repeat) case 1 %loop_buffer[0] := %ordered[0] %loop_buffer[1] := %ordered[2] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[2] $loop_cursor := 4 case 3 %loop_buffer[0] := %ordered[0] %loop_buffer[1] := %ordered[2] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[1] %loop_buffer[4] := %ordered[2] $loop_cursor := 5 case 2 %loop_buffer[0] := %ordered[0] %loop_buffer[1] := %ordered[2] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[2] %loop_buffer[4] := %ordered[0] $loop_cursor := 5 case 5 %loop_buffer[0] := %ordered[0] %loop_buffer[1] := %ordered[2] %loop_buffer[2] := %ordered[1] %loop_buffer[3] := %ordered[1] %loop_buffer[4] := %ordered[2] %loop_buffer[5] := %ordered[0] $loop_cursor := 6 end select end if if ($cursor > 3) select ($repeat) case 1 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$a] %loop_bu ffer[($a*2)+1] :=%ordered[$a+2] inc($a) end while $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)] := %ordered[$cursor-$a-3] %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] :=%ordered[$cursor-$a-2] inc($a) end while $loop_cursor := (4*$cursor)-10 case 3 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$a] %loop_bu ffer[($a*2)+1] :=%ordered[$a+2] inc($a) end while %loop_buffer[($c ursor-2)*2] :=%ordered[$cursor-1] $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] := %ordered[$cursor - $a-3] %loop_bu ffer[($a*2)+(($cursor-2)*2)+2] :=%ordered[$cursor - $a-2] inc($a) end while $loop_cursor := (4*$cursor)-9 case 2 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$a] %loop_bu ffer[($a*2)+1] :=%ordered[$a+2] inc($a) end while $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)] := %ordered[$cursor-$a-3] %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] :=%ordered[$cursor-$a-2] inc($a) end while %loop_buffer[(4* $cursor)-9-1] :=%ordered[0] $loop_cursor := (4*$cursor)-9 case 5 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a*2)] := %ordered[$a] %loop_bu ffer[($a*2)+1] :=%ordered[$a+2] inc($a) end while %loop_buffer[($c ursor-2)*2] :=%ordered[$cursor-1] $a := 0 while($a < $curs or-3) %loop_bu ffer[($a*2)+(($cursor-2)*2)+1] := %ordered[$cursor - $a-3] %loop_bu ffer[($a*2)+(($cursor-2)*2)+2] :=%ordered[$cursor - $a-2] inc($a) end while %loop_buffer[(4* $cursor)-8-1] :=%ordered[0] $loop_cursor := (4*$cursor)-8 end select end if case 10 to 13 $loop_cursor := $cursor $a := 0 while(($a*2) < $cursor) %loop_buffer[($a*2)] := %ordered [$cursor -1 -$a] %loop_buffer[($a*2)+1] := %order ed[$a] inc($a) end while $loop_cursor := $cursor if ($note_order = 11 or $note_order = 13 ) $a := 0 while($a < $loop_cursor) %help_buffer[$loop_curso r - $a-1] := %loop_buffer[$a] inc($a) end while $a := 0 while($a < $loop_cursor) %loop_buffer[$a] := %hel p_buffer[$a] inc($a) end while end if if (($note_order = 12 or $note_order = 1 3) and $cursor > 2) select ($repeat) case 1 $a := 0 while($a < $curs or-2) %loop_bu ffer[($a)+($cursor)] := %loop_buffer[$cursor-2-$a] inc($a) end while $loop_cursor := $cursor*2 - 2 case 2 if ($note_order = 12) $a := 0 while($a < $cursor-1) %loop_buffer[($a)+($cursor)] := %loop_buffer[$cursor-1-$a] inc($a) end whil e $loop_cu rsor := $cursor*2 - 1 else $a := 0 while($a < $cursor-1) %loop_buffer[($a)+($cursor)] := %loop_buffer[$cursor-2-$a] inc($a) end whil e $loop_cu rsor := $cursor*2 - 1 end if case 3 if ($note_order = 13) $a := 0 while($a < $cursor-1) %loop_buffer[($a)+($cursor)] := %loop_buffer[$cursor-1-$a] inc($a) end whil e $loop_cu rsor := $cursor*2 - 1 else $a := 0 while($a < $cursor-1) %loop_buffer[($a)+($cursor)] := %loop_buffer[$cursor-2-$a] inc($a) end whil e $loop_cu rsor := $cursor*2 - 1 end if case 5 $a := 0 while($a < $curs or) %loop_bu ffer[($a)+($cursor)] := %loop_buffer[$cursor-1-$a] inc($a) end while $loop_cursor := $cursor*2 end select end if case 14 $loop_cursor := 1 %loop_buffer[$aa+1] := %ordered[random(0 ,$cursor-1)] %loop_buffer[0] := %ordered[random(0,$cu rsor-1)] case 15 if ($aa < 2 or $last_order # $note_order ) $loop_cursor := $cursor $a := 0 while($a < $cursor) %help_buffer[$a] := %ord ered[$a] inc($a) end while $helper := $cursor $a := 0 while ($a < $cursor) %loop_buffer[$a] := %hel p_buffer[random(0,$helper-1)] $bb := 0 while($bb < $helper) if (%help_buffer [$bb] = %loop_buffer[$a]) while($b b < $helper) %help_buffer[$bb] := %help_buffer[$bb+1] inc($bb) end whil e $bb := $ helper+1 dec($hel per) end if inc($bb) end while inc($a) end while end if case 16 $loop_cursor := $cursor $a := 0 while($a < $cursor ) %loop_buffer[$a] := %note_buffer [$a] inc($a) end while end select $last_order := $note_order select ($Sync_knob) case 0 $step_length := $DURATIO N_SIXTEENTH/8 case 1 $step_length := $DURATIO N_SIXTEENTH/4 case 2 $step_length := $DURATIO N_SIXTEENTH/2 case 3 $step_length := $DURATIO N_QUARTER/6 case 4 $step_length := ($DURATI ON_SIXTEENTH/4)*3 case 5 $step_length := $DURATIO N_SIXTEENTH case 6 $step_length := $DURATIO N_QUARTER/3 case 7 $step_length := ($DURATI ON_SIXTEENTH/2)*3 case 8 $step_length := $DURATIO N_EIGHTH case 9 $step_length := ($DURATI ON_QUARTER*2)/3 case 10 $step_length := $DURATIO N_SIXTEENTH*3 case 11 $step_length := $DURATIO N_QUARTER case 12 $step_length := ($DURATI ON_QUARTER*4)/3 case 13 $step_length := $DURATIO N_EIGHTH*3 case 14 $step_length := $DURATIO N_QUARTER*2 case 15 $step_length := $DURATIO N_QUARTER*3 case 16 $step_length := $DURATIO N_QUARTER*4 case 17 $step_length := $DURATIO N_BAR end select if ($swing_cursor mod 2 = 0) $step_length := $step_length + ($step_length*$Sw ing)/100 else $step_length := $step_length + ($step_length*(-$ Swing))/100 end if inc($swing_cursor) $duration := ($step_length/100)*$dur if ($duration < 10000) $duration := 10000 end if if ($step_length < 5000) $step_length := 5000 end if $velo := 100 if (%rhythm[$act_step] # 0) if ($loop_cursor # 0) if ($note_order = 16) $a := 0 while($a < $loop_cursor) $note := %loop_buffer[$a ] + $oct_cursor*12 $velo := %velo[%loop_buf fer[$a]] if ($strike_count > 0) $velo := ($velo * $Str_vel)/100 end if if ($velo_button = 1) $velo := 127 end if $velo := ($velo * %rhyth m[$act_step])/100 if ($velo > 127) $velo := 127 end if if ($velo < 1) $velo := 1 end if if ($note > 0 and $note < 128) play_note($note, $velo,0,$duration) end if inc($a) end while if ($strike_count >= $strike-1) $aa := $loop_cursor end if else $note := %loop_buffer[$aa] + $oc t_cursor*12 $velo := %velo[%loop_buffer[$aa] ] if ($strike_count > 0) $velo := ($velo * $Str_v el)/100 end if if ($velo_button = 1) $velo := 127 end if $velo := ($velo * %rhythm[$act_s tep])/100 if ($velo > 127) $velo := 127 end if if ($velo < 1) $velo := 1 end if if ($note > 0 and $note < 128) play_note($note,$velo,0, $duration) end if end if end if if ($strike_count < $strike-1) dec($aa) dec($act_step) inc($strike_count) else $strike_count := 0 end if else if ($strike_count < $strike-1) dec($act_step) inc($strike_count) else $strike_count := 0 end if dec($aa) end if inc($aa) if ($aa >= $loop_cursor) $aa := 0 if ($octave > 0 ) inc($oct_cursor) if ($oct_cursor > $Octave) $oct_cursor := 0 end if end if if ($octave < 0 ) dec($oct_cursor) if ($oct_cursor < $Octave) $oct_cursor := 0 end if end if end if inc($act_step) if ($act_step >= $steps) $act_step := 0 end if wait($step_length) end while $check_id := 0 end if end on on release {only one event per Note} if (%EVENT_PAR[0] = 2) {ignore_event($EVENT_ID)} if (%pressed_id[$EVENT_NOTE] = 0) exit else %pressed_id[$EVENT_NOTE] := 0 end if else exit end if if ($latch_mode = 0) exit end if {which notes should be in the buffer} select ($latch_mode) case 1 $a := 0 $b := $cursor $cursor := 0 while($a < $b) if ($EVENT_NOTE # %note_buffer[$a]) %note_buffer[$cursor] := %note_buffer[$a ] inc($cursor) end if inc($a) end while case 2 to 3 exit end select end on on ui_control ($latch_knob) $latch_mode := $latch_knob select ($latch_mode) case 0 set_knob_label($latch_knob,"Off") $a := 0 while($a < $cursor) %note_buffer[$a] := 0 inc($a) end while $cursor := 0 case 1 set_knob_label($latch_knob,"On") $b := $cursor $cursor := 0 $a := 0 while($a < $b) if (%pressed_id[%note_buffer[$a]] > 0) %note_buffer[$cursor] := %note_buffer[$a ] inc($cursor) end if inc($a) end while case 2 set_knob_label($latch_knob,"Hold") case 3 set_knob_label($latch_knob,"Hold +-") end select end on on ui_control ($Sync_knob) set_knob_label ($Sync_knob,!tempo_names[$Sync_knob]) end on on ui_control($edit_Preset) if ($edit_Preset < 99) {select($edit_Preset) case 1 $a := 0 while($a < 42) %helper_preset[$a] := %preset_arr[(($Pre set_knob - 1)*42)+$a ] inc($a) end while case 2 $a := 0 while($a < 42) %preset_arr[(($Preset_knob - 1)*42)+$a ] := %helper_preset[$a] inc($a) end while case 3 $a := 0 while($a < 42) %preset_arr[(($Preset_knob - 1)*42)+$a ] := %default_preset[$a] inc($a) end while case 7 $b := 0 while($b < 12) $a := 0 while($a < 42) %preset_arr[($b*42)+$a ] := %pre set_arr[(($Preset_knob - 1)*42)+$a] inc($a) end while inc($b) end while case 4 $a := 0 while($a < 33) %helper_rhythm[$a] := %preset_arr[(($Pre set_knob - 1)*42)+$a ] inc($a) end while case 5 $a := 0 while($a < 33) %preset_arr[(($Preset_knob - 1)*42)+$a ] := %helper_rhythm[$a] inc($a) end while case 6 $a := 0 while($a < 33) %preset_arr[(($Preset_knob - 1)*42)+$a ] := %default_preset[$a] inc($a) end while case 8 $a := 0 while($a < 32) if (%preset_arr[(($Preset_knob - 1)*42)+ $a ] > 0) %preset_arr[(($Preset_knob - 1)* 42)+$a ] := random(1,100) end if inc($a) end while end select} $a := 0 set_table_steps_shown(%rhythm, $steps) $sync_knob := ($Rate_knob * 18) /1000001 set_knob_defval ($Rate_knob,(5 *1000001) / 17) set_knob_label ($Rate_knob,!tempo_names[$sync_knob]) set_knob_unit($Rate_knob,$KNOB_UNIT_NONE) end if $edit_preset := 100 end on on ui_control ($steps) set_table_steps_shown(%rhythm, $steps) end on on ui_control ($note_order) if ($note_order # 99) $last_note_order := $note_order else $note_order:= $last_note_order end if end on on ui_control ($rate_knob) $sync_knob := ($Rate_knob * 18) /1000001 set_knob_label ($Rate_knob,!tempo_names[$sync_knob]) end on on _pgs_changed if(_pgs_key_exists(ARP_ON_OFF)) $Latch_knob := _pgs_get_key_val(ARP_ON_OFF,0) $latch_mode := $latch_knob select ($latch_mode) case 0 set_knob_label($latch_knob,"Off") $a := 0 while($a < $cursor) %note_buffer[$a] := 0 inc($a) end while $cursor := 0 case 1 set_knob_label($latch_knob,"On") $b := $cursor $cursor := 0 $a := 0 while($a < $b) if (%pressed_id[%note_buffer[$a]] > 0) %note_buffer[$cursor] := %note_buffer[$a ] inc($cursor) end if inc($a) end while case 2 set_knob_label($latch_knob,"Hold") case 3 set_knob_label($latch_knob,"Hold +-") end select end if end on {END OF SCRIPT}