Перезалил.
[HIDE=1]
{***********************************************
Velocity Swither
Author: Alexey Bozhenko
Written Alexey Bozhenko
Modified: December 28, 2010
*************************************************}
on init
set_script_title("Velocity Swither")
set_ui_height(3)
message("")
declare $count
declare $cur_vel
declare $cc_vel
declare $counter_min
declare $counter_max
{declare %note_id[128] remember the last Event-ID }
declare %lock[128] {lock note_off to prevent note_off while programm switch }
declare $last_note
declare $last_prog
declare $cur_prog
declare $shift_prog
{declare ui_switch $Panic
declare ui_switch $Mono}
declare ui_table %note_play[128] (6,2,10) {1 if the note is still playing, 0 if not}
declare ui_label $label1 (3, 1)
set_text ($label1, "Velocity switch zones:")
declare ui_label $label2 (6, 1)
set_text ($label2, ...
"0 10 20 30 40 50 60 70 80 90 100+")
declare ui_label $label3 (1, 1)
set_text ($label3, "Row switcher:")
declare ui_value_edit $Min (0, 127, 1)
declare ui_value_edit $Med (0, 127, 1)
declare ui_value_edit $Max (0, 127, 1)
declare ui_value_edit $KeySw (0, 127, $VALUE_EDIT_MODE_NOTE_NAMES)
$Min := 50
$Med := 90
$Max := 120
$KeySw := 12
$cur_vel := -1
$cc_vel := 90
$shift_prog :=0
move_control (%note_play, 1,3)
move_control ($Min, 1,2)
move_control ($Med, 2,2)
move_control ($Max, 3,2)
move_control ($label3, 6,1)
move_control ($label2, 1,5)
move_control ($label1, 1,1)
move_control ($KeySw, 6,2)
{move_control ($Panic, 6,6)
move_control ($Mono, 5,6)}
make_persistent ($Min)
make_persistent ($Med)
make_persistent ($Max)
make_persistent ($cc_vel)
make_persistent ($shift_prog)
make_persistent ($KeySw)
{make_persistent ($Mono)}
read_persistent_var($Min)
read_persistent_var($Med)
read_persistent_var($Max)
read_persistent_var($cc_vel)
read_persistent_var($shift_prog)
read_persistent_var($KeySw)
$counter_min:=0 {Apdate table to show zones}
while ($counter_min < $Min)
%note_play[$counter_min] := 9
inc ($counter_min)
end while
$counter_min:=$Med
while ($counter_min < $Max)
%note_play[$counter_min] := 9
inc ($counter_min)
end while
{--------Pulse Mode-------}
declare $duration
make_persistent ($duration)
read_persistent_var($duration)
declare const $Tempo_label_X := 5
declare const $Tempo_label_Y := 1
declare const $Tempo_knob_X := 4
declare const $Tempo_knob_Y := 1
declare @knob_name
@knob_name := "Length"
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_label $tempo_label (1,1)
set_text ($tempo_label,"Tempo Sync:")
move_control ($tempo_label,$Tempo_label_X,$Tempo_label_Y)
set_control_help ($tempo_label,"Tempo Sync: Choose whether the tempo is free or synced to the master clock.")
declare ui_menu $Tempo_menu
add_menu_item ($Tempo_menu,"Free",0)
add_menu_item ($Tempo_menu,"Sync",1)
add_menu_item ($Tempo_menu,"OFF",2)
move_control ($Tempo_menu,$Tempo_label_X,$Tempo_label_Y+1)
make_persistent ($Tempo_menu)
set_control_help ($Tempo_menu,"Tempo Sync: Choose whether the tempo is free or synced to the master clock.")
declare ui_knob $Free_knob (1,1000,1000)
set_knob_unit($Free_knob,$KNOB_UNIT_MS)
set_knob_defval ($Free_knob,500)
$Free_knob := 500
set_text ($Free_knob,@knob_name)
make_persistent ($Free_knob)
set_control_help ($Free_knob,@knob_name & " (Free): Adjust the length of the notes in miliseconds, regardless of the master clock.")
declare ui_knob $Sync_knob (0,17,1)
set_text ($Sync_knob,@knob_name)
$Sync_knob := 5
set_knob_defval ($Sync_knob,8)
set_knob_label ($Sync_knob,!tempo_names[$Sync_knob])
make_persistent ($Sync_knob)
set_control_help ($Sync_knob,@knob_name & " (Sync): Adjust the length of the notes in rhythmical values, synced to the master clock. T stands for
triplet.")
declare ui_label $beat_label (1,1)
set_text ($beat_label,"Beat multiplied by:")
set_control_help ($beat_label,"Sync (Beat): Adjust the length of the notes in fractions/multiples of one beat, synced to the master clock. <0.25>
equals a 16th, <0.75> a dotted 8th, <2.5> two quarter notes and an 8th, <0.2> a quintuplet etc.")
$Tempo_menu := 1
move_control ($Sync_knob,$Tempo_knob_X,$Tempo_knob_Y)
move_control ($Free_knob,0,0)
move_control ($beat_label,0,0)
_read_persistent_var($Sync_knob)
set_knob_label ($Sync_knob,!tempo_names[$Sync_knob])
_read_persistent_var($Tempo_menu)
select ($Tempo_menu)
case 0
move_control ($Sync_knob,0,0)
move_control ($Free_knob,$Tempo_knob_X,$Tempo_knob_Y)
move_control ($beat_label,0,0)
case 1
move_control ($Sync_knob,$Tempo_knob_X,$Tempo_knob_Y)
move_control ($Free_knob,0,0)
move_control ($beat_label,0,0)
end select
end on
on midi_in
if ($MIDI_COMMAND = $MIDI_COMMAND_CC and $MIDI_BYTE_1 = 1) {TRANSFORMS CC TO VELOCITY}
$cc_vel := $MIDI_BYTE_2
end if
if ($MIDI_COMMAND = $MIDI_COMMAND_NOTE_ON and $MIDI_BYTE_2 > 0) {TRANSFORMS VELOCITY TO PROGRAMM CHANGE}
ignore_midi
if (in_range($MIDI_BYTE_1,$KeySw,$KeySw+11)) {ROW SWITCHER}
$shift_prog:=4*($MIDI_BYTE_1-$KeySw)
end if
if (in_range($MIDI_BYTE_2, 0, $Min)) {TRANSFORM VELOCITY ZONES TO CONSTANT NOTE VELOCITY}
$cur_prog := 0+$shift_prog
end if
if (in_range($MIDI_BYTE_2, $Min, $Med))
$cur_prog := 1+$shift_prog
end if
if (in_range($MIDI_BYTE_2, $Med, $Max))
$cur_prog := 2+$shift_prog
end if
if (in_range($MIDI_BYTE_2, $Max, 127))
$cur_prog := 3+$shift_prog
end if
if ($last_prog # $cur_prog) {NOTE OFF BEFORE PROG CHANGE}
{set_midi($MIDI_CHANNEL,$MIDI_COMMAND_NOTE_OFF,$last_note,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_NOTE_OFF,$last_note,0)}
%lock[$last_note] := 1
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_CC,123,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_CC,123,0)
end if
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_PROGRAM_CHANGE,$cur_prog,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_PROGRAM_CHANGE,$cur_prog,0)
$last_prog := $cur_prog
if ($cur_vel = -1) {SHOW ON INDICATOR ONLY FIRST NOTE}
$cur_vel := $MIDI_BYTE_2
%note_play[$cur_vel] := %note_play[$cur_vel]+1
end if
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_NOTE_ON,$MIDI_BYTE_1,$cc_vel)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_NOTE_ON,$MIDI_BYTE_1,$cc_vel)
$last_note:=$MIDI_BYTE_1
end if
if ($MIDI_COMMAND = $MIDI_COMMAND_NOTE_OFF or $MIDI_BYTE_2 = 0) {NOTE OFF}
if ($Tempo_menu # 2)
ignore_midi
wait($duration)
if (%lock[$MIDI_BYTE_1] # 1) {prevent note_off when programm switched}
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_NOTE_OFF,$MIDI_BYTE_1,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_NOTE_OFF,$MIDI_BYTE_1,0)
end if
%lock[$MIDI_BYTE_1] := 0
end if
%note_play[$cur_vel] := %note_play[$cur_vel]-1 {REMOVE INDICATOR}
$cur_vel:=-1
$last_note:=0
message("OFF!")
end if
if ($MIDI_COMMAND = $MIDI_COMMAND_PITCH_BEND) {SWITCH PROGAMM ROW}
ignore_midi
if ($MIDI_BYTE_2 = 127 and $shift_prog > 0)
$shift_prog:=$shift_prog-4
$last_prog := $last_prog-4
{NOTE OFF BEFORE PROG CHANGE}
%lock[$last_note] := 1
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_CC,123,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_CC,123,0)
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_PROGRAM_CHANGE,$last_prog,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_PROGRAM_CHANGE,$last_prog,0)
end if
if ($MIDI_BYTE_2 = 0 and $shift_prog < 32)
$shift_prog:=$shift_prog+4
$last_prog := $last_prog+4
{NOTE OFF BEFORE PROG CHANGE}
%lock[$last_note] := 1
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_CC,123,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_CC,123,0)
set_midi($MIDI_CHANNEL,$MIDI_COMMAND_PROGRAM_CHANGE,$last_prog,0)
set_midi($MIDI_CHANNEL+16,$MIDI_COMMAND_PROGRAM_CHANGE,$last_prog,0)
end if
end if
end on
{on ui_control ($Panic)
$Panic := 0
note_off ($ALL_EVENTS)
$count := 0
while ($count < 128)
%note_play[$count] := 0
inc ($count)
end while
end on}
on ui_control ($Min)
if ($Min > $Med)
$Med := $Min
end if
if ($Min > $Max)
$Max := $Min
end if
$counter_max := $Med
$counter_min := 0
while ($counter_min < $Min)
%note_play[$counter_min] := 9
%note_play[$counter_min+1] := 0
inc ($counter_min)
end while
while ($counter_max > $Min)
%note_play[$counter_max] := 0
dec ($counter_max)
end while
end on
on ui_control ($Med)
if ($Med > $Max)
$Max := $Med
end if
if ($Med < $Min)
$Min := $Med
end if
$counter_max := $Max
$counter_min := $Min
while ($counter_min < $Med)
%note_play[$counter_min] := 0
%note_play[$counter_min+1] := 9
inc ($counter_min)
end while
while ($counter_max > $Med)
%note_play[$counter_max] := 9
dec ($counter_max)
end while
end on
on ui_control ($Max)
if ($Max < $Med)
$Med := $Max
end if
if ($Max < $Min)
$Min := $Max
end if
$counter_max := 127
$counter_min := $Med
while ($counter_max > $Max)
%note_play[$counter_max] := 0
%note_play[$counter_max-1] := 9
dec ($counter_max)
end while
while ($counter_min < $Max)
%note_play[$counter_min] := 9
inc ($counter_min)
end while
end on
{--------Pulse Mode-------}
on ui_control ($Tempo_menu)
select ($Tempo_menu)
case 0
move_control ($Sync_knob,0,0)
move_control ($Free_knob,$Tempo_knob_X,$Tempo_knob_Y)
move_control ($beat_label,0,0)
case 1
move_control ($Sync_knob,$Tempo_knob_X,$Tempo_knob_Y)
move_control ($Free_knob,0,0)
move_control ($beat_label,0,0)
end select
$duration := $Free_knob * 1000
end on
on ui_control ($Sync_knob)
set_knob_label ($Sync_knob,!tempo_names[$Sync_knob])
select ($Sync_knob)
case 0
$duration := $DURATION_SIXTEENTH/8
case 1
$duration := $DURATION_SIXTEENTH/4
case 2
$duration := $DURATION_SIXTEENTH/2
case 3
$duration := $DURATION_QUARTER/6
case 4
$duration := ($DURATION_SIXTEENTH/4)*3
case 5
$duration := $DURATION_SIXTEENTH
case 6
$duration := $DURATION_QUARTER/3
case 7
$duration := ($DURATION_SIXTEENTH/2)*3
case 8
$duration := $DURATION_EIGHTH
case 9
$duration := ($DURATION_QUARTER*2)/3
case 10
$duration := $DURATION_SIXTEENTH*3
case 11
$duration := $DURATION_QUARTER
case 12
$duration := ($DURATION_QUARTER*4)/3
case 13
$duration := $DURATION_EIGHTH*3
case 14
$duration := $DURATION_QUARTER*2
case 15
$duration := $DURATION_QUARTER*3
case 16
$duration := $DURATION_QUARTER*4
case 17
$duration := $DURATION_BAR
end select
end on
{END OF SCRIPT}
[/HIDE]