// crossfades a CC message on two different channels

slider1:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI channel A
slider2:1<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI channel B
slider3:11<0,127,1{0 Bank Sel M,1 Mod Wheel M,2 Breath M,3,4 Foot P M,5 Porta M,6 Data Entry M,7 Vol M,8 Balance M,9,10 Pan M,11 Expression M,12 Ctrl 1 M,13 Ctrl 2 M,14,15,16 GP Slider 1,17 GP Slider 2,18 GP Slider 3,19 GP Slider 4,20,21,22,23,24,25,26,27,28,29,30,31,32 Bank Sel L,33 Mod Wheel L,34 Breath L,35,36 Foot P L,37 Porta L,38 Data Entry L,39 Vol L,40 Balance L,41,42 Pan L,43 Expression L,44 Ctrl 1 L,45 Ctrl 2 L,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 Hold P sw,65 Porta sw,66 Sustenuto sw,67 Soft P sw,68 Legato P sw,69 Hold 2 P sw,70 S.Variation,71 S.Timbre,72 S.Release,73 S.Attack,74 S.Brightness,75 S.Ctrl 6,76 S.Ctrl 7,77 S.Ctrl 8,78 S.Ctrl 9,79 S.Ctrl 10,80 GP B.1 sw,81 GP B.2 sw,82 GP B.3 sw,83 GP B.4 sw,84,85,86,87,88,89,90,91 Effects Lv,92 Trem Lv,93 Chorus Lv,94 Celeste Lv,95 Phaser Lv,96 Data B. Inc,97 Data B. Dec,98 NRP L,99 NRP M,100 RP L,101 RP M,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127}>CC Number
slider4:0<0,127,1>A<>B

in_pin:none
out_pin:none

@init
CC_MESG_MIN = 176; // a CC message on MIDI channel 1
BYTE_SIZE = 256; // size of an 8-bit byte
offset = 0; // sample offset for midisend
send_ccA = 0; // trigger
send_ccB = 0;
last_valueA = 0; // last known CC value
last_valueB = 0;

@slider
channelA = slider1;
channelB = slider2;
cc = slider3;
valueA = 127-slider4;
(valueA != last_valueA) ? send_ccA = 1;
valueB = slider4;
(valueB != last_valueB) ? send_ccB = 1;

@block
send_ccA ?
(
// send the message
msg1 = channelA + CC_MESG_MIN;
msg23 = cc + ( valueA * BYTE_SIZE );
midisend( offset, msg1, msg23 );

// clean up
send_ccA = 0;
last_valueA = valueA;
);

send_ccB ?
(
// send the message
msg1 = channelB + CC_MESG_MIN;
msg23 = cc + ( valueB * BYTE_SIZE );
midisend( offset, msg1, msg23 );

// clean up
send_ccB = 0;
last_valueB = valueB;
)
