/*
BSmart Hypersonic MIDI Controller
By Bryan Smart (bryansmart@bryansmart.com)
Last mod: 5/20/2014

This plug-in is for use with Steinberg Hypersonic II. The plug-in exposes additional automatable parameters for HS2 that are accessed through CC/RPN/SysEx.

To use this plug-in, place it in an effects chain before Hypersonic 2.

History

5/20/14
* Fixed problem where patch couldn't be changed after play/record. Reaper was re-initializing the plug-in's variables each time this happens. Added a check to reset them.
* HS2 resets volume/pan when bank/patch is changed, so the volume/pan widgets are also now reset when changing bank/patch.
* Renamed Program slider to Patch. HS2 says "program", but "patch" is the more familiar MIDI terminology.
* Renamed "Pan Position" slider to "Stereo Pan Position Slider" for greater clarity.
* Annotated Stereo Pan Position slider values for greater clarity.
* Labeled FX1 and/FX2 Level sliders with large/small reverb. Fairly sure these effects are hard-wired to these sends.
* There is only one Tone Variation slider, so removed the "1" from the end of the label.
* Commented the code, now that it is stable.

*/

desc: BSmart Hypersonic 2 Controller
in_pin:none
out_pin:none
ext_noinit=1;

// Declare user interface widgets.

slider1:0<0,15,1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}>MIDI channel

// Voice select
slider2:0<0,120,1{0 Hypersonic 1 Preview,1 Natural Drums,2 Natural Percussion,3 Contemporary Drum Kits,4 Contemporary Percussion,5 Drum Menus,6 Drum Loops,7 Acoustic Pianos,8 Electric Pianos,9 Clavinets,10 Organs,11 Harpsichords,12 Mallets,13 Bells,14 Percussive,15 Synth Basses,16 Acoustic Basses,17 Electric Basses,18 Acoustic Guitars,19 Clean Electric Guitars,20 Distorted Electric Guitars,21 Strings,22 Orchestral,23 Hits,24 Vocals,25 Brass Sections,26 Solo Brass,27 Saxes,28 Woodwinds,29 Ethnic and World,30 Accordions and Harmonicas,31 Soft Pads,32 Bright Pads,33 Moving Pads,34 Soundscapes,35 Techno Synths,36 Poly Synths,37 Arpeggios,38 Synth Brass,39 Soft Leads,40 Hard Leads,41 Synth Effects,42 Sound Effects,43 Test Patches,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78 General MIDI,79 General MIDI Drums,80 Ultra Synth Bank 1,81 Ultra Synth Bank 2,82 Grand Pianos,83 Tonewheel Organs,84 Hypersonic 2 Preview,85,86 Phrases,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120 Combis}>Bank
slider3:0<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Patch

// Mix
slider4:100<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Volume
slider5:64<0,127,1{0 (hard left),1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64 (center),65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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 (hard right)}>Stereo Pan Position
slider6:0<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>FX1 (long reverb) Level
slider7:0<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>FX2 (short reverb) Level
slider8:0<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>FX3 Level
slider9:0<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>FX4 Level

// Hyper Knobs
slider10:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Hyper Knob 1
slider11:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Hyper Knob 2
slider12:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Hyper Knob 3
slider13:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Hyper Knob 4
slider14:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Hyper Knob 5
slider15:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Hyper Knob 6

// Tone variation
slider16:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Tone Variation

// Mono/Poly and Glide
slider17:1<0,1,1{Monophonic,Polyphonic}>Polyphony
slider18:0<0,1,1{Off,On}>Portamento
slider19:0<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Portamento Time

// Filter
slider20:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Filter Cut-Off Frequency
slider21:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Filter Resonance
slider22:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Filter Envelope Depth

// Envelope
slider23:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Attack Time
slider24:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Decay Time
slider25:64<0,127,1{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,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}>Release Time

slider26:0<0,1,1{Off,On}>Arpeggiator

@slider

// Handle a change to a user interface widget.

// Before starting, check to see if Reaper has reset the plug-in's variables.

