case 0x57:
case 0x07:
static void process_sysex_event(int ev, int ch, int val, int b){	int temp, msb, note;	if (ch >= MAX_CHANNELS)		return;	if (ev == ME_SYSEX_MSB) {		channel[ch].sysex_msb_addr = b;		channel[ch].sysex_msb_val = val;	} else if(ev == ME_SYSEX_GS_MSB) {		channel[ch].sysex_gs_msb_addr = b;		channel[ch].sysex_gs_msb_val = val;	} else if(ev == ME_SYSEX_XG_MSB) {		channel[ch].sysex_xg_msb_addr = b;		channel[ch].sysex_xg_msb_val = val;	} else if(ev == ME_SYSEX_LSB) {	/* Universal system exclusive message */		msb = channel[ch].sysex_msb_addr;		note = channel[ch].sysex_msb_val;		channel[ch].sysex_msb_addr = channel[ch].sysex_msb_val = 0;		switch(b)		{		case 0x00:	/* CAf Pitch Control */			if(val > 0x58) {val = 0x58;}			else if(val < 0x28) {val = 0x28;}			channel[ch].caf.pitch = val - 64;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf Pitch Control (CH:%d %d semitones)", ch, channel[ch].caf.pitch);			break;		case 0x01:	/* CAf Filter Cutoff Control */			channel[ch].caf.cutoff = (val - 64) * 150;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf Filter Cutoff Control (CH:%d %d cents)", ch, channel[ch].caf.cutoff);			break;		case 0x02:	/* CAf Amplitude Control */			channel[ch].caf.amp = (float)val / 64.0f - 1.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf Amplitude Control (CH:%d %.2f)", ch, channel[ch].caf.amp);			break;		case 0x03:	/* CAf LFO1 Rate Control */			channel[ch].caf.lfo1_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO1 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].caf.lfo1_rate);			break;		case 0x04:	/* CAf LFO1 Pitch Depth */			channel[ch].caf.lfo1_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO1 Pitch Depth (CH:%d %d cents)", ch, channel[ch].caf.lfo1_pitch_depth); 			break;		case 0x05:	/* CAf LFO1 Filter Depth */			channel[ch].caf.lfo1_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO1 Filter Depth (CH:%d %d cents)", ch, channel[ch].caf.lfo1_tvf_depth); 			break;		case 0x06:	/* CAf LFO1 Amplitude Depth */			channel[ch].caf.lfo1_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO1 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].caf.lfo1_tva_depth); 			break;		case 0x07:	/* CAf LFO2 Rate Control */			channel[ch].caf.lfo2_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO2 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].caf.lfo2_rate);			break;		case 0x08:	/* CAf LFO2 Pitch Depth */			channel[ch].caf.lfo2_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO2 Pitch Depth (CH:%d %d cents)", ch, channel[ch].caf.lfo2_pitch_depth); 			break;		case 0x09:	/* CAf LFO2 Filter Depth */			channel[ch].caf.lfo2_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO2 Filter Depth (CH:%d %d cents)", ch, channel[ch].caf.lfo2_tvf_depth); 			break;		case 0x0A:	/* CAf LFO2 Amplitude Depth */			channel[ch].caf.lfo2_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAf LFO2 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].caf.lfo2_tva_depth); 			break;		case 0x0B:	/* PAf Pitch Control */			if(val > 0x58) {val = 0x58;}			else if(val < 0x28) {val = 0x28;}			channel[ch].paf.pitch = val - 64;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf Pitch Control (CH:%d %d semitones)", ch, channel[ch].paf.pitch);			break;		case 0x0C:	/* PAf Filter Cutoff Control */			channel[ch].paf.cutoff = (val - 64) * 150;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf Filter Cutoff Control (CH:%d %d cents)", ch, channel[ch].paf.cutoff);			break;		case 0x0D:	/* PAf Amplitude Control */			channel[ch].paf.amp = (float)val / 64.0f - 1.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf Amplitude Control (CH:%d %.2f)", ch, channel[ch].paf.amp);			break;		case 0x0E:	/* PAf LFO1 Rate Control */			channel[ch].paf.lfo1_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO1 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].paf.lfo1_rate);			break;		case 0x0F:	/* PAf LFO1 Pitch Depth */			channel[ch].paf.lfo1_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO1 Pitch Depth (CH:%d %d cents)", ch, channel[ch].paf.lfo1_pitch_depth); 			break;		case 0x10:	/* PAf LFO1 Filter Depth */			channel[ch].paf.lfo1_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO1 Filter Depth (CH:%d %d cents)", ch, channel[ch].paf.lfo1_tvf_depth); 			break;		case 0x11:	/* PAf LFO1 Amplitude Depth */			channel[ch].paf.lfo1_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO1 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].paf.lfo1_tva_depth); 			break;		case 0x12:	/* PAf LFO2 Rate Control */			channel[ch].paf.lfo2_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO2 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].paf.lfo2_rate);			break;		case 0x13:	/* PAf LFO2 Pitch Depth */			channel[ch].paf.lfo2_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO2 Pitch Depth (CH:%d %d cents)", ch, channel[ch].paf.lfo2_pitch_depth); 			break;		case 0x14:	/* PAf LFO2 Filter Depth */			channel[ch].paf.lfo2_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO2 Filter Depth (CH:%d %d cents)", ch, channel[ch].paf.lfo2_tvf_depth); 			break;		case 0x15:	/* PAf LFO2 Amplitude Depth */			channel[ch].paf.lfo2_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "PAf LFO2 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].paf.lfo2_tva_depth); 			break;		case 0x16:	/* MOD Pitch Control */			if(val > 0x58) {val = 0x58;}			else if(val < 0x28) {val = 0x28;}			channel[ch].mod.pitch = val - 64;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD Pitch Control (CH:%d %d semitones)", ch, channel[ch].mod.pitch);			break;		case 0x17:	/* MOD Filter Cutoff Control */			channel[ch].mod.cutoff = (val - 64) * 150;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD Filter Cutoff Control (CH:%d %d cents)", ch, channel[ch].mod.cutoff);			break;		case 0x18:	/* MOD Amplitude Control */			channel[ch].mod.amp = (float)val / 64.0f - 1.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD Amplitude Control (CH:%d %.2f)", ch, channel[ch].mod.amp);			break;		case 0x19:	/* MOD LFO1 Rate Control */			channel[ch].mod.lfo1_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO1 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].mod.lfo1_rate);			break;		case 0x1A:	/* MOD LFO1 Pitch Depth */			channel[ch].mod.lfo1_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO1 Pitch Depth (CH:%d %d cents)", ch, channel[ch].mod.lfo1_pitch_depth); 			break;		case 0x1B:	/* MOD LFO1 Filter Depth */			channel[ch].mod.lfo1_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO1 Filter Depth (CH:%d %d cents)", ch, channel[ch].mod.lfo1_tvf_depth); 			break;		case 0x1C:	/* MOD LFO1 Amplitude Depth */			channel[ch].mod.lfo1_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO1 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].mod.lfo1_tva_depth); 			break;		case 0x1D:	/* MOD LFO2 Rate Control */			channel[ch].mod.lfo2_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO2 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].mod.lfo2_rate);			break;		case 0x1E:	/* MOD LFO2 Pitch Depth */			channel[ch].mod.lfo2_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO2 Pitch Depth (CH:%d %d cents)", ch, channel[ch].mod.lfo2_pitch_depth); 			break;		case 0x1F:	/* MOD LFO2 Filter Depth */			channel[ch].mod.lfo2_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO2 Filter Depth (CH:%d %d cents)", ch, channel[ch].mod.lfo2_tvf_depth); 			break;		case 0x20:	/* MOD LFO2 Amplitude Depth */			channel[ch].mod.lfo2_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MOD LFO2 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].mod.lfo2_tva_depth); 			break;		case 0x21:	/* BEND Pitch Control */			if(val > 0x58) {val = 0x58;}			else if(val < 0x28) {val = 0x28;}			channel[ch].bend.pitch = val - 64;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND Pitch Control (CH:%d %d semitones)", ch, channel[ch].bend.pitch);			break;		case 0x22:	/* BEND Filter Cutoff Control */			channel[ch].bend.cutoff = (val - 64) * 150;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND Filter Cutoff Control (CH:%d %d cents)", ch, channel[ch].bend.cutoff);			break;		case 0x23:	/* BEND Amplitude Control */			channel[ch].bend.amp = (float)val / 64.0f - 1.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND Amplitude Control (CH:%d %.2f)", ch, channel[ch].bend.amp);			break;		case 0x24:	/* BEND LFO1 Rate Control */			channel[ch].bend.lfo1_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO1 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].bend.lfo1_rate);			break;		case 0x25:	/* BEND LFO1 Pitch Depth */			channel[ch].bend.lfo1_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO1 Pitch Depth (CH:%d %d cents)", ch, channel[ch].bend.lfo1_pitch_depth); 			break;		case 0x26:	/* BEND LFO1 Filter Depth */			channel[ch].bend.lfo1_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO1 Filter Depth (CH:%d %d cents)", ch, channel[ch].bend.lfo1_tvf_depth); 			break;		case 0x27:	/* BEND LFO1 Amplitude Depth */			channel[ch].bend.lfo1_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO1 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].bend.lfo1_tva_depth); 			break;		case 0x28:	/* BEND LFO2 Rate Control */			channel[ch].bend.lfo2_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO2 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].bend.lfo2_rate);			break;		case 0x29:	/* BEND LFO2 Pitch Depth */			channel[ch].bend.lfo2_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO2 Pitch Depth (CH:%d %d cents)", ch, channel[ch].bend.lfo2_pitch_depth); 			break;		case 0x2A:	/* BEND LFO2 Filter Depth */			channel[ch].bend.lfo2_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO2 Filter Depth (CH:%d %d cents)", ch, channel[ch].bend.lfo2_tvf_depth); 			break;		case 0x2B:	/* BEND LFO2 Amplitude Depth */			channel[ch].bend.lfo2_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND LFO2 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].bend.lfo2_tva_depth); 			break;		case 0x2C:	/* CC1 Pitch Control */			if(val > 0x58) {val = 0x58;}			else if(val < 0x28) {val = 0x28;}			channel[ch].cc1.pitch = val - 64;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 Pitch Control (CH:%d %d semitones)", ch, channel[ch].cc1.pitch);			break;		case 0x2D:	/* CC1 Filter Cutoff Control */			channel[ch].cc1.cutoff = (val - 64) * 150;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 Filter Cutoff Control (CH:%d %d cents)", ch, channel[ch].cc1.cutoff);			break;		case 0x2E:	/* CC1 Amplitude Control */			channel[ch].cc1.amp = (float)val / 64.0f - 1.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 Amplitude Control (CH:%d %.2f)", ch, channel[ch].cc1.amp);			break;		case 0x2F:	/* CC1 LFO1 Rate Control */			channel[ch].cc1.lfo1_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO1 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].cc1.lfo1_rate);			break;		case 0x30:	/* CC1 LFO1 Pitch Depth */			channel[ch].cc1.lfo1_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO1 Pitch Depth (CH:%d %d cents)", ch, channel[ch].cc1.lfo1_pitch_depth); 			break;		case 0x31:	/* CC1 LFO1 Filter Depth */			channel[ch].cc1.lfo1_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO1 Filter Depth (CH:%d %d cents)", ch, channel[ch].cc1.lfo1_tvf_depth); 			break;		case 0x32:	/* CC1 LFO1 Amplitude Depth */			channel[ch].cc1.lfo1_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO1 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].cc1.lfo1_tva_depth); 			break;		case 0x33:	/* CC1 LFO2 Rate Control */			channel[ch].cc1.lfo2_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO2 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].cc1.lfo2_rate);			break;		case 0x34:	/* CC1 LFO2 Pitch Depth */			channel[ch].cc1.lfo2_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO2 Pitch Depth (CH:%d %d cents)", ch, channel[ch].cc1.lfo2_pitch_depth); 			break;		case 0x35:	/* CC1 LFO2 Filter Depth */			channel[ch].cc1.lfo2_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO2 Filter Depth (CH:%d %d cents)", ch, channel[ch].cc1.lfo2_tvf_depth); 			break;		case 0x36:	/* CC1 LFO2 Amplitude Depth */			channel[ch].cc1.lfo2_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC1 LFO2 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].cc1.lfo2_tva_depth); 			break;		case 0x37:	/* CC2 Pitch Control */			if(val > 0x58) {val = 0x58;}			else if(val < 0x28) {val = 0x28;}			channel[ch].cc2.pitch = val - 64;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 Pitch Control (CH:%d %d semitones)", ch, channel[ch].cc2.pitch);			break;		case 0x38:	/* CC2 Filter Cutoff Control */			channel[ch].cc2.cutoff = (val - 64) * 150;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 Filter Cutoff Control (CH:%d %d cents)", ch, channel[ch].cc2.cutoff);			break;		case 0x39:	/* CC2 Amplitude Control */			channel[ch].cc2.amp = (float)val / 64.0f - 1.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 Amplitude Control (CH:%d %.2f)", ch, channel[ch].cc2.amp);			break;		case 0x3A:	/* CC2 LFO1 Rate Control */			channel[ch].cc2.lfo1_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO1 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].cc2.lfo1_rate);			break;		case 0x3B:	/* CC2 LFO1 Pitch Depth */			channel[ch].cc2.lfo1_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO1 Pitch Depth (CH:%d %d cents)", ch, channel[ch].cc2.lfo1_pitch_depth); 			break;		case 0x3C:	/* CC2 LFO1 Filter Depth */			channel[ch].cc2.lfo1_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO1 Filter Depth (CH:%d %d cents)", ch, channel[ch].cc2.lfo1_tvf_depth); 			break;		case 0x3D:	/* CC2 LFO1 Amplitude Depth */			channel[ch].cc2.lfo1_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO1 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].cc2.lfo1_tva_depth); 			break;		case 0x3E:	/* CC2 LFO2 Rate Control */			channel[ch].cc2.lfo2_rate = (float)(val - 64) / 6.4f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO2 Rate Control (CH:%d %.1f Hz)", ch, channel[ch].cc2.lfo2_rate);			break;		case 0x3F:	/* CC2 LFO2 Pitch Depth */			channel[ch].cc2.lfo2_pitch_depth = conv_lfo_pitch_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO2 Pitch Depth (CH:%d %d cents)", ch, channel[ch].cc2.lfo2_pitch_depth); 			break;		case 0x40:	/* CC2 LFO2 Filter Depth */			channel[ch].cc2.lfo2_tvf_depth = conv_lfo_filter_depth(val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO2 Filter Depth (CH:%d %d cents)", ch, channel[ch].cc2.lfo2_tvf_depth); 			break;		case 0x41:	/* CC2 LFO2 Amplitude Depth */			channel[ch].cc2.lfo2_tva_depth = (float)val / 127.0f;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CC2 LFO2 Amplitude Depth (CH:%d %.2f)", ch, channel[ch].cc2.lfo2_tva_depth); 			break;		case 0x42:	/* Note Limit Low */			channel[ch].note_limit_low = val;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Note Limit Low (CH:%d VAL:%d)", ch, val); 			break;		case 0x43:	/* Note Limit High */			channel[ch].note_limit_high = val;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Note Limit High (CH:%d VAL:%d)", ch, val); 			break;		case 0x44:	/* Velocity Limit Low */			channel[ch].vel_limit_low = val;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Velocity Limit Low (CH:%d VAL:%d)", ch, val); 			break;		case 0x45:	/* Velocity Limit High */			channel[ch].vel_limit_high = val;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Velocity Limit High (CH:%d VAL:%d)", ch, val); 			break;		case 0x46:	/* Rx. Note Off */			if (channel[ch].drums[note] == NULL)				play_midi_setup_drums(ch, note);			set_rx_drum(channel[ch].drums[note], RX_NOTE_OFF, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY,				"Drum Instrument Rx. Note Off (CH:%d NOTE:%d VAL:%d)",				ch, note, val);			break;		case 0x47:	/* Rx. Note On */			if (channel[ch].drums[note] == NULL)				play_midi_setup_drums(ch, note);			set_rx_drum(channel[ch].drums[note], RX_NOTE_ON, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY,				"Drum Instrument Rx. Note On (CH:%d NOTE:%d VAL:%d)",				ch, note, val);			break;		case 0x48:	/* Rx. Pitch Bend */			set_rx(ch, RX_PITCH_BEND, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Pitch Bend (CH:%d VAL:%d)", ch, val); 			break;		case 0x49:	/* Rx. Channel Pressure */			set_rx(ch, RX_CH_PRESSURE, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Channel Pressure (CH:%d VAL:%d)", ch, val); 			break;		case 0x4A:	/* Rx. Program Change */			set_rx(ch, RX_PROGRAM_CHANGE, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Program Change (CH:%d VAL:%d)", ch, val); 			break;		case 0x4B:	/* Rx. Control Change */			set_rx(ch, RX_CONTROL_CHANGE, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Control Change (CH:%d VAL:%d)", ch, val); 			break;		case 0x4C:	/* Rx. Poly Pressure */			set_rx(ch, RX_POLY_PRESSURE, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Poly Pressure (CH:%d VAL:%d)", ch, val); 			break;		case 0x4D:	/* Rx. Note Message */			set_rx(ch, RX_NOTE_MESSAGE, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Note Message (CH:%d VAL:%d)", ch, val); 			break;		case 0x4E:	/* Rx. RPN */			set_rx(ch, RX_RPN, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. RPN (CH:%d VAL:%d)", ch, val); 			break;		case 0x4F:	/* Rx. NRPN */			set_rx(ch, RX_NRPN, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. NRPN (CH:%d VAL:%d)", ch, val); 			break;		case 0x50:	/* Rx. Modulation */			set_rx(ch, RX_MODULATION, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Modulation (CH:%d VAL:%d)", ch, val); 			break;		case 0x51:	/* Rx. Volume */			set_rx(ch, RX_VOLUME, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Volume (CH:%d VAL:%d)", ch, val); 			break;		case 0x52:	/* Rx. Panpot */			set_rx(ch, RX_PANPOT, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Panpot (CH:%d VAL:%d)", ch, val); 			break;		case 0x53:	/* Rx. Expression */			set_rx(ch, RX_EXPRESSION, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Expression (CH:%d VAL:%d)", ch, val); 			break;		case 0x54:	/* Rx. Hold1 */			set_rx(ch, RX_HOLD1, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Hold1 (CH:%d VAL:%d)", ch, val); 			break;		case 0x55:	/* Rx. Portamento */			set_rx(ch, RX_PORTAMENTO, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Portamento (CH:%d VAL:%d)", ch, val); 			break;		case 0x56:	/* Rx. Sostenuto */			set_rx(ch, RX_SOSTENUTO, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Sostenuto (CH:%d VAL:%d)", ch, val); 			break;		case 0x57:	/* Rx. Soft */			set_rx(ch, RX_SOFT, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Soft (CH:%d VAL:%d)", ch, val); 			break;		case 0x58:	/* Rx. Bank Select */			set_rx(ch, RX_BANK_SELECT, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Bank Select (CH:%d VAL:%d)", ch, val); 			break;		case 0x59:	/* Rx. Bank Select LSB */			set_rx(ch, RX_BANK_SELECT_LSB, val);			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Rx. Bank Select LSB (CH:%d VAL:%d)", ch, val); 			break;		case 0x60:	/* Reverb Type (GM2) */			if (val > 8) {val = 8;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Type (%d)", val);			set_reverb_macro_gm2(val);			recompute_reverb_status_gs();			init_reverb();			break;		case 0x61:	/* Chorus Type (GM2) */			if (val > 5) {val = 5;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Type (%d)", val);			set_chorus_macro_gs(val);			recompute_chorus_status_gs();			init_ch_chorus();			break;		default:			break;		}		return;	} else if(ev == ME_SYSEX_GS_LSB) {	/* GS system exclusive message */		msb = channel[ch].sysex_gs_msb_addr;		note = channel[ch].sysex_gs_msb_val;		channel[ch].sysex_gs_msb_addr = channel[ch].sysex_gs_msb_val = 0;		switch(b)		{		case 0x00:	/* EQ ON/OFF */			if(!opt_eq_control) {break;}			if(channel[ch].eq_gs != val) {				if(val) {					ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ ON (CH:%d)",ch);				} else {					ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ OFF (CH:%d)",ch);				}			}			channel[ch].eq_gs = val;			break;		case 0x01:	/* EQ LOW FREQ */			if(!opt_eq_control) {break;}			eq_status_gs.low_freq = val;			recompute_eq_status_gs();			ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ LOW FREQ (%d)",val);			break;		case 0x02:	/* EQ LOW GAIN */			if(!opt_eq_control) {break;}			eq_status_gs.low_gain = val;			recompute_eq_status_gs();			ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ LOW GAIN (%d dB)",val - 0x40);			break;		case 0x03:	/* EQ HIGH FREQ */			if(!opt_eq_control) {break;}			eq_status_gs.high_freq = val;			recompute_eq_status_gs();			ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ HIGH FREQ (%d)",val);			break;		case 0x04:	/* EQ HIGH GAIN */			if(!opt_eq_control) {break;}			eq_status_gs.high_gain = val;			recompute_eq_status_gs();			ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ HIGH GAIN (%d dB)",val - 0x40);			break;		case 0x05:	/* Reverb Macro */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Macro (%d)",val);			set_reverb_macro_gs(val);			recompute_reverb_status_gs();			init_reverb();			break;		case 0x06:	/* Reverb Character */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Character (%d)",val);			if (reverb_status_gs.character != val) {				reverb_status_gs.character = val;				recompute_reverb_status_gs();				init_reverb();			}			break;		case 0x07:	/* Reverb Pre-LPF */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Pre-LPF (%d)",val);			if(reverb_status_gs.pre_lpf != val) {				reverb_status_gs.pre_lpf = val;				recompute_reverb_status_gs();			}			break;		case 0x08:	/* Reverb Level */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Level (%d)",val);			if(reverb_status_gs.level != val) {				reverb_status_gs.level = val;				recompute_reverb_status_gs();				init_reverb();			}			break;		case 0x09:	/* Reverb Time */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Time (%d)",val);			if(reverb_status_gs.time != val) {				reverb_status_gs.time = val;				recompute_reverb_status_gs();				init_reverb();			}			break;		case 0x0A:	/* Reverb Delay Feedback */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Delay Feedback (%d)",val);			if(reverb_status_gs.delay_feedback != val) {				reverb_status_gs.delay_feedback = val;				recompute_reverb_status_gs();				init_reverb();			}			break;		case 0x0C:	/* Reverb Predelay Time */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Predelay Time (%d)",val);			if(reverb_status_gs.pre_delay_time != val) {				reverb_status_gs.pre_delay_time = val;				recompute_reverb_status_gs();				init_reverb();			}			break;		case 0x0D:	/* Chorus Macro */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Macro (%d)",val);			set_chorus_macro_gs(val);			recompute_chorus_status_gs();			init_ch_chorus();			break;		case 0x0E:	/* Chorus Pre-LPF */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Pre-LPF (%d)",val);			if (chorus_status_gs.pre_lpf != val) {				chorus_status_gs.pre_lpf = val;				recompute_chorus_status_gs();			}			break;		case 0x0F:	/* Chorus Level */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Level (%d)",val);			if (chorus_status_gs.level != val) {				chorus_status_gs.level = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x10:	/* Chorus Feedback */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Feedback (%d)",val);			if (chorus_status_gs.feedback != val) {				chorus_status_gs.feedback = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x11:	/* Chorus Delay */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Delay (%d)",val);			if (chorus_status_gs.delay != val) {				chorus_status_gs.delay = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x12:	/* Chorus Rate */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Rate (%d)",val);			if (chorus_status_gs.rate != val) {				chorus_status_gs.rate = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x13:	/* Chorus Depth */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Depth (%d)",val);			if (chorus_status_gs.depth != val) {				chorus_status_gs.depth = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x14:	/* Chorus Send Level to Reverb */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Send Level to Reverb (%d)",val);			if (chorus_status_gs.send_reverb != val) {				chorus_status_gs.send_reverb = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x15:	/* Chorus Send Level to Delay */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Send Level to Delay (%d)",val);			if (chorus_status_gs.send_delay != val) {				chorus_status_gs.send_delay = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x16:	/* Delay Macro */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Macro (%d)",val);			set_delay_macro_gs(val);			recompute_delay_status_gs();			init_ch_delay();			break;		case 0x17:	/* Delay Pre-LPF */			if (val > 7) {val = 7;}			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Pre-LPF (%d)",val);			val &= 0x7;			if (delay_status_gs.pre_lpf != val) {				delay_status_gs.pre_lpf = val;				recompute_delay_status_gs();			}			break;		case 0x18:	/* Delay Time Center */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Time Center (%d)",val);			if (delay_status_gs.time_c != val) {				delay_status_gs.time_c = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x19:	/* Delay Time Ratio Left */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Time Ratio Left (%d)",val);			if (val == 0) {val = 1;}			if (delay_status_gs.time_l != val) {				delay_status_gs.time_l = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x1A:	/* Delay Time Ratio Right */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Time Ratio Right (%d)",val);			if (val == 0) {val = 1;}			if (delay_status_gs.time_r != val) {				delay_status_gs.time_r = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x1B:	/* Delay Level Center */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Level Center (%d)",val);			if (delay_status_gs.level_center != val) {				delay_status_gs.level_center = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x1C:	/* Delay Level Left */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Level Left (%d)",val);			if (delay_status_gs.level_left != val) {				delay_status_gs.level_left = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x1D:	/* Delay Level Right */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Level Right (%d)",val);			if (delay_status_gs.level_right != val) {				delay_status_gs.level_right = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x1E:	/* Delay Level */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Level (%d)",val);			if (delay_status_gs.level != val) {				delay_status_gs.level = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x1F:	/* Delay Feedback */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Feedback (%d)",val);			if (delay_status_gs.feedback != val) {				delay_status_gs.feedback = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x20:	/* Delay Send Level to Reverb */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Delay Send Level to Reverb (%d)",val);			if (delay_status_gs.send_reverb = val) {				delay_status_gs.send_reverb = val;				recompute_delay_status_gs();				init_ch_delay();			}			break;		case 0x21:	/* Velocity Sense Depth */			channel[ch].velocity_sense_depth = val;			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Velocity Sense Depth (CH:%d VAL:%d)",ch,val);			break;		case 0x22:	/* Velocity Sense Offset */			channel[ch].velocity_sense_offset = val;			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Velocity Sense Offset (CH:%d VAL:%d)",ch,val);			break;		case 0x23:	/* Insertion Effect ON/OFF */			if(!opt_insertion_effect) {break;}			if(channel[ch].insertion_effect != val) {				if(val) {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EFX ON (CH:%d)",ch);}				else {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EFX OFF (CH:%d)",ch);}			}			channel[ch].insertion_effect = val;			break;		case 0x24:	/* Assign Mode */			channel[ch].assign_mode = val;			if(val == 0) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"Assign Mode: Single (CH:%d)",ch);			} else if(val == 1) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"Assign Mode: Limited-Multi (CH:%d)",ch);			} else if(val == 2) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"Assign Mode: Full-Multi (CH:%d)",ch);			}			break;		case 0x25:	/* TONE MAP-0 NUMBER */			channel[ch].tone_map0_number = val;			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Tone Map-0 Number (CH:%d VAL:%d)",ch,val);			break;		case 0x26:	/* Pitch Offset Fine */			channel[ch].pitch_offset_fine = (FLOAT_T)((((int32)val << 4) | (int32)val) - 0x80) / 10.0;			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Pitch Offset Fine (CH:%d %3fHz)",ch,channel[ch].pitch_offset_fine);			break;		case 0x27:	/* Insertion Effect Parameter */			if(!opt_insertion_effect) {break;}			temp = insertion_effect_gs.type;			insertion_effect_gs.type_msb = val;			insertion_effect_gs.type = ((int32)insertion_effect_gs.type_msb << 8) | (int32)insertion_effect_gs.type_lsb;			if(temp == insertion_effect_gs.type) {				recompute_insertion_effect_gs();			} else {				realloc_insertion_effect_gs();			}			break;		case 0x28:	/* Insertion Effect Parameter */			if(!opt_insertion_effect) {break;}			temp = insertion_effect_gs.type;			insertion_effect_gs.type_lsb = val;			insertion_effect_gs.type = ((int32)insertion_effect_gs.type_msb << 8) | (int32)insertion_effect_gs.type_lsb;			if(temp == insertion_effect_gs.type) {				recompute_insertion_effect_gs();			} else {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "EFX TYPE (%02X %02X)", insertion_effect_gs.type_msb, insertion_effect_gs.type_lsb);				realloc_insertion_effect_gs();			}			break;		case 0x29:			insertion_effect_gs.parameter[0] = val;			recompute_insertion_effect_gs();			break;		case 0x2A:			insertion_effect_gs.parameter[1] = val;			recompute_insertion_effect_gs();			break;		case 0x2B:			insertion_effect_gs.parameter[2] = val;			recompute_insertion_effect_gs();			break;		case 0x2C:			insertion_effect_gs.parameter[3] = val;			recompute_insertion_effect_gs();			break;		case 0x2D:			insertion_effect_gs.parameter[4] = val;			recompute_insertion_effect_gs();			break;		case 0x2E:			insertion_effect_gs.parameter[5] = val;			recompute_insertion_effect_gs();			break;		case 0x2F:			insertion_effect_gs.parameter[6] = val;			recompute_insertion_effect_gs();			break;		case 0x30:			insertion_effect_gs.parameter[7] = val;			recompute_insertion_effect_gs();			break;		case 0x31:			insertion_effect_gs.parameter[8] = val;			recompute_insertion_effect_gs();			break;		case 0x32:			insertion_effect_gs.parameter[9] = val;			recompute_insertion_effect_gs();			break;		case 0x33:			insertion_effect_gs.parameter[10] = val;			recompute_insertion_effect_gs();			break;		case 0x34:			insertion_effect_gs.parameter[11] = val;			recompute_insertion_effect_gs();			break;		case 0x35:			insertion_effect_gs.parameter[12] = val;			recompute_insertion_effect_gs();			break;		case 0x36:			insertion_effect_gs.parameter[13] = val;			recompute_insertion_effect_gs();			break;		case 0x37:			insertion_effect_gs.parameter[14] = val;			recompute_insertion_effect_gs();			break;		case 0x38:			insertion_effect_gs.parameter[15] = val;			recompute_insertion_effect_gs();			break;		case 0x39:			insertion_effect_gs.parameter[16] = val;			recompute_insertion_effect_gs();			break;		case 0x3A:			insertion_effect_gs.parameter[17] = val;			recompute_insertion_effect_gs();			break;		case 0x3B:			insertion_effect_gs.parameter[18] = val;			recompute_insertion_effect_gs();			break;		case 0x3C:			insertion_effect_gs.parameter[19] = val;			recompute_insertion_effect_gs();			break;		case 0x3D:			insertion_effect_gs.send_reverb = val;			recompute_insertion_effect_gs();			break;		case 0x3E:			insertion_effect_gs.send_chorus = val;			recompute_insertion_effect_gs();			break;		case 0x3F:			insertion_effect_gs.send_delay = val;			recompute_insertion_effect_gs();			break;		case 0x40:			insertion_effect_gs.control_source1 = val;			recompute_insertion_effect_gs();			break;		case 0x41:			insertion_effect_gs.control_depth1 = val;			recompute_insertion_effect_gs();			break;		case 0x42:			insertion_effect_gs.control_source2 = val;			recompute_insertion_effect_gs();			break;		case 0x43:			insertion_effect_gs.control_depth2 = val;			recompute_insertion_effect_gs();			break;		case 0x44:			insertion_effect_gs.send_eq_switch = val;			recompute_insertion_effect_gs();			break;		case 0x45:	/* Rx. Channel */			reset_controllers(ch);			redraw_controllers(ch);			all_notes_off(ch);			if (val == 0x80)				remove_channel_layer(ch);			else				add_channel_layer(ch, val);			break;		case 0x46:	/* Channel Msg Rx Port */			reset_controllers(ch);			redraw_controllers(ch);			all_notes_off(ch);			channel[ch].port_select = val;			break;		case 0x47:	/* Play Note Number */			if (channel[ch].drums[note] == NULL)				play_midi_setup_drums(ch, note);			channel[ch].drums[note]->play_note = val;			ctl->cmsg(CMSG_INFO, VERB_NOISY,				"Drum Instrument Play Note (CH:%d NOTE:%d VAL:%d)",				ch, note, channel[ch].drums[note]->play_note);			channel[ch].pitchfactor = 0;			break;		default:			break;		}		return;	} else if(ev == ME_SYSEX_XG_LSB) {	/* XG system exclusive message */		msb = channel[ch].sysex_xg_msb_addr;		note = channel[ch].sysex_xg_msb_val;		channel[ch].sysex_xg_msb_addr = channel[ch].sysex_xg_msb_val = 0;		if (msb == 2) {	/* Effect 2 */		if (note >= XG_INSERTION_EFFECT_NUM || note < 0) {return;}		switch(b)		{		case 0x00:	/* Insertion Effect Type MSB */			if (insertion_effect_xg[note].type_msb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Type MSB (%d %02X)", note, val);				insertion_effect_xg[note].type_msb = val;				realloc_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x01:	/* Insertion Effect Type LSB */			if (insertion_effect_xg[note].type_lsb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Type LSB (%d %02X)", note, val);				insertion_effect_xg[note].type_lsb = val;				realloc_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x02:	/* Insertion Effect Parameter 1 - 10 */		case 0x03:		case 0x04:		case 0x05:		case 0x06:		case 0x07:		case 0x08:		case 0x09:		case 0x0A:		case 0x0B:			if (insertion_effect_xg[note].use_msb) {break;}			temp = b - 0x02;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Parameter %d (%d %d)", temp + 1, note, val);			if (insertion_effect_xg[note].param_lsb[temp] != val) {				insertion_effect_xg[note].param_lsb[temp] = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x0C:	/* Insertion Effect Part */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Part (%d %d)", note, val);			if (insertion_effect_xg[note].part != val) {				insertion_effect_xg[note].part = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x0D:	/* MW Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MW Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].mw_depth != val) {				insertion_effect_xg[note].mw_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x0E:	/* BEND Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].bend_depth != val) {				insertion_effect_xg[note].bend_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x0F:	/* CAT Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAT Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].cat_depth != val) {				insertion_effect_xg[note].cat_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x10:	/* AC1 Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "AC1 Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].ac1_depth != val) {				insertion_effect_xg[note].ac1_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x11:	/* AC2 Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "AC2 Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].ac2_depth != val) {				insertion_effect_xg[note].ac2_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x12:	/* CBC1 Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CBC1 Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].cbc1_depth != val) {				insertion_effect_xg[note].cbc1_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x13:	/* CBC2 Insertion Control Depth */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CBC2 Insertion Control Depth (%d %d)", note, val);			if (insertion_effect_xg[note].cbc2_depth != val) {				insertion_effect_xg[note].cbc2_depth = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x20:	/* Insertion Effect Parameter 11 - 16 */		case 0x21:		case 0x22:		case 0x23:		case 0x24:		case 0x25:			temp = b - 0x20 + 10;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Parameter %d (%d %d)", temp + 1, note, val);			if (insertion_effect_xg[note].param_lsb[temp] != val) {				insertion_effect_xg[note].param_lsb[temp] = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x30:	/* Insertion Effect Parameter 1 - 10 MSB */		case 0x32:		case 0x34:		case 0x36:		case 0x38:		case 0x3A:		case 0x3C:		case 0x3E:		case 0x40:		case 0x42:			if (!insertion_effect_xg[note].use_msb) {break;}			temp = (b - 0x30) / 2;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Parameter %d MSB (%d %d)", temp + 1, note, val);			if (insertion_effect_xg[note].param_msb[temp] != val) {				insertion_effect_xg[note].param_msb[temp] = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		case 0x31:	/* Insertion Effect Parameter 1 - 10 LSB */		case 0x33:		case 0x35:		case 0x37:		case 0x39:		case 0x3B:		case 0x3D:		case 0x3F:		case 0x41:		case 0x43:			if (!insertion_effect_xg[note].use_msb) {break;}			temp = (b - 0x31) / 2;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Insertion Effect Parameter %d LSB (%d %d)", temp + 1, note, val);			if (insertion_effect_xg[note].param_lsb[temp] != val) {				insertion_effect_xg[note].param_lsb[temp] = val;				recompute_effect_xg(&insertion_effect_xg[note]);			}			break;		default:			break;		}		} else if (msb == 1) {	/* Effect 1 */		switch(b)		{		case 0x00:	/* Reverb Type MSB */			if (reverb_status_xg.type_msb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Type MSB (%02X)", val);				reverb_status_xg.type_msb = val;				realloc_effect_xg(&reverb_status_xg);			}			break;		case 0x01:	/* Reverb Type LSB */			if (reverb_status_xg.type_lsb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Type LSB (%02X)", val);				reverb_status_xg.type_lsb = val;				realloc_effect_xg(&reverb_status_xg);			}			break;		case 0x02:	/* Reverb Parameter 1 - 10 */		case 0x03:		case 0x04:		case 0x05:		case 0x06:		case 0x07:		case 0x08:		case 0x09:		case 0x0A:		case 0x0B:			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Parameter %d (%d)", b - 0x02 + 1, val);			if (reverb_status_xg.param_lsb[b - 0x02] != val) {				reverb_status_xg.param_lsb[b - 0x02] = val;				recompute_effect_xg(&reverb_status_xg);			}			break;		case 0x0C:	/* Reverb Return */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Return (%d)", val);			if (reverb_status_xg.ret != val) {				reverb_status_xg.ret = val;				recompute_effect_xg(&reverb_status_xg);			}			break;		case 0x0D:	/* Reverb Pan */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Pan (%d)", val);			if (reverb_status_xg.pan != val) {				reverb_status_xg.pan = val;				recompute_effect_xg(&reverb_status_xg);			}			break;		case 0x10:	/* Reverb Parameter 11 - 16 */		case 0x11:		case 0x12:		case 0x13:		case 0x14:		case 0x15:			temp = b - 0x10 + 10;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Reverb Parameter %d (%d)", temp + 1, val);			if (reverb_status_xg.param_lsb[temp] != val) {				reverb_status_xg.param_lsb[temp] = val;				recompute_effect_xg(&reverb_status_xg);			}			break;		case 0x20:	/* Chorus Type MSB */			if (chorus_status_xg.type_msb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Type MSB (%02X)", val);				chorus_status_xg.type_msb = val;				realloc_effect_xg(&chorus_status_xg);			}			break;		case 0x21:	/* Chorus Type LSB */			if (chorus_status_xg.type_lsb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Type LSB (%02X)", val);				chorus_status_xg.type_lsb = val;				realloc_effect_xg(&chorus_status_xg);			}			break;		case 0x22:	/* Chorus Parameter 1 - 10 */		case 0x23:		case 0x24:		case 0x25:		case 0x26:		case 0x27:		case 0x28:		case 0x29:		case 0x2A:		case 0x2B:			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Parameter %d (%d)", b - 0x22 + 1, val);			if (chorus_status_xg.param_lsb[b - 0x22] != val) {				chorus_status_xg.param_lsb[b - 0x22] = val;				recompute_effect_xg(&chorus_status_xg);			}			break;		case 0x2C:	/* Chorus Return */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Return (%d)", val);			if (chorus_status_xg.ret != val) {				chorus_status_xg.ret = val;				recompute_effect_xg(&chorus_status_xg);			}			break;		case 0x2D:	/* Chorus Pan */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Pan (%d)", val);			if (chorus_status_xg.pan != val) {				chorus_status_xg.pan = val;				recompute_effect_xg(&chorus_status_xg);			}			break;		case 0x2E:	/* Send Chorus To Reverb */			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Send Chorus To Reverb (%d)", val);			if (chorus_status_xg.send_reverb != val) {				chorus_status_xg.send_reverb = val;				recompute_effect_xg(&chorus_status_xg);			}			break;		case 0x30:	/* Chorus Parameter 11 - 16 */		case 0x31:		case 0x32:		case 0x33:		case 0x34:		case 0x35:			temp = b - 0x30 + 10;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Chorus Parameter %d (%d)", temp + 1, val);			if (chorus_status_xg.param_lsb[temp] != val) {				chorus_status_xg.param_lsb[temp] = val;				recompute_effect_xg(&chorus_status_xg);			}			break;		case 0x40:	/* Variation Type MSB */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			if (variation_effect_xg[note].type_msb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Type MSB (%02X)", val);				variation_effect_xg[note].type_msb = val;				realloc_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x41:	/* Variation Type LSB */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			if (variation_effect_xg[note].type_lsb != val) {				ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Type LSB (%02X)", val);				variation_effect_xg[note].type_lsb = val;				realloc_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x42:	/* Variation Parameter 1 - 10 MSB */		case 0x44:		case 0x46:		case 0x48:		case 0x4A:		case 0x4C:		case 0x4E:		case 0x50:		case 0x52:		case 0x54:			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			temp = (b - 0x42) / 2;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Parameter %d MSB (%d)", temp, val);			if (variation_effect_xg[note].param_msb[temp] != val) {				variation_effect_xg[note].param_msb[temp] = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x43:	/* Variation Parameter 1 - 10 LSB */		case 0x45:		case 0x47:		case 0x49:		case 0x4B:		case 0x4D:		case 0x4F:		case 0x51:		case 0x53:		case 0x55:			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			temp = (b - 0x43) / 2;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Parameter %d LSB (%d)", temp, val);			if (variation_effect_xg[note].param_lsb[temp] != val) {				variation_effect_xg[note].param_lsb[temp] = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x56:	/* Variation Return */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Return (%d)", val);			if (variation_effect_xg[note].ret != val) {				variation_effect_xg[note].ret = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x57:	/* Variation Pan */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Pan (%d)", val);			if (variation_effect_xg[note].pan != val) {				variation_effect_xg[note].pan = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x58:	/* Send Variation To Reverb */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Send Variation To Reverb (%d)", val);			if (variation_effect_xg[note].send_reverb != val) {				variation_effect_xg[note].send_reverb = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x59:	/* Send Variation To Chorus */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Send Variation To Chorus (%d)", val);			if (variation_effect_xg[note].send_chorus != val) {				variation_effect_xg[note].send_chorus = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x5A:	/* Variation Connection */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Connection (%d)", val);			if (variation_effect_xg[note].connection != val) {				variation_effect_xg[note].connection = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x5B:	/* Variation Part */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Part (%d)", val);			if (variation_effect_xg[note].part != val) {				variation_effect_xg[note].part = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x5C:	/* MW Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "MW Variation Control Depth (%d)", val);			if (variation_effect_xg[note].mw_depth != val) {				variation_effect_xg[note].mw_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x5D:	/* BEND Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "BEND Variation Control Depth (%d)", val);			if (variation_effect_xg[note].bend_depth != val) {				variation_effect_xg[note].bend_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x5E:	/* CAT Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CAT Variation Control Depth (%d)", val);			if (variation_effect_xg[note].cat_depth != val) {				variation_effect_xg[note].cat_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x5F:	/* AC1 Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "AC1 Variation Control Depth (%d)", val);			if (variation_effect_xg[note].ac1_depth != val) {				variation_effect_xg[note].ac1_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x60:	/* AC2 Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "AC2 Variation Control Depth (%d)", val);			if (variation_effect_xg[note].ac2_depth != val) {				variation_effect_xg[note].ac2_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x61:	/* CBC1 Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CBC1 Variation Control Depth (%d)", val);			if (variation_effect_xg[note].cbc1_depth != val) {				variation_effect_xg[note].cbc1_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x62:	/* CBC2 Variation Control Depth */			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "CBC2 Variation Control Depth (%d)", val);			if (variation_effect_xg[note].cbc2_depth != val) {				variation_effect_xg[note].cbc2_depth = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		case 0x70:	/* Variation Parameter 11 - 16 */		case 0x71:		case 0x72:		case 0x73:		case 0x74:		case 0x75:			temp = b - 0x70 + 10;			if (note >= XG_VARIATION_EFFECT_NUM || note < 0) {break;}			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Variation Parameter %d (%d)", temp + 1, val);			if (variation_effect_xg[note].param_lsb[temp] != val) {				variation_effect_xg[note].param_lsb[temp] = val;				recompute_effect_xg(&variation_effect_xg[note]);			}			break;		default:			break;		}		} else if (msb == 0) {		switch(b)		{		case 0x00:	/* Reverb Return */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Reverb Return (%d)", val);			if (reverb_status_gs.level != val) {				reverb_status_gs.level = val;				recompute_reverb_status_gs();				init_reverb();			}			break;		case 0x01:	/* Chorus Return */			ctl->cmsg(CMSG_INFO,VERB_NOISY,"Chorus Return (%d)", val);			if (chorus_status_gs.level != val) {				chorus_status_gs.level = val;				recompute_chorus_status_gs();				init_ch_chorus();			}			break;		case 0x50:	/* EQ type */			if(opt_eq_control) {				if(val == 0) {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ type (0: Flat)");}				else if(val == 1) {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ type (1: Jazz)");}				else if(val == 2) {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ type (2: Pops)");}				else if(val == 3) {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ type (3: Rock)");}				else if(val == 4) {ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ type (4: Concert)");}				multi_eq_xg.type = val;				set_multi_eq_type_xg(val);				recompute_multi_eq_xg();			}			break;		case 0x51:	/* EQ gain1 */			if(opt_eq_control) {				if(val > 0x4C) {val = 0x4C;}				else if(val < 0x34) {val = 0x34;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ gain1 (%d dB)", val - 0x40);				multi_eq_xg.gain1 = val;				recompute_multi_eq_xg();			}			break;		case 0x52:	/* EQ frequency1 */			if(opt_eq_control) {				if(val > 60) {val = 60;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ frequency1 (%d Hz)", (int32)eq_freq_table_xg[val]);				multi_eq_xg.freq1 = val;				recompute_multi_eq_xg();			}			break;		case 0x53:	/* EQ Q1 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ Q1 (%f)", (double)val / 10.0);				multi_eq_xg.q1 = val;				recompute_multi_eq_xg();			}			break;		case 0x54:	/* EQ shape1 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ shape1 (%d)", val);				multi_eq_xg.shape1 = val;				recompute_multi_eq_xg();			}			break;		case 0x55:	/* EQ gain2 */			if(opt_eq_control) {				if(val > 0x4C) {val = 0x4C;}				else if(val < 0x34) {val = 0x34;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ gain2 (%d dB)", val - 0x40);				multi_eq_xg.gain2 = val;				recompute_multi_eq_xg();			}			break;		case 0x56:	/* EQ frequency2 */			if(opt_eq_control) {				if(val > 60) {val = 60;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ frequency2 (%d Hz)", (int32)eq_freq_table_xg[val]);				multi_eq_xg.freq2 = val;				recompute_multi_eq_xg();			}			break;		case 0x57:	/* EQ Q2 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ Q2 (%f)", (double)val / 10.0);				multi_eq_xg.q2 = val;				recompute_multi_eq_xg();			}			break;		case 0x59:	/* EQ gain3 */			if(opt_eq_control) {				if(val > 0x4C) {val = 0x4C;}				else if(val < 0x34) {val = 0x34;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ gain3 (%d dB)", val - 0x40);				multi_eq_xg.gain3 = val;				recompute_multi_eq_xg();			}			break;		case 0x5A:	/* EQ frequency3 */			if(opt_eq_control) {				if(val > 60) {val = 60;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ frequency3 (%d Hz)", (int32)eq_freq_table_xg[val]);				multi_eq_xg.freq3 = val;				recompute_multi_eq_xg();			}			break;		case 0x5B:	/* EQ Q3 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ Q3 (%f)", (double)val / 10.0);				multi_eq_xg.q3 = val;				recompute_multi_eq_xg();			}			break;		case 0x5D:	/* EQ gain4 */			if(opt_eq_control) {				if(val > 0x4C) {val = 0x4C;}				else if(val < 0x34) {val = 0x34;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ gain4 (%d dB)", val - 0x40);				multi_eq_xg.gain4 = val;				recompute_multi_eq_xg();			}			break;		case 0x5E:	/* EQ frequency4 */			if(opt_eq_control) {				if(val > 60) {val = 60;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ frequency4 (%d Hz)", (int32)eq_freq_table_xg[val]);				multi_eq_xg.freq4 = val;				recompute_multi_eq_xg();			}			break;		case 0x5F:	/* EQ Q4 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ Q4 (%f)", (double)val / 10.0);				multi_eq_xg.q4 = val;				recompute_multi_eq_xg();			}			break;		case 0x61:	/* EQ gain5 */			if(opt_eq_control) {				if(val > 0x4C) {val = 0x4C;}				else if(val < 0x34) {val = 0x34;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ gain5 (%d dB)", val - 0x40);				multi_eq_xg.gain5 = val;				recompute_multi_eq_xg();			}			break;		case 0x62:	/* EQ frequency5 */			if(opt_eq_control) {				if(val > 60) {val = 60;}				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ frequency5 (%d Hz)", (int32)eq_freq_table_xg[val]);				multi_eq_xg.freq5 = val;				recompute_multi_eq_xg();			}			break;		case 0x63:	/* EQ Q5 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ Q5 (%f)", (double)val / 10.0);				multi_eq_xg.q5 = val;				recompute_multi_eq_xg();			}			break;		case 0x64:	/* EQ shape5 */			if(opt_eq_control) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"EQ shape5 (%d)", val);				multi_eq_xg.shape5 = val;				recompute_multi_eq_xg();			}			break;		case 0x65:	/* Rcv CHANNEL */			reset_controllers(ch);			redraw_controllers(ch);			all_notes_off(ch);			if (val == 0x7f)				remove_channel_layer(ch);			else {				if((ch < REDUCE_CHANNELS) != (val < REDUCE_CHANNELS)) {					channel[ch].port_select = ch < REDUCE_CHANNELS ? 1 : 0;				}				if((ch % REDUCE_CHANNELS) != (val % REDUCE_CHANNELS)) {					add_channel_layer(ch, val);				}			}			break;		case 0x66:	/* Same Note Number Key On Assign */			if(val == 0) {				channel[ch].assign_mode = 0;				ctl->cmsg(CMSG_INFO,VERB_NOISY,"Same Note Number Key On Assign: Single (CH:%d)",ch);			} else if(val == 1) {				channel[ch].assign_mode = 2;				ctl->cmsg(CMSG_INFO,VERB_NOISY,"Same Note Number Key On Assign: Multi (CH:%d)",ch);			} else if(val == 2) {				ctl->cmsg(CMSG_INFO,VERB_NOISY,"Same Note Number Key On Assign: Inst is not supported. (CH:%d)",ch);			}			break;		case 0x67:	/* Dry Level */			channel[ch].dry_level = val;			ctl->cmsg(CMSG_INFO, VERB_NOISY, "Dry Level (CH:%d VAL:%d)", ch, val);			break;		case 0x68:	/* EG Decay1 */			if (channel[ch].drums[note] == NULL)				play_midi_setup_drums(ch, note);			ctl->cmsg(CMSG_INFO, VERB_NOISY,				"Drum Instrument EG Decay1 (CH:%d NOTE:%d VAL:%d)",				ch, note, val);			channel[ch].drums[note]->drum_envelope_rate[EG_DECAY1] = val;			break;		case 0x69:	/* EG Decay2 */			if (channel[ch].drums[note] == NULL)				play_midi_setup_drums(ch, note);			ctl->cmsg(CMSG_INFO, VERB_NOISY,				"Drum Instrument EG Decay2 (CH:%d NOTE:%d VAL:%d)",				ch, note, val);			channel[ch].drums[note]->drum_envelope_rate[EG_DECAY2] = val;			break;		default:			break;		}		}		return;	}}