{===========================} { keyboard channel splitter } { by SzcZ (c) 2015 } { www.fairlyconfusing.net } {===========================} on init set_script_title("Keyboard splitter") set_ui_height_px(90) message(" ") {--- declare calculation variables} {-----------------} declare $count declare $route_pass declare $check {--- declare gui positioning coordinates} {-----------------} declare const $width := 30 declare const $spacing := 36 declare const $spacing_y := 25 declare const $x_pos := 60 declare const $y_pos := 5 {--- GUI controls} {-----------------} declare ui_menu $in_port add_menu_item ($in_port, "input: any port",-1) add_menu_item ($in_port, "input: port A",0) add_menu_item ($in_port, "input: port B",1) add_menu_item ($in_port, "input: port C",2) add_menu_item ($in_port, "input: port D",3) set_control_par(get_ui_id($in_port),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($in_port, $x_pos + $spacing *0, $y_pos + $spacing_y *0) declare ui_menu $in_ch add_menu_item ($in_ch, "input: any channel",-1) add_menu_item ($in_ch, "input: channel 1",0) add_menu_item ($in_ch, "input: channel 2",1 ) add_menu_item ($in_ch, "input: channel 3",2 ) add_menu_item ($in_ch, "input: channel 4",3 ) add_menu_item ($in_ch, "input: channel 5",4 ) add_menu_item ($in_ch, "input: channel 6",5 ) add_menu_item ($in_ch, "input: channel 7",6 ) add_menu_item ($in_ch, "input: channel 8",7 ) add_menu_item ($in_ch, "input: channel 9",8 ) add_menu_item ($in_ch, "input: channel 10",9 ) add_menu_item ($in_ch, "input: channel 11",10) add_menu_item ($in_ch, "input: channel 12",11) add_menu_item ($in_ch, "input: channel 13",12) add_menu_item ($in_ch, "input: channel 14",13) add_menu_item ($in_ch, "input: channel 15",14) add_menu_item ($in_ch, "input: channel 16",15) set_control_par(get_ui_id($in_ch),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($in_ch, $x_pos + $spacing *3, $y_pos + $spacing_y *0) declare ui_value_edit $split(0,127,1) $split := 60 set_control_par(get_ui_id($split),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($split, $x_pos + $spacing *6, $y_pos + $spacing_y *0) set_text ($split,"split position") declare ui_switch $learn set_control_par(get_ui_id($learn),$CONTROL_PAR_WIDTH,$spacing *2 -6) move_control_px($learn, $x_pos + $spacing *9, $y_pos + $spacing_y *0) declare ui_menu $low_out_port add_menu_item ($low_out_port, "output: port A",0) add_menu_item ($low_out_port, "output: port B",1) add_menu_item ($low_out_port, "output: port C",2) add_menu_item ($low_out_port, "output: port D",3) set_control_par(get_ui_id($low_out_port),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($low_out_port, $x_pos + $spacing *2, $y_pos + $spacing_y *1) declare ui_menu $high_out_port add_menu_item ($high_out_port, "output: port A",0) add_menu_item ($high_out_port, "output: port B",1) add_menu_item ($high_out_port, "output: port C",2) add_menu_item ($high_out_port, "output: port D",3) set_control_par(get_ui_id($high_out_port),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($high_out_port, $x_pos + $spacing *2, $y_pos + $spacing_y *2) declare ui_menu $low_out_ch add_menu_item ($low_out_ch, "channel 1",0) add_menu_item ($low_out_ch, "channel 2",1 ) add_menu_item ($low_out_ch, "channel 3",2 ) add_menu_item ($low_out_ch, "channel 4",3 ) add_menu_item ($low_out_ch, "channel 5",4 ) add_menu_item ($low_out_ch, "channel 6",5 ) add_menu_item ($low_out_ch, "channel 7",6 ) add_menu_item ($low_out_ch, "channel 8",7 ) add_menu_item ($low_out_ch, "channel 9",8 ) add_menu_item ($low_out_ch, "channel 10",9 ) add_menu_item ($low_out_ch, "channel 11",10) add_menu_item ($low_out_ch, "channel 12",11) add_menu_item ($low_out_ch, "channel 13",12) add_menu_item ($low_out_ch, "channel 14",13) add_menu_item ($low_out_ch, "channel 15",14) add_menu_item ($low_out_ch, "channel 16",15) set_control_par(get_ui_id($low_out_ch),$CONTROL_PAR_WIDTH,$spacing *2 -6) move_control_px($low_out_ch, $x_pos + $spacing *5, $y_pos + $spacing_y) declare ui_menu $high_out_ch add_menu_item ($high_out_ch, "channel 1",0) add_menu_item ($high_out_ch, "channel 2",1 ) add_menu_item ($high_out_ch, "channel 3",2 ) add_menu_item ($high_out_ch, "channel 4",3 ) add_menu_item ($high_out_ch, "channel 5",4 ) add_menu_item ($high_out_ch, "channel 6",5 ) add_menu_item ($high_out_ch, "channel 7",6 ) add_menu_item ($high_out_ch, "channel 8",7 ) add_menu_item ($high_out_ch, "channel 9",8 ) add_menu_item ($high_out_ch, "channel 10",9 ) add_menu_item ($high_out_ch, "channel 11",10) add_menu_item ($high_out_ch, "channel 12",11) add_menu_item ($high_out_ch, "channel 13",12) add_menu_item ($high_out_ch, "channel 14",13) add_menu_item ($high_out_ch, "channel 15",14) add_menu_item ($high_out_ch, "channel 16",15) $high_out_ch := 1 set_control_par(get_ui_id($high_out_ch),$CONTROL_PAR_WIDTH,$spacing *2 -6) move_control_px($high_out_ch, $x_pos + $spacing *5, $y_pos + $spacing_y *2) declare ui_value_edit $low_transpose(-5,5,1) $low_transpose := 0 set_control_par(get_ui_id($low_transpose),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($low_transpose, $x_pos + $spacing *7, $y_pos + $spacing_y *1) set_text ($low_transpose,"transpose") declare ui_value_edit $high_transpose(-5,5,1) $high_transpose := 0 set_control_par(get_ui_id($high_transpose),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($high_transpose, $x_pos + $spacing *7, $y_pos + $spacing_y *2) set_text ($high_transpose,"transpose") declare ui_switch $low_data $low_data := 1 set_control_par(get_ui_id($low_data),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($low_data, $x_pos + $spacing *10, $y_pos + $spacing_y *1) set_text ($low_data,"send other messages") declare ui_switch $high_data $high_data := 1 set_control_par(get_ui_id($high_data),$CONTROL_PAR_WIDTH,$spacing *3 -6) move_control_px($high_data, $x_pos + $spacing *10, $y_pos + $spacing_y *2) set_text ($high_data,"send other messages") declare ui_label $low_label (1,1) set_control_par(get_ui_id($low_label),$CONTROL_PAR_WIDTH,$spacing *2 -6) move_control_px($low_label, $x_pos + $spacing *0, $y_pos + $spacing_y *1) set_text ($low_label,"Low keys:") declare ui_label $high_label (1,1) set_control_par(get_ui_id($high_label),$CONTROL_PAR_WIDTH,$spacing *2 -6) move_control_px($high_label, $x_pos + $spacing *0, $y_pos + $spacing_y *2) set_text ($high_label,"High keys:") declare ui_label $fairly (1,1) set_control_par(get_ui_id($fairly),$CONTROL_PAR_WIDTH,$spacing *4 -6) move_control_px($fairly, $x_pos + $spacing *12, $y_pos + $spacing_y *0) set_text ($fairly," www.fairlyconfusing.net") {--- save values} {-----------------} make_persistent ($in_port) make_persistent ($in_ch) make_persistent ($split) make_persistent ($low_out_port) make_persistent ($high_out_port) make_persistent ($low_out_ch) make_persistent ($high_out_ch) make_persistent ($low_transpose) make_persistent ($high_transpose) make_persistent ($low_data) make_persistent ($high_data) {--- help} {-----------------} set_control_help($in_port,"Select input port to process. If 'any port' is selected, messages from all ports will be routed to new destination.") set_control_help($in_ch,"Select input channel to process. If 'any channel' is selected, messages from all channel will be routed to new destination.") set_control_help($split,"Select first key of the 'high keys' range.") set_control_help($learn,"MIDI learn the split position.") set_control_help($low_out_port,"Select output port to redirect 'low keys'.") set_control_help($high_out_port,"Select output port to redirect 'high keys'.") set_control_help($low_out_ch,"Select output channel to redirect 'low keys'.") set_control_help($high_out_ch,"Select output channel to redirect 'high keys'.") set_control_help($low_transpose,"Transpose 'low keys' by octave.") set_control_help($high_transpose,"Transpose 'high keys' by octave.") set_control_help($low_data,"Script re-routes note on, note off and poly aftertouch messages. If this switch is enabled, other messages like CC or Pitch Bend will be sent to 'low keys' output channel.") set_control_help($high_data,"Script re-routes note on, note off and poly aftertouch messages. If this switch is enabled, other messages like CC or Pitch Bend will be sent to 'high keys' output channel.") end on {-----------------} { functions } {-----------------} {send note off to a all channels} function all_notes_off $count := 0 while ($count < 64) set_midi($count,$MIDI_COMMAND_CC,123,0) inc($count) end while end function {----------------------------} { process incoming midi data } {----------------------------} on midi_in $route_pass := 1 {midi learn} if($learn =1 and $MIDI_COMMAND = $MIDI_COMMAND_NOTE_ON) $split := $MIDI_BYTE_1 $learn := 0 $route_pass := 0 ignore_midi end if {check if incoming data matches routing input settings} $check := 0 if($in_port = -1) if($in_ch = -1) $check := 1 else if($MIDI_CHANNEL mod 16 = $in_ch) $check := 1 end if end if else if($in_ch = -1 and $in_port = $MIDI_CHANNEL /16) $check := 1 else if($MIDI_CHANNEL mod 16 = $in_ch and $in_port = $MIDI_CHANNEL /16) $check := 1 end if end if end if {routing functionality} if($route_pass = 1 and $check =1) ignore_midi if($MIDI_COMMAND = $MIDI_COMMAND_NOTE_ON or $MIDI_COMMAND = $MIDI_COMMAND_NOTE_OFF or $MIDI_COMMAND = $MIDI_COMMAND_POLY_AT) if($MIDI_BYTE_1 < $split) $count := $MIDI_BYTE_1 + $low_transpose *12 if(in_range($count,0,127)) set_midi($low_out_port *16 + $low_out_ch,$MIDI_COMMAND,$count,$MIDI_BYTE_2) end if else $count := $MIDI_BYTE_1 + $high_transpose *12 if(in_range($count,0,127)) set_midi($high_out_port *16 + $high_out_ch,$MIDI_COMMAND,$count,$MIDI_BYTE_2) end if end if else if($low_data =1) set_midi($low_out_port *16 + $low_out_ch,$MIDI_COMMAND,$MIDI_BYTE_1,$MIDI_BYTE_2) end if if($high_data =1) if($low_out_ch # $high_out_ch or $low_out_port # $high_out_port or $low_data =0) set_midi($high_out_port *16 + $high_out_ch,$MIDI_COMMAND,$MIDI_BYTE_1,$MIDI_BYTE_2) end if end if end if end if end on {-------------------} { GUI controls } {-------------------} on ui_control ($in_port) call all_notes_off end on on ui_control ($in_ch) call all_notes_off end on on ui_control ($split) call all_notes_off end on on ui_control ($low_out_port) call all_notes_off end on on ui_control ($high_out_port) call all_notes_off end on on ui_control ($low_out_ch) call all_notes_off end on on ui_control ($high_out_ch) call all_notes_off end on on ui_control ($low_transpose) call all_notes_off end on on ui_control ($high_transpose) call all_notes_off end on