setup_prev == 0 ? (
// Sliders are always preserved, so re-load prev values from those.
prev_bank = slider2;
prev_pgm = slider3;

prev_volume = slider4;
prev_pan = slider5;
prev_fx1 = slider6;
prev_fx2 = slider7;
prev_fx3 = slider8;
prev_fx4 = slider9;

prev_hknob1 = slider10;
prev_hknob2 = slider11;
prev_hknob3 = slider12;
prev_hknob4 = slider13;
prev_hknob5 = slider14;
prev_hknob6 = slider15;

prev_variation1 = slider16;

prev_poly = slider17;
prev_Portamento = slider18;
prev_portatime = slider19;

prev_cutoff = slider20;
prev_resonance = slider21;
prev_fmod = slider22;

prev_attack = slider23;
prev_decay = slider24;
prev_release = slider25;

prev_arp = slider26;

setup_prev = 1;
);

// If the plug-in has been setup, then we can process changes in the UI.
setup_prev == 1 ? (
// First, load current parameter values from the UI widgets.
chan = slider1;

bank = slider2;
pgm = slider3;

volume = slider4;
pan = slider5;
fx1 = slider6;
fx2 = slider7;
fx3 = slider8;
fx4 = slider9;

hknob1 = slider10;
hknob2 = slider11;
hknob3 = slider12;
hknob4 = slider13;
hknob5 = slider14;
hknob6 = slider15;

variation1 = slider16;

poly = slider17;
Portamento = slider18;
portatime = slider19;

cutoff = slider20;
resonance = slider21;
fmod = slider22;

attack = slider23;
decay = slider24;
release = slider25;

arp = slider26;

// Second, determine if any UI widgets have been changed since the last time we checked them.

bank != prev_bank ? (
send_bank = 1;
send_pgm = 1;
);

pgm != prev_pgm ? send_pgm = 1;

volume != prev_volume ? send_volume = 1;
pan != prev_pan ? send_pan = 1;
fx1 != prev_fx1 ? send_fx1 = 1;
fx2 != prev_fx2 ? send_fx2 = 1;
fx3 != prev_fx3 ? send_fx3 = 1;
fx4 != prev_fx4 ? send_fx4 = 1;

hknob1 != prev_hknob1 ? send_hknob1 = 1;
hknob2 != prev_hknob2 ? send_hknob2 = 1;
hknob3 != prev_hknob3 ? send_hknob3 = 1;
hknob4 != prev_hknob4 ? send_hknob4 = 1;
hknob5 != prev_hknob5 ? send_hknob5 = 1;
hknob6 != prev_hknob6 ? send_hknob6 = 1;

variation1 != prev_variation1 ? send_variation1 = 1;

poly != prev_poly ? send_poly = 1;
portamento != prev_portamento ? send_portamento = 1;
portatime != prev_portatime ? send_portatime = 1;

cutoff != prev_cutoff ? send_cutoff = 1;
resonance != prev_resonance ? send_resonance = 1;
fmod != fmod ? send_fmod = 1;

attack != prev_attack ? send_attack = 1;
decay != prev_decay ? send_decay = 1;
release != prev_release ? send_release = 1;

arp != prev_arp ? send_arp = 1;

// Finally, save the current parameters, so that we can check them next time for changes.

prev_bank = bank;
prev_pgm = pgm;

prev_volume = volume;
prev_pan = pan;
prev_fx1 = fx1;
prev_fx2 = fx2;
prev_fx3 = fx3;
prev_fx4 = fx4;

prev_hknob1 = hknob1;
prev_hknob2 = hknob2;
prev_hknob3 = hknob3;
prev_hknob4 = hknob4;
prev_hknob5 = hknob5;
prev_hknob6 = hknob6;

prev_variation1 = variation1;

prev_poly = poly;
prev_portamento = portamento;
prev_portatime = portatime;

prev_cutoff = cutoff;
prev_resonance = resonance;
prev_fmod = fmod;

prev_attack = attack;
prev_decay = decay;
prev_release = release;

prev_arp = arp;
);

@block
// This plug-in doesnt modify MIDI events, so forward all buffered events to the next plug-in in the chain.
while (
midirecv(ts,msg1,msg23) ? midisend(ts,msg1,msg23);
); 

// If the bank or program/patch is being changed, reset the other parameter widgets to default values

send_bank || send_pgm ? (
slider4 = 100;
prev_volume = 100;
slider5 = 64;
prev_pan = 64;
slider6 = 0;
prev_fx1 = 0;
slider7 = 0;
prev_fx2 = 0;
slider8 = 0;
prev_fx3 = 0;
slider9 = 0;
prev_fx4 = 0;

slider10 = 64;
prev_hknob1 = 64;
slider11 = 64;
prev_hknob2 = 64;
slider12 = 64;
prev_hknob3 = 64;
slider13 = 64;
prev_hknob4 = 64;
slider14 = 64;
prev_hknob5 = 64;
slider15 = 64;
prev_hknob6 = 64;

slider16 = 64;
prev_variation1 = 64;

slider17 = 1;
prev_poly = 1;
slider18 = 0;
prev_Portamento = 0;
slider19 = 0;
prev_portatime = 0;

slider20 = 64;
prev_cutoff = 64;
slider21 = 64;
prev_resonance = 64;
slider22 = 64;
prev_fmod = 64;

slider23 = 64;
prev_attack = 64;
slider24 = 64;
prev_decay = 64;
slider25 = 64;
prev_release = 64;

slider26 = 0;
prev_arp = 0;
);

// Test each send flag to determine if its message needs to be sent.

send_bank ? (
midisend(0,$xB0 + chan,(32 +(bank * 256))|0);
send_bank = 0;
);

send_pgm ? (
midisend(0,$xC0 + chan,pgm|0);
send_pgm = 0;
);

send_volume ? (
midisend(0,$xB0 + chan,(7 +(volume * 256))|0);
send_volume = 0;
);

send_pan ? (
midisend(0,$xB0 + chan,(10 +(pan * 256))|0);
send_pan = 0;
);

send_fx1 ? (
midisend(0,$xB0 + chan,($x5B +(fx1 * 256))|0);
send_fx1 = 0;
);

send_fx2 ? (
midisend(0,$xB0 + chan,($x5C +(fx2 * 256))|0);
send_fx2 = 0;
);

send_fx3 ? (
midisend(0,$xB0 + chan,($x5D +(fx3 * 256))|0);
send_fx3 = 0;
);

send_fx4 ? (
midisend(0,$xB0 + chan,($x5E +(fx4 * 256))|0);
send_fx4 = 0;
);

send_hknob1 ? (
midisend(0,$xB0 + chan,(16 +(hknob1 * 256))|0);
send_hknob1 = 0;
);

send_hknob2 ? (
midisend(0,$xB0 + chan,(17 +(hknob2 * 256))|0);
send_hknob2 = 0;
);

send_hknob3 ? (
midisend(0,$xB0 + chan,(18 +(hknob3 * 256))|0);
send_hknob3 = 0;
);

send_hknob4 ? (
midisend(0,$xB0 + chan,(19 +(hknob4 * 256))|0);
send_hknob4 = 0;
);

send_hknob5 ? (
midisend(0,$xB0 + chan,(80 +(hknob5 * 256))|0);
send_hknob5 = 0;
);

send_hknob6 ? (
midisend(0,$xB0 + chan,(81 +(hknob6 * 256))|0);
send_hknob1 = 0;
);

send_variation1 ? (
midisend(0,$xB0 + chan,(70 +(variation1 * 256))|0);
send_variation1 = 0;
);

send_fmod ? (
midisend(0,$xB0 + chan,(79 +(fmod * 256))|0);
send_fmod = 0;
);

send_poly ? (
poly == 0 ? midisend(0,$xB0 + chan,($x7E + (127*256)) | 0);
poly == 1 ? midisend(0,$xB0 + chan,$x7E | 0);
send_poly = 0;
);

send_portamento ? (
portamento == 0 ? midisend(0,$xB0 + chan,$x41 | 0);
portamento == 1 ? midisend(0,$xB0 + chan,($x41 +(127 * 256))|0);
send_portamento = 0;
);

send_portatime ? (
midisend(0,$xB0 + chan,(5 +(portatime * 256))|0);
send_portatime = 0;
);

send_cutoff ? (
midisend(0,$xB0 + chan,($x4A +(cutoff * 256))|0);
send_cutoff = 0;
);

send_resonance ? (
midisend(0,$xB0 + chan,($x47 +(resonance * 256))|0);
send_resonance = 0;
);

send_attack ? (
midisend(0,$xB0 + chan,($x49 +(attack * 256))|0);
send_attack = 0;
);

send_decay ? (
midisend(0,$xB0 + chan,($x4B +(decay * 256))|0);
send_decay = 0;
);

send_release ? (
midisend(0,$xB0 + chan,($x48 +(release * 256))|0);
send_release = 0;
);

send_arp ? (
arp == 0 ? midisend(0,$xB0 + chan,69 | 0);
arp == 1 ? midisend(0,$xB0 + chan,(69 +(127 * 256))|0);
send_arp = 0;
);
