1 /*
2 TiMidity++ -- MIDI to WAVE converter and player
3 Copyright (C) 1999-2009 Masanao Izumo <iz@onicos.co.jp>
4 Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
5 
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 
24 #include "timidity.h"
25 #include "instrum.h"
26 #include "playmidi.h"
27 
28 namespace TimidityPlus
29 {
30 
31 
32 inline void SETMIDIEVENT(MidiEvent &e, int32_t /*time, not needed anymore*/, uint32_t t, uint32_t ch, uint32_t pa, uint32_t pb)
33 {
34 	(e).type = (t);
35 	(e).channel = (uint8_t)(ch);
36 	(e).a = (uint8_t)(pa);
37 	(e).b = (uint8_t)(pb);
38 }
39 
40 #define MERGE_CHANNEL_PORT(ch) ((int)(ch) | (midi_port_number << 4))
41 #define MERGE_CHANNEL_PORT2(ch, port) ((int)(ch) | ((int)port << 4))
42 
43 /* Map XG types onto GS types.  XG should eventually have its own tables */
44 static int set_xg_reverb_type(int msb, int lsb)
45 {
46 	int type = 4;
47 
48 	if ((msb == 0x00) ||
49 		(msb >= 0x05 && msb <= 0x0F) ||
50 		(msb >= 0x14))			/* NO EFFECT */
51 	{
52 		//printMessage(CMSG_INFO,VERB_NOISY,"XG Set Reverb Type (NO EFFECT %d %d)", msb, lsb);
53 		return -1;
54 	}
55 
56 	switch (msb)
57 	{
58 	case 0x01:
59 		type = 3;			/* Hall 1 */
60 		break;
61 	case 0x02:
62 		type = 0;			/* Room 1 */
63 		break;
64 	case 0x03:
65 		type = 3;			/* Stage 1 -> Hall 1 */
66 		break;
67 	case 0x04:
68 		type = 5;			/* Plate */
69 		break;
70 	default:
71 		type = 4;			/* unsupported -> Hall 2 */
72 		break;
73 	}
74 	if (lsb == 0x01)
75 	{
76 		switch (msb)
77 		{
78 		case 0x01:
79 			type = 4;			/* Hall 2 */
80 			break;
81 		case 0x02:
82 			type = 1;			/* Room 2 */
83 			break;
84 		case 0x03:
85 			type = 4;			/* Stage 2 -> Hall 2 */
86 			break;
87 		default:
88 			break;
89 		}
90 	}
91 	if (lsb == 0x02 && msb == 0x02)
92 		type = 2;				/* Room 3 */
93 
94 	//printMessage(CMSG_INFO,VERB_NOISY,"XG Set Reverb Type (%d)", type);
95 	return type;
96 }
97 
98 
99 /* Map XG types onto GS types.  XG should eventually have its own tables */
100 static int set_xg_chorus_type(int msb, int lsb)
101 {
102 	int type = 2;
103 
104 	if ((msb >= 0x00 && msb <= 0x40) ||
105 		(msb >= 0x45 && msb <= 0x47) ||
106 		(msb >= 0x49))			/* NO EFFECT */
107 	{
108 		//printMessage(CMSG_INFO,VERB_NOISY,"XG Set Chorus Type (NO EFFECT %d %d)", msb, lsb);
109 		return -1;
110 	}
111 
112 	switch (msb)
113 	{
114 	case 0x41:
115 		type = 0;			/* Chorus 1 */
116 		break;
117 	case 0x42:
118 		type = 0;			/* Celeste 1 -> Chorus 1 */
119 		break;
120 	case 0x43:
121 		type = 5;
122 		break;
123 	default:
124 		type = 2;			/* unsupported -> Chorus 3 */
125 		break;
126 	}
127 	if (lsb == 0x01)
128 	{
129 		switch (msb)
130 		{
131 		case 0x41:
132 			type = 1;			/* Chorus 2 */
133 			break;
134 		case 0x42:
135 			type = 1;			/* Celeste 2 -> Chorus 2 */
136 			break;
137 		default:
138 			break;
139 		}
140 	}
141 	else if (lsb == 0x02)
142 	{
143 		switch (msb)
144 		{
145 		case 0x41:
146 			type = 2;			/* Chorus 3 */
147 			break;
148 		case 0x42:
149 			type = 2;			/* Celeste 3 -> Chorus 3 */
150 			break;
151 		default:
152 			break;
153 		}
154 	}
155 	else if (lsb == 0x08)
156 	{
157 		switch (msb)
158 		{
159 		case 0x41:
160 			type = 3;			/* Chorus 4 */
161 			break;
162 		case 0x42:
163 			type = 3;			/* Celeste 4 -> Chorus 4 */
164 			break;
165 		default:
166 			break;
167 		}
168 	}
169 
170 	//printMessage(CMSG_INFO,VERB_NOISY,"XG Set Chorus Type (%d)", type);
171 	return type;
172 }
173 
174 static int block_to_part(int block, int port)
175 {
176 	int p;
177 	p = block & 0x0F;
178 	if (p == 0) { p = 9; }
179 	else if (p <= 9) { p--; }
180 	return MERGE_CHANNEL_PORT2(p, port);
181 }
182 
183 static uint16_t gs_convert_master_vol(int vol)
184 {
185 	double v;
186 
187 	if (vol >= 0x7f)
188 		return 0xffff;
189 	v = (double)vol * (0xffff / 127.0);
190 	if (v >= 0xffff)
191 		return 0xffff;
192 	return (uint16_t)v;
193 }
194 
195 static uint16_t gm_convert_master_vol(uint16_t v1, uint16_t v2)
196 {
197 	return (((v1 & 0x7f) | ((v2 & 0x7f) << 7)) << 2) | 3;
198 }
199 
200 
201 /* XG SysEx parsing function by Eric A. Welsh
202 * Also handles GS patch+bank changes
203 *
204 * This function provides basic support for XG Bulk Dump and Parameter
205 * Change SysEx events
206 */
207 int SysexConvert::parse_sysex_event_multi(const uint8_t *val, int32_t len, MidiEvent *evm, Instruments *instruments)
208 {
209 	int num_events = 0;				/* Number of events added */
210 
211 	uint32_t channel_tt;
212 	int i, j;
213 	static uint8_t xg_reverb_type_msb = 0x01, xg_reverb_type_lsb = 0x00;
214 	static uint8_t xg_chorus_type_msb = 0x41, xg_chorus_type_lsb = 0x00;
215 
216 	/* Effect 1 or Multi EQ */
217 	if (len >= 8 &&
218 		val[0] == 0x43 && /* Yamaha ID */
219 		val[2] == 0x4C && /* XG Model ID */
220 		((val[1] <  0x10 && val[5] == 0x02) ||	/* Bulk Dump*/
221 		(val[1] >= 0x10 && val[3] == 0x02)))	/* Parameter Change */
222 	{
223 		uint8_t addhigh, addmid, addlow;		/* Addresses */
224 		const uint8_t *body;				/* SysEx body */
225 		int ent, v;				/* Entry # of sub-event */
226 		const uint8_t *body_end;			/* End of SysEx body */
227 
228 		if (val[1] < 0x10)	/* Bulk Dump */
229 		{
230 			addhigh = val[5];
231 			addmid = val[6];
232 			addlow = val[7];
233 			body = val + 8;
234 			body_end = val + len - 3;
235 		}
236 		else			/* Parameter Change */
237 		{
238 			addhigh = val[3];
239 			addmid = val[4];
240 			addlow = val[5];
241 			body = val + 6;
242 			body_end = val + len - 2;
243 		}
244 
245 		/* set the SYSEX_XG_MSB info */
246 		SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_MSB, 0, addhigh, addmid);
247 		num_events++;
248 
249 		for (ent = addlow; body <= body_end; body++, ent++) {
250 			if (addmid == 0x01) {	/* Effect 1 */
251 				switch (ent) {
252 				case 0x00:	/* Reverb Type MSB */
253 					xg_reverb_type_msb = *body;
254 #if 0	/* XG specific reverb is not supported yet, use GS instead */
255 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
256 					num_events++;
257 #endif
258 					break;
259 
260 				case 0x01:	/* Reverb Type LSB */
261 					xg_reverb_type_lsb = *body;
262 #if 0	/* XG specific reverb is not supported yet, use GS instead */
263 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
264 					num_events++;
265 #else
266 					v = set_xg_reverb_type(xg_reverb_type_msb, xg_reverb_type_lsb);
267 					if (v >= 0) {
268 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, v, 0x05);
269 						num_events++;
270 					}
271 #endif
272 					break;
273 
274 				case 0x0C:	/* Reverb Return */
275 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
276 					num_events++;
277 					break;
278 
279 				case 0x20:	/* Chorus Type MSB */
280 					xg_chorus_type_msb = *body;
281 #if 0	/* XG specific chorus is not supported yet, use GS instead */
282 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
283 					num_events++;
284 #endif
285 					break;
286 
287 				case 0x21:	/* Chorus Type LSB */
288 					xg_chorus_type_lsb = *body;
289 #if 0	/* XG specific chorus is not supported yet, use GS instead */
290 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
291 					num_events++;
292 #else
293 					v = set_xg_chorus_type(xg_chorus_type_msb, xg_chorus_type_lsb);
294 					if (v >= 0) {
295 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, v, 0x0D);
296 						num_events++;
297 					}
298 #endif
299 					break;
300 
301 				case 0x2C:	/* Chorus Return */
302 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
303 					num_events++;
304 					break;
305 
306 				default:
307 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
308 					num_events++;
309 					break;
310 				}
311 			}
312 			else if (addmid == 0x40) {	/* Multi EQ */
313 				switch (ent) {
314 				case 0x00:	/* EQ type */
315 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
316 					num_events++;
317 					break;
318 
319 				case 0x01:	/* EQ gain1 */
320 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
321 					num_events++;
322 					break;
323 
324 				case 0x02:	/* EQ frequency1 */
325 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
326 					num_events++;
327 					break;
328 
329 				case 0x03:	/* EQ Q1 */
330 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
331 					num_events++;
332 					break;
333 
334 				case 0x04:	/* EQ shape1 */
335 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
336 					num_events++;
337 					break;
338 
339 				case 0x05:	/* EQ gain2 */
340 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
341 					num_events++;
342 					break;
343 
344 				case 0x06:	/* EQ frequency2 */
345 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
346 					num_events++;
347 					break;
348 
349 				case 0x07:	/* EQ Q2 */
350 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
351 					num_events++;
352 					break;
353 
354 				case 0x09:	/* EQ gain3 */
355 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
356 					num_events++;
357 					break;
358 
359 				case 0x0A:	/* EQ frequency3 */
360 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
361 					num_events++;
362 					break;
363 
364 				case 0x0B:	/* EQ Q3 */
365 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
366 					num_events++;
367 					break;
368 
369 				case 0x0D:	/* EQ gain4 */
370 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
371 					num_events++;
372 					break;
373 
374 				case 0x0E:	/* EQ frequency4 */
375 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
376 					num_events++;
377 					break;
378 
379 				case 0x0F:	/* EQ Q4 */
380 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
381 					num_events++;
382 					break;
383 
384 				case 0x11:	/* EQ gain5 */
385 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
386 					num_events++;
387 					break;
388 
389 				case 0x12:	/* EQ frequency5 */
390 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
391 					num_events++;
392 					break;
393 
394 				case 0x13:	/* EQ Q5 */
395 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
396 					num_events++;
397 					break;
398 
399 				case 0x14:	/* EQ shape5 */
400 					SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
401 					num_events++;
402 					break;
403 
404 				default:
405 					break;
406 				}
407 			}
408 		}
409 	}
410 
411 	/* Effect 2 (Insertion Effects) */
412 	else if (len >= 8 &&
413 		val[0] == 0x43 && /* Yamaha ID */
414 		val[2] == 0x4C && /* XG Model ID */
415 		((val[1] <  0x10 && val[5] == 0x03) ||	/* Bulk Dump*/
416 		(val[1] >= 0x10 && val[3] == 0x03)))	/* Parameter Change */
417 	{
418 		uint8_t addhigh, addmid, addlow;		/* Addresses */
419 		const uint8_t *body;				/* SysEx body */
420 		int ent;				/* Entry # of sub-event */
421 		const uint8_t *body_end;			/* End of SysEx body */
422 
423 		if (val[1] < 0x10)	/* Bulk Dump */
424 		{
425 			addhigh = val[5];
426 			addmid = val[6];
427 			addlow = val[7];
428 			body = val + 8;
429 			body_end = val + len - 3;
430 		}
431 		else			/* Parameter Change */
432 		{
433 			addhigh = val[3];
434 			addmid = val[4];
435 			addlow = val[5];
436 			body = val + 6;
437 			body_end = val + len - 2;
438 		}
439 
440 		/* set the SYSEX_XG_MSB info */
441 		SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_MSB, 0, addhigh, addmid);
442 		num_events++;
443 
444 		for (ent = addlow; body <= body_end; body++, ent++) {
445 			SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, 0, *body, ent);
446 			num_events++;
447 		}
448 	}
449 
450 	/* XG Multi Part Data parameter change */
451 	else if (len >= 10 &&
452 		val[0] == 0x43 && /* Yamaha ID */
453 		val[2] == 0x4C && /* XG Model ID */
454 		((val[1] <  0x10 && val[5] == 0x08 &&	/* Bulk Dump */
455 		(val[4] == 0x29 || val[4] == 0x3F)) ||	/* Blocks 1 or 2 */
456 			(val[1] >= 0x10 && val[3] == 0x08)))	/* Parameter Change */
457 	{
458 		uint8_t addhigh, addmid, addlow;		/* Addresses */
459 		const uint8_t *body;				/* SysEx body */
460 		uint8_t p;				/* Channel part number [0..15] */
461 		int ent;				/* Entry # of sub-event */
462 		const uint8_t *body_end;			/* End of SysEx body */
463 
464 		if (val[1] < 0x10)	/* Bulk Dump */
465 		{
466 			addhigh = val[5];
467 			addmid = val[6];
468 			addlow = val[7];
469 			body = val + 8;
470 			p = addmid;
471 			body_end = val + len - 3;
472 		}
473 		else			/* Parameter Change */
474 		{
475 			addhigh = val[3];
476 			addmid = val[4];
477 			addlow = val[5];
478 			body = val + 6;
479 			p = addmid;
480 			body_end = val + len - 2;
481 		}
482 
483 		/* set the SYSEX_XG_MSB info */
484 		SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_MSB, p, addhigh, addmid);
485 		num_events++;
486 
487 		for (ent = addlow; body <= body_end; body++, ent++) {
488 			switch (ent) {
489 			case 0x00:	/* Element Reserve */
490 						/*			//printMessage(CMSG_INFO,VERB_NOISY,"Element Reserve is not supported. (CH:%d VAL:%d)", p, *body); */
491 				break;
492 
493 			case 0x01:	/* bank select MSB */
494 				SETMIDIEVENT(evm[num_events], 0, ME_TONE_BANK_MSB, p, *body, SYSEX_TAG);
495 				num_events++;
496 				break;
497 
498 			case 0x02:	/* bank select LSB */
499 				SETMIDIEVENT(evm[num_events], 0, ME_TONE_BANK_LSB, p, *body, SYSEX_TAG);
500 				num_events++;
501 				break;
502 
503 			case 0x03:	/* program number */
504 				SETMIDIEVENT(evm[num_events], 0, ME_PROGRAM, p, *body, SYSEX_TAG);
505 				num_events++;
506 				break;
507 
508 			case 0x04:	/* Rcv CHANNEL */
509 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, p, *body, 0x99);
510 				num_events++;
511 				break;
512 
513 			case 0x05:	/* mono/poly mode */
514 				if (*body == 0) { SETMIDIEVENT(evm[num_events], 0, ME_MONO, p, 0, SYSEX_TAG); }
515 				else { SETMIDIEVENT(evm[num_events], 0, ME_POLY, p, 0, SYSEX_TAG); }
516 				num_events++;
517 				break;
518 
519 			case 0x06:	/* Same Note Number Key On Assign */
520 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, p, *body, ent);
521 				num_events++;
522 				break;
523 
524 			case 0x07:	/* Part Mode */
525 				drum_setup_xg[*body] = p;
526 				SETMIDIEVENT(evm[num_events], 0, ME_DRUMPART, p, *body, SYSEX_TAG);
527 				num_events++;
528 				break;
529 
530 			case 0x08:	/* note shift */
531 				SETMIDIEVENT(evm[num_events], 0, ME_KEYSHIFT, p, *body, SYSEX_TAG);
532 				num_events++;
533 				break;
534 
535 			case 0x09:	/* Detune 1st bit */
536 				break;
537 
538 			case 0x0A:	/* Detune 2nd bit */
539 				break;
540 
541 			case 0x0B:	/* volume */
542 				SETMIDIEVENT(evm[num_events], 0, ME_MAINVOLUME, p, *body, SYSEX_TAG);
543 				num_events++;
544 				break;
545 
546 			case 0x0C:	/* Velocity Sense Depth */
547 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, p, *body, 0x21);
548 				num_events++;
549 				break;
550 
551 			case 0x0D:	/* Velocity Sense Offset */
552 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, p, *body, 0x22);
553 				num_events++;
554 				break;
555 
556 			case 0x0E:	/* pan */
557 				if (*body == 0) {
558 					SETMIDIEVENT(evm[num_events], 0, ME_RANDOM_PAN, p, 0, SYSEX_TAG);
559 				}
560 				else {
561 					SETMIDIEVENT(evm[num_events], 0, ME_PAN, p, *body, SYSEX_TAG);
562 				}
563 				num_events++;
564 				break;
565 
566 			case 0x0F:	/* Note Limit Low */
567 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x42);
568 				num_events++;
569 				break;
570 
571 			case 0x10:	/* Note Limit High */
572 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x43);
573 				num_events++;
574 				break;
575 
576 			case 0x11:	/* Dry Level */
577 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, p, *body, ent);
578 				num_events++;
579 				break;
580 
581 			case 0x12:	/* chorus send */
582 				SETMIDIEVENT(evm[num_events], 0, ME_CHORUS_EFFECT, p, *body, SYSEX_TAG);
583 				num_events++;
584 				break;
585 
586 			case 0x13:	/* reverb send */
587 				SETMIDIEVENT(evm[num_events], 0, ME_REVERB_EFFECT, p, *body, SYSEX_TAG);
588 				num_events++;
589 				break;
590 
591 			case 0x14:	/* Variation Send */
592 				SETMIDIEVENT(evm[num_events], 0, ME_CELESTE_EFFECT, p, *body, SYSEX_TAG);
593 				num_events++;
594 				break;
595 
596 			case 0x15:	/* Vibrato Rate */
597 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
598 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x08, SYSEX_TAG);
599 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
600 				num_events += 3;
601 				break;
602 
603 			case 0x16:	/* Vibrato Depth */
604 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
605 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x09, SYSEX_TAG);
606 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
607 				num_events += 3;
608 				break;
609 
610 			case 0x17:	/* Vibrato Delay */
611 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
612 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x0A, SYSEX_TAG);
613 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
614 				num_events += 3;
615 				break;
616 
617 			case 0x18:	/* Filter Cutoff Frequency */
618 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
619 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x20, SYSEX_TAG);
620 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
621 				num_events += 3;
622 				break;
623 
624 			case 0x19:	/* Filter Resonance */
625 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
626 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x21, SYSEX_TAG);
627 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
628 				num_events += 3;
629 				break;
630 
631 			case 0x1A:	/* EG Attack Time */
632 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
633 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x63, SYSEX_TAG);
634 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
635 				num_events += 3;
636 				break;
637 
638 			case 0x1B:	/* EG Decay Time */
639 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
640 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x64, SYSEX_TAG);
641 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
642 				num_events += 3;
643 				break;
644 
645 			case 0x1C:	/* EG Release Time */
646 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
647 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x66, SYSEX_TAG);
648 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
649 				num_events += 3;
650 				break;
651 
652 			case 0x1D:	/* MW Pitch Control */
653 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x16);
654 				num_events++;
655 				break;
656 
657 			case 0x1E:	/* MW Filter Control */
658 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x17);
659 				num_events++;
660 				break;
661 
662 			case 0x1F:	/* MW Amplitude Control */
663 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x18);
664 				num_events++;
665 				break;
666 
667 			case 0x20:	/* MW LFO PMod Depth */
668 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x1A);
669 				num_events++;
670 				break;
671 
672 			case 0x21:	/* MW LFO FMod Depth */
673 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x1B);
674 				num_events++;
675 				break;
676 
677 			case 0x22:	/* MW LFO AMod Depth */
678 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x1C);
679 				num_events++;
680 				break;
681 
682 			case 0x23:	/* bend pitch control */
683 				SETMIDIEVENT(evm[num_events], 0, ME_RPN_MSB, p, 0, SYSEX_TAG);
684 				SETMIDIEVENT(evm[num_events + 1], 0, ME_RPN_LSB, p, 0, SYSEX_TAG);
685 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, (*body - 0x40) & 0x7F, SYSEX_TAG);
686 				num_events += 3;
687 				break;
688 
689 			case 0x24:	/* Bend Filter Control */
690 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x22);
691 				num_events++;
692 				break;
693 
694 			case 0x25:	/* Bend Amplitude Control */
695 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x23);
696 				num_events++;
697 				break;
698 
699 			case 0x26:	/* Bend LFO PMod Depth */
700 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x25);
701 				num_events++;
702 				break;
703 
704 			case 0x27:	/* Bend LFO FMod Depth */
705 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x26);
706 				num_events++;
707 				break;
708 
709 			case 0x28:	/* Bend LFO AMod Depth */
710 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x27);
711 				num_events++;
712 				break;
713 
714 			case 0x30:	/* Rcv Pitch Bend */
715 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x48);
716 				num_events++;
717 				break;
718 
719 			case 0x31:	/* Rcv Channel Pressure */
720 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x49);
721 				num_events++;
722 				break;
723 
724 			case 0x32:	/* Rcv Program Change */
725 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4A);
726 				num_events++;
727 				break;
728 
729 			case 0x33:	/* Rcv Control Change */
730 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4B);
731 				num_events++;
732 				break;
733 
734 			case 0x34:	/* Rcv Poly Pressure */
735 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4C);
736 				num_events++;
737 				break;
738 
739 			case 0x35:	/* Rcv Note Message */
740 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4D);
741 				num_events++;
742 				break;
743 
744 			case 0x36:	/* Rcv RPN */
745 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4E);
746 				num_events++;
747 				break;
748 
749 			case 0x37:	/* Rcv NRPN */
750 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x4F);
751 				num_events++;
752 				break;
753 
754 			case 0x38:	/* Rcv Modulation */
755 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x50);
756 				num_events++;
757 				break;
758 
759 			case 0x39:	/* Rcv Volume */
760 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x51);
761 				num_events++;
762 				break;
763 
764 			case 0x3A:	/* Rcv Pan */
765 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x52);
766 				num_events++;
767 				break;
768 
769 			case 0x3B:	/* Rcv Expression */
770 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x53);
771 				num_events++;
772 				break;
773 
774 			case 0x3C:	/* Rcv Hold1 */
775 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x54);
776 				num_events++;
777 				break;
778 
779 			case 0x3D:	/* Rcv Portamento */
780 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x55);
781 				num_events++;
782 				break;
783 
784 			case 0x3E:	/* Rcv Sostenuto */
785 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x56);
786 				num_events++;
787 				break;
788 
789 			case 0x3F:	/* Rcv Soft */
790 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x57);
791 				num_events++;
792 				break;
793 
794 			case 0x40:	/* Rcv Bank Select */
795 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x58);
796 				num_events++;
797 				break;
798 
799 			case 0x41:	/* scale tuning */
800 			case 0x42:
801 			case 0x43:
802 			case 0x44:
803 			case 0x45:
804 			case 0x46:
805 			case 0x47:
806 			case 0x48:
807 			case 0x49:
808 			case 0x4a:
809 			case 0x4b:
810 			case 0x4c:
811 				SETMIDIEVENT(evm[num_events], 0, ME_SCALE_TUNING, p, ent - 0x41, *body - 64);
812 				num_events++;
813 				break;
814 
815 			case 0x4D:	/* CAT Pitch Control */
816 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x00);
817 				num_events++;
818 				break;
819 
820 			case 0x4E:	/* CAT Filter Control */
821 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x01);
822 				num_events++;
823 				break;
824 
825 			case 0x4F:	/* CAT Amplitude Control */
826 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x02);
827 				num_events++;
828 				break;
829 
830 			case 0x50:	/* CAT LFO PMod Depth */
831 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x04);
832 				num_events++;
833 				break;
834 
835 			case 0x51:	/* CAT LFO FMod Depth */
836 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x05);
837 				num_events++;
838 				break;
839 
840 			case 0x52:	/* CAT LFO AMod Depth */
841 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x06);
842 				num_events++;
843 				break;
844 
845 			case 0x53:	/* PAT Pitch Control */
846 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x0B);
847 				num_events++;
848 				break;
849 
850 			case 0x54:	/* PAT Filter Control */
851 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x0C);
852 				num_events++;
853 				break;
854 
855 			case 0x55:	/* PAT Amplitude Control */
856 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x0D);
857 				num_events++;
858 				break;
859 
860 			case 0x56:	/* PAT LFO PMod Depth */
861 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x0F);
862 				num_events++;
863 				break;
864 
865 			case 0x57:	/* PAT LFO FMod Depth */
866 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x10);
867 				num_events++;
868 				break;
869 
870 			case 0x58:	/* PAT LFO AMod Depth */
871 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x11);
872 				num_events++;
873 				break;
874 
875 			case 0x59:	/* AC1 Controller Number */
876 				//printMessage(CMSG_INFO,VERB_NOISY,"AC1 Controller Number is not supported. (CH:%d VAL:%d)", p, *body);
877 				break;
878 
879 			case 0x5A:	/* AC1 Pitch Control */
880 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x2C);
881 				num_events++;
882 				break;
883 
884 			case 0x5B:	/* AC1 Filter Control */
885 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x2D);
886 				num_events++;
887 				break;
888 
889 			case 0x5C:	/* AC1 Amplitude Control */
890 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x2E);
891 				num_events++;
892 				break;
893 
894 			case 0x5D:	/* AC1 LFO PMod Depth */
895 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x30);
896 				num_events++;
897 				break;
898 
899 			case 0x5E:	/* AC1 LFO FMod Depth */
900 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x31);
901 				num_events++;
902 				break;
903 
904 			case 0x5F:	/* AC1 LFO AMod Depth */
905 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x32);
906 				num_events++;
907 				break;
908 
909 			case 0x60:	/* AC2 Controller Number */
910 				//printMessage(CMSG_INFO,VERB_NOISY,"AC2 Controller Number is not supported. (CH:%d VAL:%d)", p, *body);
911 				break;
912 
913 			case 0x61:	/* AC2 Pitch Control */
914 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x37);
915 				num_events++;
916 				break;
917 
918 			case 0x62:	/* AC2 Filter Control */
919 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x38);
920 				num_events++;
921 				break;
922 
923 			case 0x63:	/* AC2 Amplitude Control */
924 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x39);
925 				num_events++;
926 				break;
927 
928 			case 0x64:	/* AC2 LFO PMod Depth */
929 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x3B);
930 				num_events++;
931 				break;
932 
933 			case 0x65:	/* AC2 LFO FMod Depth */
934 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x3C);
935 				num_events++;
936 				break;
937 
938 			case 0x66:	/* AC2 LFO AMod Depth */
939 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x3D);
940 				num_events++;
941 				break;
942 
943 			case 0x67:	/* Portamento Switch */
944 				SETMIDIEVENT(evm[num_events], 0, ME_PORTAMENTO, p, *body, SYSEX_TAG);
945 				num_events++;
946 
947 			case 0x68:	/* Portamento Time */
948 				SETMIDIEVENT(evm[num_events], 0, ME_PORTAMENTO_TIME_MSB, p, *body, SYSEX_TAG);
949 				num_events++;
950 
951 			case 0x69:	/* Pitch EG Initial Level */
952 				//printMessage(CMSG_INFO,VERB_NOISY,"Pitch EG Initial Level is not supported. (CH:%d VAL:%d)", p, *body);
953 				break;
954 
955 			case 0x6A:	/* Pitch EG Attack Time */
956 				//printMessage(CMSG_INFO,VERB_NOISY,"Pitch EG Attack Time is not supported. (CH:%d VAL:%d)", p, *body);
957 				break;
958 
959 			case 0x6B:	/* Pitch EG Release Level */
960 				//printMessage(CMSG_INFO,VERB_NOISY,"Pitch EG Release Level is not supported. (CH:%d VAL:%d)", p, *body);
961 				break;
962 
963 			case 0x6C:	/* Pitch EG Release Time */
964 				//printMessage(CMSG_INFO,VERB_NOISY,"Pitch EG Release Time is not supported. (CH:%d VAL:%d)", p, *body);
965 				break;
966 
967 			case 0x6D:	/* Velocity Limit Low */
968 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x44);
969 				num_events++;
970 				break;
971 
972 			case 0x6E:	/* Velocity Limit High */
973 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, p, *body, 0x45);
974 				num_events++;
975 				break;
976 
977 			case 0x70:	/* Bend Pitch Low Control */
978 				//printMessage(CMSG_INFO,VERB_NOISY,"Bend Pitch Low Control is not supported. (CH:%d VAL:%d)", p, *body);
979 				break;
980 
981 			case 0x71:	/* Filter EG Depth */
982 				//printMessage(CMSG_INFO,VERB_NOISY,"Filter EG Depth is not supported. (CH:%d VAL:%d)", p, *body);
983 				break;
984 
985 			case 0x72:	/* EQ BASS */
986 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
987 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x30, SYSEX_TAG);
988 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
989 				num_events += 3;
990 				break;
991 
992 			case 0x73:	/* EQ TREBLE */
993 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
994 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x31, SYSEX_TAG);
995 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
996 				num_events += 3;
997 				break;
998 
999 			case 0x76:	/* EQ BASS frequency */
1000 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1001 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x34, SYSEX_TAG);
1002 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
1003 				num_events += 3;
1004 				break;
1005 
1006 			case 0x77:	/* EQ TREBLE frequency */
1007 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1008 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, p, 0x35, SYSEX_TAG);
1009 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, p, *body, SYSEX_TAG);
1010 				num_events += 3;
1011 				break;
1012 
1013 			default:
1014 				//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported XG Bulk Dump SysEx. (ADDR:%02X %02X %02X VAL:%02X)", addhigh, addlow, ent, *body);
1015 				continue;
1016 				break;
1017 			}
1018 		}
1019 	}
1020 
1021 	/* XG Drum Setup */
1022 	else if (len >= 10 &&
1023 		val[0] == 0x43 && /* Yamaha ID */
1024 		val[2] == 0x4C && /* XG Model ID */
1025 		((val[1] <  0x10 && (val[5] & 0xF0) == 0x30) ||	/* Bulk Dump*/
1026 		(val[1] >= 0x10 && (val[3] & 0xF0) == 0x30)))	/* Parameter Change */
1027 	{
1028 		uint8_t addhigh, addmid, addlow;		/* Addresses */
1029 		const uint8_t *body;				/* SysEx body */
1030 		uint8_t dp, note;				/* Channel part number [0..15] */
1031 		int ent;				/* Entry # of sub-event */
1032 		const uint8_t *body_end;			/* End of SysEx body */
1033 
1034 		if (val[1] < 0x10)	/* Bulk Dump */
1035 		{
1036 			addhigh = val[5];
1037 			addmid = val[6];
1038 			addlow = val[7];
1039 			body = val + 8;
1040 			body_end = val + len - 3;
1041 		}
1042 		else			/* Parameter Change */
1043 		{
1044 			addhigh = val[3];
1045 			addmid = val[4];
1046 			addlow = val[5];
1047 			body = val + 6;
1048 			body_end = val + len - 2;
1049 		}
1050 
1051 		dp = drum_setup_xg[(addhigh & 0x0F) + 1];
1052 		note = addmid;
1053 
1054 		/* set the SYSEX_XG_MSB info */
1055 		SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_MSB, dp, addhigh, addmid);
1056 		num_events++;
1057 
1058 		for (ent = addlow; body <= body_end; body++, ent++) {
1059 			switch (ent) {
1060 			case 0x00:	/* Pitch Coarse */
1061 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x18, SYSEX_TAG);
1062 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1063 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1064 				num_events += 3;
1065 				break;
1066 			case 0x01:	/* Pitch Fine */
1067 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x19, SYSEX_TAG);
1068 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1069 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1070 				num_events += 3;
1071 				break;
1072 			case 0x02:	/* Level */
1073 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x1A, SYSEX_TAG);
1074 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1075 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1076 				num_events += 3;
1077 				break;
1078 			case 0x03:	/* Alternate Group */
1079 				//printMessage(CMSG_INFO,VERB_NOISY,"Alternate Group is not supported. (CH:%d NOTE:%d VAL:%d)", dp, note, *body);
1080 				break;
1081 			case 0x04:	/* Pan */
1082 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x1C, SYSEX_TAG);
1083 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1084 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1085 				num_events += 3;
1086 				break;
1087 			case 0x05:	/* Reverb Send */
1088 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x1D, SYSEX_TAG);
1089 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1090 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1091 				num_events += 3;
1092 				break;
1093 			case 0x06:	/* Chorus Send */
1094 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x1E, SYSEX_TAG);
1095 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1096 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1097 				num_events += 3;
1098 				break;
1099 			case 0x07:	/* Variation Send */
1100 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x1F, SYSEX_TAG);
1101 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1102 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1103 				num_events += 3;
1104 				break;
1105 			case 0x08:	/* Key Assign */
1106 				//printMessage(CMSG_INFO,VERB_NOISY,"Key Assign is not supported. (CH:%d NOTE:%d VAL:%d)", dp, note, *body);
1107 				break;
1108 			case 0x09:	/* Rcv Note Off */
1109 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_MSB, dp, note, 0);
1110 				SETMIDIEVENT(evm[num_events + 1], 0, ME_SYSEX_LSB, dp, *body, 0x46);
1111 				num_events += 2;
1112 				break;
1113 			case 0x0A:	/* Rcv Note On */
1114 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_MSB, dp, note, 0);
1115 				SETMIDIEVENT(evm[num_events + 1], 0, ME_SYSEX_LSB, dp, *body, 0x47);
1116 				num_events += 2;
1117 				break;
1118 			case 0x0B:	/* Filter Cutoff Frequency */
1119 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x14, SYSEX_TAG);
1120 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1121 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1122 				num_events += 3;
1123 				break;
1124 			case 0x0C:	/* Filter Resonance */
1125 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x15, SYSEX_TAG);
1126 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1127 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1128 				num_events += 3;
1129 				break;
1130 			case 0x0D:	/* EG Attack */
1131 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x16, SYSEX_TAG);
1132 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1133 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1134 				num_events += 3;
1135 				break;
1136 			case 0x0E:	/* EG Decay1 */
1137 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, dp, *body, ent);
1138 				num_events++;
1139 				break;
1140 			case 0x0F:	/* EG Decay2 */
1141 				SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_XG_LSB, dp, *body, ent);
1142 				num_events++;
1143 				break;
1144 			case 0x20:	/* EQ BASS */
1145 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x30, SYSEX_TAG);
1146 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1147 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1148 				num_events += 3;
1149 				break;
1150 			case 0x21:	/* EQ TREBLE */
1151 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x31, SYSEX_TAG);
1152 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1153 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1154 				num_events += 3;
1155 				break;
1156 			case 0x24:	/* EQ BASS frequency */
1157 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x34, SYSEX_TAG);
1158 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1159 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1160 				num_events += 3;
1161 				break;
1162 			case 0x25:	/* EQ TREBLE frequency */
1163 				SETMIDIEVENT(evm[num_events], 0, ME_NRPN_MSB, dp, 0x35, SYSEX_TAG);
1164 				SETMIDIEVENT(evm[num_events + 1], 0, ME_NRPN_LSB, dp, note, SYSEX_TAG);
1165 				SETMIDIEVENT(evm[num_events + 2], 0, ME_DATA_ENTRY_MSB, dp, *body, SYSEX_TAG);
1166 				num_events += 3;
1167 				break;
1168 			case 0x50:	/* High Pass Filter Cutoff Frequency */
1169 				//printMessage(CMSG_INFO,VERB_NOISY,"High Pass Filter Cutoff Frequency is not supported. (CH:%d NOTE:%d VAL:%d)", dp, note, *body);
1170 				break;
1171 			case 0x60:	/* Velocity Pitch Sense */
1172 				//printMessage(CMSG_INFO,VERB_NOISY,"Velocity Pitch Sense is not supported. (CH:%d NOTE:%d VAL:%d)", dp, note, *body);
1173 				break;
1174 			case 0x61:	/* Velocity LPF Cutoff Sense */
1175 				//printMessage(CMSG_INFO,VERB_NOISY,"Velocity LPF Cutoff Sense is not supported. (CH:%d NOTE:%d VAL:%d)", dp, note, *body);
1176 				break;
1177 			default:
1178 				//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported XG Bulk Dump SysEx. (ADDR:%02X %02X %02X VAL:%02X)", addhigh, addmid, ent, *body);
1179 				break;
1180 			}
1181 		}
1182 	}
1183 
1184 	/* parsing GS System Exclusive Message...
1185 	*
1186 	* val[4] == Parameter Address(High)
1187 	* val[5] == Parameter Address(Middle)
1188 	* val[6] == Parameter Address(Low)
1189 	* val[7]... == Data...
1190 	* val[last] == Checksum(== 128 - (sum of addresses&data bytes % 128))
1191 	*/
1192 	else if (len >= 9 &&
1193 		val[0] == 0x41 && /* Roland ID */
1194 		val[1] == 0x10 && /* Device ID */
1195 		val[2] == 0x42 && /* GS Model ID */
1196 		val[3] == 0x12) /* Data Set Command */
1197 	{
1198 		uint8_t p, dp, udn, gslen, port = 0;
1199 		int i, addr, addr_h, addr_m, addr_l, checksum;
1200 		p = block_to_part(val[5], midi_port_number);
1201 
1202 		/* calculate checksum */
1203 		checksum = 0;
1204 		for (gslen = 9; gslen < len; gslen++)
1205 			if (val[gslen] == 0xF7)
1206 				break;
1207 		for (i = 4; i<gslen - 1; i++) {
1208 			checksum += val[i];
1209 		}
1210 		if (((128 - (checksum & 0x7F)) & 0x7F) != val[gslen - 1]) {
1211 			//printMessage(CMSG_INFO,VERB_NOISY,"GS SysEx: Checksum Error.");
1212 			return num_events;
1213 		}
1214 
1215 		/* drum channel */
1216 		dp = rhythm_part[(val[5] & 0xF0) >> 4];
1217 
1218 		/* calculate user drumset number */
1219 		udn = (val[5] & 0xF0) >> 4;
1220 
1221 		addr_h = val[4];
1222 		addr_m = val[5];
1223 		addr_l = val[6];
1224 		if (addr_h == 0x50) {	/* for double module mode */
1225 			port = 1;
1226 			p = block_to_part(val[5], port);
1227 			addr_h = 0x40;
1228 		}
1229 		else if (addr_h == 0x51) {
1230 			port = 1;
1231 			p = block_to_part(val[5], port);
1232 			addr_h = 0x41;
1233 		}
1234 		addr = (((int32_t)addr_h) << 16 | ((int32_t)addr_m) << 8 | (int32_t)addr_l);
1235 
1236 		switch (addr_h) {
1237 		case 0x40:
1238 			if ((addr & 0xFFF000) == 0x401000) {
1239 				switch (addr & 0xFF) {
1240 				case 0x00:	/* Tone Number */
1241 					SETMIDIEVENT(evm[0], 0, ME_TONE_BANK_MSB, p, val[7], SYSEX_TAG);
1242 					SETMIDIEVENT(evm[1], 0, ME_PROGRAM, p, val[8], SYSEX_TAG);
1243 					num_events += 2;
1244 					break;
1245 				case 0x02:	/* Rx. Channel */
1246 					if (val[7] == 0x10) {
1247 						SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB,
1248 							block_to_part(val[5],
1249 								midi_port_number ^ port), 0x80, 0x45);
1250 					}
1251 					else {
1252 						SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB,
1253 							block_to_part(val[5],
1254 								midi_port_number ^ port),
1255 							MERGE_CHANNEL_PORT2(val[7],
1256 								midi_port_number ^ port), 0x45);
1257 					}
1258 					num_events++;
1259 					break;
1260 				case 0x03:	/* Rx. Pitch Bend */
1261 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x48);
1262 					num_events++;
1263 					break;
1264 				case 0x04:	/* Rx. Channel Pressure */
1265 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x49);
1266 					num_events++;
1267 					break;
1268 				case 0x05:	/* Rx. Program Change */
1269 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4A);
1270 					num_events++;
1271 					break;
1272 				case 0x06:	/* Rx. Control Change */
1273 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4B);
1274 					num_events++;
1275 					break;
1276 				case 0x07:	/* Rx. Poly Pressure */
1277 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4C);
1278 					num_events++;
1279 					break;
1280 				case 0x08:	/* Rx. Note Message */
1281 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4D);
1282 					num_events++;
1283 					break;
1284 				case 0x09:	/* Rx. RPN */
1285 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4E);
1286 					num_events++;
1287 					break;
1288 				case 0x0A:	/* Rx. NRPN */
1289 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x4F);
1290 					num_events++;
1291 					break;
1292 				case 0x0B:	/* Rx. Modulation */
1293 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x50);
1294 					num_events++;
1295 					break;
1296 				case 0x0C:	/* Rx. Volume */
1297 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x51);
1298 					num_events++;
1299 					break;
1300 				case 0x0D:	/* Rx. Panpot */
1301 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x52);
1302 					num_events++;
1303 					break;
1304 				case 0x0E:	/* Rx. Expression */
1305 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x53);
1306 					num_events++;
1307 					break;
1308 				case 0x0F:	/* Rx. Hold1 */
1309 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x54);
1310 					num_events++;
1311 					break;
1312 				case 0x10:	/* Rx. Portamento */
1313 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x55);
1314 					num_events++;
1315 					break;
1316 				case 0x11:	/* Rx. Sostenuto */
1317 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x56);
1318 					num_events++;
1319 					break;
1320 				case 0x12:	/* Rx. Soft */
1321 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x57);
1322 					num_events++;
1323 					break;
1324 				case 0x13:	/* MONO/POLY Mode */
1325 					if (val[7] == 0) { SETMIDIEVENT(evm[0], 0, ME_MONO, p, val[7], SYSEX_TAG); }
1326 					else { SETMIDIEVENT(evm[0], 0, ME_POLY, p, val[7], SYSEX_TAG); }
1327 					num_events++;
1328 					break;
1329 				case 0x14:	/* Assign Mode */
1330 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x24);
1331 					num_events++;
1332 					break;
1333 				case 0x15:	/* Use for Rhythm Part */
1334 					if (val[7]) {
1335 						rhythm_part[val[7] - 1] = p;
1336 					}
1337 					break;
1338 				case 0x16:	/* Pitch Key Shift (dummy. see parse_sysex_event()) */
1339 					break;
1340 				case 0x17:	/* Pitch Offset Fine */
1341 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x26);
1342 					num_events++;
1343 					break;
1344 				case 0x19:	/* Part Level */
1345 					SETMIDIEVENT(evm[0], 0, ME_MAINVOLUME, p, val[7], SYSEX_TAG);
1346 					num_events++;
1347 					break;
1348 				case 0x1A:	/* Velocity Sense Depth */
1349 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x21);
1350 					num_events++;
1351 					break;
1352 				case 0x1B:	/* Velocity Sense Offset */
1353 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x22);
1354 					num_events++;
1355 					break;
1356 				case 0x1C:	/* Part Panpot */
1357 					if (val[7] == 0) {
1358 						SETMIDIEVENT(evm[0], 0, ME_RANDOM_PAN, p, 0, SYSEX_TAG);
1359 					}
1360 					else {
1361 						SETMIDIEVENT(evm[0], 0, ME_PAN, p, val[7], SYSEX_TAG);
1362 					}
1363 					num_events++;
1364 					break;
1365 				case 0x1D:	/* Keyboard Range Low */
1366 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x42);
1367 					num_events++;
1368 					break;
1369 				case 0x1E:	/* Keyboard Range High */
1370 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x43);
1371 					num_events++;
1372 					break;
1373 				case 0x1F:	/* CC1 Controller Number */
1374 					//printMessage(CMSG_INFO,VERB_NOISY,"CC1 Controller Number is not supported. (CH:%d VAL:%d)", p, val[7]);
1375 					break;
1376 				case 0x20:	/* CC2 Controller Number */
1377 					//printMessage(CMSG_INFO,VERB_NOISY,"CC2 Controller Number is not supported. (CH:%d VAL:%d)", p, val[7]);
1378 					break;
1379 				case 0x21:	/* Chorus Send Level */
1380 					SETMIDIEVENT(evm[0], 0, ME_CHORUS_EFFECT, p, val[7], SYSEX_TAG);
1381 					num_events++;
1382 					break;
1383 				case 0x22:	/* Reverb Send Level */
1384 					SETMIDIEVENT(evm[0], 0, ME_REVERB_EFFECT, p, val[7], SYSEX_TAG);
1385 					num_events++;
1386 					break;
1387 				case 0x23:	/* Rx. Bank Select */
1388 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x58);
1389 					num_events++;
1390 					break;
1391 				case 0x24:	/* Rx. Bank Select LSB */
1392 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x59);
1393 					num_events++;
1394 					break;
1395 				case 0x2C:	/* Delay Send Level */
1396 					SETMIDIEVENT(evm[0], 0, ME_CELESTE_EFFECT, p, val[7], SYSEX_TAG);
1397 					num_events++;
1398 					break;
1399 				case 0x2A:	/* Pitch Fine Tune */
1400 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x00, SYSEX_TAG);
1401 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x01, SYSEX_TAG);
1402 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1403 					SETMIDIEVENT(evm[3], 0, ME_DATA_ENTRY_LSB, p, val[8], SYSEX_TAG);
1404 					num_events += 4;
1405 					break;
1406 				case 0x30:	/* TONE MODIFY1: Vibrato Rate */
1407 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1408 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x08, SYSEX_TAG);
1409 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1410 					num_events += 3;
1411 					break;
1412 				case 0x31:	/* TONE MODIFY2: Vibrato Depth */
1413 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1414 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x09, SYSEX_TAG);
1415 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1416 					num_events += 3;
1417 					break;
1418 				case 0x32:	/* TONE MODIFY3: TVF Cutoff Freq */
1419 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1420 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x20, SYSEX_TAG);
1421 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1422 					num_events += 3;
1423 					break;
1424 				case 0x33:	/* TONE MODIFY4: TVF Resonance */
1425 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1426 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x21, SYSEX_TAG);
1427 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1428 					num_events += 3;
1429 					break;
1430 				case 0x34:	/* TONE MODIFY5: TVF&TVA Env.attack */
1431 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1432 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x63, SYSEX_TAG);
1433 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1434 					num_events += 3;
1435 					break;
1436 				case 0x35:	/* TONE MODIFY6: TVF&TVA Env.decay */
1437 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1438 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x64, SYSEX_TAG);
1439 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1440 					num_events += 3;
1441 					break;
1442 				case 0x36:	/* TONE MODIFY7: TVF&TVA Env.release */
1443 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1444 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x66, SYSEX_TAG);
1445 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1446 					num_events += 3;
1447 					break;
1448 				case 0x37:	/* TONE MODIFY8: Vibrato Delay */
1449 					SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, p, 0x01, SYSEX_TAG);
1450 					SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, p, 0x0A, SYSEX_TAG);
1451 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, val[7], SYSEX_TAG);
1452 					num_events += 3;
1453 					break;
1454 				case 0x40:	/* Scale Tuning */
1455 					for (i = 0; i < 12; i++) {
1456 						SETMIDIEVENT(evm[i],
1457 							0, ME_SCALE_TUNING, p, i, val[i + 7] - 64);
1458 					}
1459 					num_events += 12;
1460 					break;
1461 				default:
1462 					//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
1463 					break;
1464 				}
1465 			}
1466 			else if ((addr & 0xFFF000) == 0x402000) {
1467 				switch (addr & 0xFF) {
1468 				case 0x00:	/* MOD Pitch Control */
1469 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x16);
1470 					num_events++;
1471 					break;
1472 				case 0x01:	/* MOD TVF Cutoff Control */
1473 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x17);
1474 					num_events++;
1475 					break;
1476 				case 0x02:	/* MOD Amplitude Control */
1477 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x18);
1478 					num_events++;
1479 					break;
1480 				case 0x03:	/* MOD LFO1 Rate Control */
1481 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x19);
1482 					num_events++;
1483 					break;
1484 				case 0x04:	/* MOD LFO1 Pitch Depth */
1485 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1A);
1486 					num_events++;
1487 					break;
1488 				case 0x05:	/* MOD LFO1 TVF Depth */
1489 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1B);
1490 					num_events++;
1491 					break;
1492 				case 0x06:	/* MOD LFO1 TVA Depth */
1493 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1C);
1494 					num_events++;
1495 					break;
1496 				case 0x07:	/* MOD LFO2 Rate Control */
1497 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1D);
1498 					num_events++;
1499 					break;
1500 				case 0x08:	/* MOD LFO2 Pitch Depth */
1501 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1E);
1502 					num_events++;
1503 					break;
1504 				case 0x09:	/* MOD LFO2 TVF Depth */
1505 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x1F);
1506 					num_events++;
1507 					break;
1508 				case 0x0A:	/* MOD LFO2 TVA Depth */
1509 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x20);
1510 					num_events++;
1511 					break;
1512 				case 0x10:	/* !!!FIXME!!! Bend Pitch Control */
1513 					SETMIDIEVENT(evm[0], 0, ME_RPN_MSB, p, 0, SYSEX_TAG);
1514 					SETMIDIEVENT(evm[1], 0, ME_RPN_LSB, p, 0, SYSEX_TAG);
1515 					SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, p, (val[7] - 0x40) & 0x7F, SYSEX_TAG);
1516 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x21);
1517 					num_events += 4;
1518 					break;
1519 				case 0x11:	/* Bend TVF Cutoff Control */
1520 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x22);
1521 					num_events++;
1522 					break;
1523 				case 0x12:	/* Bend Amplitude Control */
1524 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x23);
1525 					num_events++;
1526 					break;
1527 				case 0x13:	/* Bend LFO1 Rate Control */
1528 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x24);
1529 					num_events++;
1530 					break;
1531 				case 0x14:	/* Bend LFO1 Pitch Depth */
1532 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x25);
1533 					num_events++;
1534 					break;
1535 				case 0x15:	/* Bend LFO1 TVF Depth */
1536 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x26);
1537 					num_events++;
1538 					break;
1539 				case 0x16:	/* Bend LFO1 TVA Depth */
1540 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x27);
1541 					num_events++;
1542 					break;
1543 				case 0x17:	/* Bend LFO2 Rate Control */
1544 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x28);
1545 					num_events++;
1546 					break;
1547 				case 0x18:	/* Bend LFO2 Pitch Depth */
1548 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x29);
1549 					num_events++;
1550 					break;
1551 				case 0x19:	/* Bend LFO2 TVF Depth */
1552 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2A);
1553 					num_events++;
1554 					break;
1555 				case 0x1A:	/* Bend LFO2 TVA Depth */
1556 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2B);
1557 					num_events++;
1558 					break;
1559 				case 0x20:	/* CAf Pitch Control */
1560 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x00);
1561 					num_events++;
1562 					break;
1563 				case 0x21:	/* CAf TVF Cutoff Control */
1564 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x01);
1565 					num_events++;
1566 					break;
1567 				case 0x22:	/* CAf Amplitude Control */
1568 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x02);
1569 					num_events++;
1570 					break;
1571 				case 0x23:	/* CAf LFO1 Rate Control */
1572 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x03);
1573 					num_events++;
1574 					break;
1575 				case 0x24:	/* CAf LFO1 Pitch Depth */
1576 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x04);
1577 					num_events++;
1578 					break;
1579 				case 0x25:	/* CAf LFO1 TVF Depth */
1580 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x05);
1581 					num_events++;
1582 					break;
1583 				case 0x26:	/* CAf LFO1 TVA Depth */
1584 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x06);
1585 					num_events++;
1586 					break;
1587 				case 0x27:	/* CAf LFO2 Rate Control */
1588 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x07);
1589 					num_events++;
1590 					break;
1591 				case 0x28:	/* CAf LFO2 Pitch Depth */
1592 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x08);
1593 					num_events++;
1594 					break;
1595 				case 0x29:	/* CAf LFO2 TVF Depth */
1596 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x09);
1597 					num_events++;
1598 					break;
1599 				case 0x2A:	/* CAf LFO2 TVA Depth */
1600 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0A);
1601 					num_events++;
1602 					break;
1603 				case 0x30:	/* PAf Pitch Control */
1604 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0B);
1605 					num_events++;
1606 					break;
1607 				case 0x31:	/* PAf TVF Cutoff Control */
1608 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0C);
1609 					num_events++;
1610 					break;
1611 				case 0x32:	/* PAf Amplitude Control */
1612 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0D);
1613 					num_events++;
1614 					break;
1615 				case 0x33:	/* PAf LFO1 Rate Control */
1616 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0E);
1617 					num_events++;
1618 					break;
1619 				case 0x34:	/* PAf LFO1 Pitch Depth */
1620 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x0F);
1621 					num_events++;
1622 					break;
1623 				case 0x35:	/* PAf LFO1 TVF Depth */
1624 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x10);
1625 					num_events++;
1626 					break;
1627 				case 0x36:	/* PAf LFO1 TVA Depth */
1628 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x11);
1629 					num_events++;
1630 					break;
1631 				case 0x37:	/* PAf LFO2 Rate Control */
1632 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x12);
1633 					num_events++;
1634 					break;
1635 				case 0x38:	/* PAf LFO2 Pitch Depth */
1636 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x13);
1637 					num_events++;
1638 					break;
1639 				case 0x39:	/* PAf LFO2 TVF Depth */
1640 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x14);
1641 					num_events++;
1642 					break;
1643 				case 0x3A:	/* PAf LFO2 TVA Depth */
1644 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x15);
1645 					num_events++;
1646 					break;
1647 				case 0x40:	/* CC1 Pitch Control */
1648 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2C);
1649 					num_events++;
1650 					break;
1651 				case 0x41:	/* CC1 TVF Cutoff Control */
1652 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2D);
1653 					num_events++;
1654 					break;
1655 				case 0x42:	/* CC1 Amplitude Control */
1656 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2E);
1657 					num_events++;
1658 					break;
1659 				case 0x43:	/* CC1 LFO1 Rate Control */
1660 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x2F);
1661 					num_events++;
1662 					break;
1663 				case 0x44:	/* CC1 LFO1 Pitch Depth */
1664 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x30);
1665 					num_events++;
1666 					break;
1667 				case 0x45:	/* CC1 LFO1 TVF Depth */
1668 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x31);
1669 					num_events++;
1670 					break;
1671 				case 0x46:	/* CC1 LFO1 TVA Depth */
1672 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x32);
1673 					num_events++;
1674 					break;
1675 				case 0x47:	/* CC1 LFO2 Rate Control */
1676 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x33);
1677 					num_events++;
1678 					break;
1679 				case 0x48:	/* CC1 LFO2 Pitch Depth */
1680 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x34);
1681 					num_events++;
1682 					break;
1683 				case 0x49:	/* CC1 LFO2 TVF Depth */
1684 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x35);
1685 					num_events++;
1686 					break;
1687 				case 0x4A:	/* CC1 LFO2 TVA Depth */
1688 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x36);
1689 					num_events++;
1690 					break;
1691 				case 0x50:	/* CC2 Pitch Control */
1692 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x37);
1693 					num_events++;
1694 					break;
1695 				case 0x51:	/* CC2 TVF Cutoff Control */
1696 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x38);
1697 					num_events++;
1698 					break;
1699 				case 0x52:	/* CC2 Amplitude Control */
1700 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x39);
1701 					num_events++;
1702 					break;
1703 				case 0x53:	/* CC2 LFO1 Rate Control */
1704 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x3A);
1705 					num_events++;
1706 					break;
1707 				case 0x54:	/* CC2 LFO1 Pitch Depth */
1708 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x3B);
1709 					num_events++;
1710 					break;
1711 				case 0x55:	/* CC2 LFO1 TVF Depth */
1712 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x3C);
1713 					num_events++;
1714 					break;
1715 				case 0x56:	/* CC2 LFO1 TVA Depth */
1716 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x3D);
1717 					num_events++;
1718 					break;
1719 				case 0x57:	/* CC2 LFO2 Rate Control */
1720 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x3E);
1721 					num_events++;
1722 					break;
1723 				case 0x58:	/* CC2 LFO2 Pitch Depth */
1724 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x3F);
1725 					num_events++;
1726 					break;
1727 				case 0x59:	/* CC2 LFO2 TVF Depth */
1728 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x40);
1729 					num_events++;
1730 					break;
1731 				case 0x5A:	/* CC2 LFO2 TVA Depth */
1732 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_LSB, p, val[7], 0x41);
1733 					num_events++;
1734 					break;
1735 				default:
1736 					//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
1737 					break;
1738 				}
1739 			}
1740 			else if ((addr & 0xFFFF00) == 0x400100) {
1741 				switch (addr & 0xFF) {
1742 				case 0x30:	/* Reverb Macro */
1743 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x05);
1744 					num_events++;
1745 					break;
1746 				case 0x31:	/* Reverb Character */
1747 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x06);
1748 					num_events++;
1749 					break;
1750 				case 0x32:	/* Reverb Pre-LPF */
1751 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x07);
1752 					num_events++;
1753 					break;
1754 				case 0x33:	/* Reverb Level */
1755 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x08);
1756 					num_events++;
1757 					break;
1758 				case 0x34:	/* Reverb Time */
1759 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x09);
1760 					num_events++;
1761 					break;
1762 				case 0x35:	/* Reverb Delay Feedback */
1763 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x0A);
1764 					num_events++;
1765 					break;
1766 				case 0x36:	/* Unknown Reverb Parameter */
1767 					break;
1768 				case 0x37:	/* Reverb Predelay Time */
1769 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x0C);
1770 					num_events++;
1771 					break;
1772 				case 0x38:	/* Chorus Macro */
1773 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x0D);
1774 					num_events++;
1775 					break;
1776 				case 0x39:	/* Chorus Pre-LPF */
1777 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x0E);
1778 					num_events++;
1779 					break;
1780 				case 0x3A:	/* Chorus Level */
1781 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x0F);
1782 					num_events++;
1783 					break;
1784 				case 0x3B:	/* Chorus Feedback */
1785 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x10);
1786 					num_events++;
1787 					break;
1788 				case 0x3C:	/* Chorus Delay */
1789 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x11);
1790 					num_events++;
1791 					break;
1792 				case 0x3D:	/* Chorus Rate */
1793 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x12);
1794 					num_events++;
1795 					break;
1796 				case 0x3E:	/* Chorus Depth */
1797 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x13);
1798 					num_events++;
1799 					break;
1800 				case 0x3F:	/* Chorus Send Level to Reverb */
1801 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x14);
1802 					num_events++;
1803 					break;
1804 				case 0x40:	/* Chorus Send Level to Delay */
1805 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x15);
1806 					num_events++;
1807 					break;
1808 				case 0x50:	/* Delay Macro */
1809 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x16);
1810 					num_events++;
1811 					break;
1812 				case 0x51:	/* Delay Pre-LPF */
1813 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x17);
1814 					num_events++;
1815 					break;
1816 				case 0x52:	/* Delay Time Center */
1817 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x18);
1818 					num_events++;
1819 					break;
1820 				case 0x53:	/* Delay Time Ratio Left */
1821 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x19);
1822 					num_events++;
1823 					break;
1824 				case 0x54:	/* Delay Time Ratio Right */
1825 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x1A);
1826 					num_events++;
1827 					break;
1828 				case 0x55:	/* Delay Level Center */
1829 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x1B);
1830 					num_events++;
1831 					break;
1832 				case 0x56:	/* Delay Level Left */
1833 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x1C);
1834 					num_events++;
1835 					break;
1836 				case 0x57:	/* Delay Level Right */
1837 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x1D);
1838 					num_events++;
1839 					break;
1840 				case 0x58:	/* Delay Level */
1841 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x1E);
1842 					num_events++;
1843 					break;
1844 				case 0x59:	/* Delay Feedback */
1845 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x1F);
1846 					num_events++;
1847 					break;
1848 				case 0x5A:	/* Delay Send Level to Reverb */
1849 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x20);
1850 					num_events++;
1851 					break;
1852 				default:
1853 					//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
1854 					break;
1855 				}
1856 			}
1857 			else if ((addr & 0xFFFF00) == 0x400200) {
1858 				switch (addr & 0xFF) {	/* EQ Parameter */
1859 				case 0x00:	/* EQ LOW FREQ */
1860 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x01);
1861 					num_events++;
1862 					break;
1863 				case 0x01:	/* EQ LOW GAIN */
1864 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x02);
1865 					num_events++;
1866 					break;
1867 				case 0x02:	/* EQ HIGH FREQ */
1868 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x03);
1869 					num_events++;
1870 					break;
1871 				case 0x03:	/* EQ HIGH GAIN */
1872 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x04);
1873 					num_events++;
1874 					break;
1875 				default:
1876 					//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
1877 					break;
1878 				}
1879 			}
1880 			else if ((addr & 0xFFFF00) == 0x400300) {
1881 				switch (addr & 0xFF) {	/* Insertion Effect Parameter */
1882 				case 0x00:
1883 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x27);
1884 					SETMIDIEVENT(evm[1], 0, ME_SYSEX_GS_LSB, p, val[8], 0x28);
1885 					num_events += 2;
1886 					break;
1887 				case 0x03:
1888 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x29);
1889 					num_events++;
1890 					break;
1891 				case 0x04:
1892 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x2A);
1893 					num_events++;
1894 					break;
1895 				case 0x05:
1896 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x2B);
1897 					num_events++;
1898 					break;
1899 				case 0x06:
1900 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x2C);
1901 					num_events++;
1902 					break;
1903 				case 0x07:
1904 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x2D);
1905 					num_events++;
1906 					break;
1907 				case 0x08:
1908 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x2E);
1909 					num_events++;
1910 					break;
1911 				case 0x09:
1912 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x2F);
1913 					num_events++;
1914 					break;
1915 				case 0x0A:
1916 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x30);
1917 					num_events++;
1918 					break;
1919 				case 0x0B:
1920 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x31);
1921 					num_events++;
1922 					break;
1923 				case 0x0C:
1924 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x32);
1925 					num_events++;
1926 					break;
1927 				case 0x0D:
1928 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x33);
1929 					num_events++;
1930 					break;
1931 				case 0x0E:
1932 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x34);
1933 					num_events++;
1934 					break;
1935 				case 0x0F:
1936 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x35);
1937 					num_events++;
1938 					break;
1939 				case 0x10:
1940 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x36);
1941 					num_events++;
1942 					break;
1943 				case 0x11:
1944 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x37);
1945 					num_events++;
1946 					break;
1947 				case 0x12:
1948 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x38);
1949 					num_events++;
1950 					break;
1951 				case 0x13:
1952 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x39);
1953 					num_events++;
1954 					break;
1955 				case 0x14:
1956 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x3A);
1957 					num_events++;
1958 					break;
1959 				case 0x15:
1960 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x3B);
1961 					num_events++;
1962 					break;
1963 				case 0x16:
1964 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x3C);
1965 					num_events++;
1966 					break;
1967 				case 0x17:
1968 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x3D);
1969 					num_events++;
1970 					break;
1971 				case 0x18:
1972 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x3E);
1973 					num_events++;
1974 					break;
1975 				case 0x19:
1976 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x3F);
1977 					num_events++;
1978 					break;
1979 				case 0x1B:
1980 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x40);
1981 					num_events++;
1982 					break;
1983 				case 0x1C:
1984 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x41);
1985 					num_events++;
1986 					break;
1987 				case 0x1D:
1988 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x42);
1989 					num_events++;
1990 					break;
1991 				case 0x1E:
1992 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x43);
1993 					num_events++;
1994 					break;
1995 				case 0x1F:
1996 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x44);
1997 					num_events++;
1998 					break;
1999 				default:
2000 					//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
2001 					break;
2002 				}
2003 			}
2004 			else if ((addr & 0xFFF000) == 0x404000) {
2005 				switch (addr & 0xFF) {
2006 				case 0x00:	/* TONE MAP NUMBER */
2007 					SETMIDIEVENT(evm[0], 0, ME_TONE_BANK_LSB, p, val[7], SYSEX_TAG);
2008 					num_events++;
2009 					break;
2010 				case 0x01:	/* TONE MAP-0 NUMBER */
2011 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x25);
2012 					num_events++;
2013 					break;
2014 				case 0x20:	/* EQ ON/OFF */
2015 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x00);
2016 					num_events++;
2017 					break;
2018 				case 0x22:	/* EFX ON/OFF */
2019 					SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB, p, val[7], 0x23);
2020 					num_events++;
2021 					break;
2022 				default:
2023 					//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
2024 					break;
2025 				}
2026 			}
2027 			break;
2028 		case 0x41:
2029 			switch (addr & 0xF00) {
2030 			case 0x100:	/* Play Note Number */
2031 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_MSB, dp, val[6], 0);
2032 				SETMIDIEVENT(evm[1], 0, ME_SYSEX_GS_LSB, dp, val[7], 0x47);
2033 				num_events += 2;
2034 				break;
2035 			case 0x200:
2036 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1A, SYSEX_TAG);
2037 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2038 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2039 				num_events += 3;
2040 				break;
2041 			case 0x400:
2042 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1C, SYSEX_TAG);
2043 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2044 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2045 				num_events += 3;
2046 				break;
2047 			case 0x500:
2048 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1D, SYSEX_TAG);
2049 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2050 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2051 				num_events += 3;
2052 				break;
2053 			case 0x600:
2054 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1E, SYSEX_TAG);
2055 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2056 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2057 				num_events += 3;
2058 				break;
2059 			case 0x700:	/* Rx. Note Off */
2060 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_MSB, dp, val[6], 0);
2061 				SETMIDIEVENT(evm[1], 0, ME_SYSEX_LSB, dp, val[7], 0x46);
2062 				num_events += 2;
2063 				break;
2064 			case 0x800:	/* Rx. Note On */
2065 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_MSB, dp, val[6], 0);
2066 				SETMIDIEVENT(evm[1], 0, ME_SYSEX_LSB, dp, val[7], 0x47);
2067 				num_events += 2;
2068 				break;
2069 			case 0x900:
2070 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1F, SYSEX_TAG);
2071 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2072 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2073 				num_events += 3;
2074 				break;
2075 			default:
2076 				//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
2077 				break;
2078 			}
2079 			break;
2080 		case 0x21:	/* User Drumset */
2081 			switch (addr & 0xF00) {
2082 			case 0x100:	/* Play Note */
2083 				instruments->get_userdrum(64 + udn, val[6])->play_note = val[7];
2084 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_MSB, dp, val[6], 0);
2085 				SETMIDIEVENT(evm[1], 0, ME_SYSEX_GS_LSB, dp, val[7], 0x47);
2086 				num_events += 2;
2087 				break;
2088 			case 0x200:	/* Level */
2089 				instruments->get_userdrum(64 + udn, val[6])->level = val[7];
2090 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1A, SYSEX_TAG);
2091 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2092 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2093 				num_events += 3;
2094 				break;
2095 			case 0x300:	/* Assign Group */
2096 				instruments->get_userdrum(64 + udn, val[6])->assign_group = val[7];
2097 				if (val[7] != 0) { instruments->recompute_userdrum_altassign(udn + 64, val[7]); }
2098 				break;
2099 			case 0x400:	/* Panpot */
2100 				instruments->get_userdrum(64 + udn, val[6])->pan = val[7];
2101 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1C, SYSEX_TAG);
2102 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2103 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2104 				num_events += 3;
2105 				break;
2106 			case 0x500:	/* Reverb Send Level */
2107 				instruments->get_userdrum(64 + udn, val[6])->reverb_send_level = val[7];
2108 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1D, SYSEX_TAG);
2109 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2110 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2111 				num_events += 3;
2112 				break;
2113 			case 0x600:	/* Chorus Send Level */
2114 				instruments->get_userdrum(64 + udn, val[6])->chorus_send_level = val[7];
2115 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1E, SYSEX_TAG);
2116 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2117 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2118 				num_events += 3;
2119 				break;
2120 			case 0x700:	/* Rx. Note Off */
2121 				instruments->get_userdrum(64 + udn, val[6])->rx_note_off = val[7];
2122 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_MSB, dp, val[6], 0);
2123 				SETMIDIEVENT(evm[1], 0, ME_SYSEX_LSB, dp, val[7], 0x46);
2124 				num_events += 2;
2125 				break;
2126 			case 0x800:	/* Rx. Note On */
2127 				instruments->get_userdrum(64 + udn, val[6])->rx_note_on = val[7];
2128 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_MSB, dp, val[6], 0);
2129 				SETMIDIEVENT(evm[1], 0, ME_SYSEX_LSB, dp, val[7], 0x47);
2130 				num_events += 2;
2131 				break;
2132 			case 0x900:	/* Delay Send Level */
2133 				instruments->get_userdrum(64 + udn, val[6])->delay_send_level = val[7];
2134 				SETMIDIEVENT(evm[0], 0, ME_NRPN_MSB, dp, 0x1F, SYSEX_TAG);
2135 				SETMIDIEVENT(evm[1], 0, ME_NRPN_LSB, dp, val[6], SYSEX_TAG);
2136 				SETMIDIEVENT(evm[2], 0, ME_DATA_ENTRY_MSB, dp, val[7], SYSEX_TAG);
2137 				num_events += 3;
2138 				break;
2139 			case 0xA00:	/* Source Map */
2140 				instruments->get_userdrum(64 + udn, val[6])->source_map = val[7];
2141 				break;
2142 			case 0xB00:	/* Source Prog */
2143 				instruments->get_userdrum(64 + udn, val[6])->source_prog = val[7];
2144 				break;
2145 #if !defined(TIMIDITY_TOOLS)
2146 			case 0xC00:	/* Source Note */
2147 				instruments->get_userdrum(64 + udn, val[6])->source_note = val[7];
2148 				break;
2149 #endif
2150 			default:
2151 				//printMessage(CMSG_INFO,VERB_NOISY,"Unsupported GS SysEx. (ADDR:%02X %02X %02X VAL:%02X %02X)", addr_h, addr_m, addr_l, val[7], val[8]);
2152 				break;
2153 			}
2154 			break;
2155 		case 0x00:	/* System */
2156 			switch (addr & 0xfff0) {
2157 			case 0x0100:	/* Channel Msg Rx Port (A) */
2158 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB,
2159 					block_to_part(addr & 0xf, 0), val[7], 0x46);
2160 				num_events++;
2161 				break;
2162 			case 0x0110:	/* Channel Msg Rx Port (B) */
2163 				SETMIDIEVENT(evm[0], 0, ME_SYSEX_GS_LSB,
2164 					block_to_part(addr & 0xf, 1), val[7], 0x46);
2165 				num_events++;
2166 				break;
2167 			default:
2168 				/*	printMessage(CMSG_INFO,VERB_NOISY, "Unsupported GS SysEx. "
2169 				"(ADDR:%02X %02X %02X VAL:%02X %02X)",
2170 				addr_h, addr_m, addr_l, val[7], val[8]);*/
2171 				break;
2172 			}
2173 			break;
2174 		}
2175 	}
2176 
2177 	/* Non-RealTime / RealTime Universal SysEx messages
2178 	* 0 0x7e(Non-RealTime) / 0x7f(RealTime)
2179 	* 1 SysEx device ID.  Could be from 0x00 to 0x7f.
2180 	*   0x7f means disregard device.
2181 	* 2 Sub ID
2182 	* ...
2183 	* E 0xf7
2184 	*/
2185 	else if (len > 4 && val[0] >= 0x7e)
2186 		switch (val[2]) {
2187 		case 0x01:	/* Sample Dump header */
2188 		case 0x02:	/* Sample Dump packet */
2189 		case 0x03:	/* Dump Request */
2190 		case 0x04:	/* Device Control */
2191 			if (val[3] == 0x05) {	/* Global Parameter Control */
2192 				if (val[7] == 0x01 && val[8] == 0x01) {	/* Reverb */
2193 					for (i = 9; i < len && val[i] != 0xf7; i += 2) {
2194 						switch (val[i]) {
2195 						case 0x00:	/* Reverb Type */
2196 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, 0, val[i + 1], 0x60);
2197 							num_events++;
2198 							break;
2199 						case 0x01:	/* Reverb Time */
2200 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, val[i + 1], 0x09);
2201 							num_events++;
2202 							break;
2203 						}
2204 					}
2205 				}
2206 				else if (val[7] == 0x01 && val[8] == 0x02) {	/* Chorus */
2207 					for (i = 9; i < len && val[i] != 0xf7; i += 2) {
2208 						switch (val[i]) {
2209 						case 0x00:	/* Chorus Type */
2210 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, 0, val[i + 1], 0x61);
2211 							num_events++;
2212 							break;
2213 						case 0x01:	/* Modulation Rate */
2214 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, val[i + 1], 0x12);
2215 							num_events++;
2216 							break;
2217 						case 0x02:	/* Modulation Depth */
2218 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, val[i + 1], 0x13);
2219 							num_events++;
2220 							break;
2221 						case 0x03:	/* Feedback */
2222 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, val[i + 1], 0x10);
2223 							num_events++;
2224 							break;
2225 						case 0x04:	/* Send To Reverb */
2226 							SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_GS_LSB, 0, val[i + 1], 0x14);
2227 							num_events++;
2228 							break;
2229 						}
2230 					}
2231 				}
2232 			}
2233 			break;
2234 		case 0x05:	/* Sample Dump extensions */
2235 		case 0x06:	/* Inquiry Message */
2236 		case 0x07:	/* File Dump */
2237 			break;
2238 		case 0x08:	/* MIDI Tuning Standard */
2239 			switch (val[3]) {
2240 			case 0x01:
2241 				SETMIDIEVENT(evm[0], 0, ME_BULK_TUNING_DUMP, 0, val[4], 0);
2242 				for (i = 0; i < 128; i++) {
2243 					SETMIDIEVENT(evm[i * 2 + 1], 0, ME_BULK_TUNING_DUMP,
2244 						1, i, val[i * 3 + 21]);
2245 					SETMIDIEVENT(evm[i * 2 + 2], 0, ME_BULK_TUNING_DUMP,
2246 						2, val[i * 3 + 22], val[i * 3 + 23]);
2247 				}
2248 				num_events += 257;
2249 				break;
2250 			case 0x02:
2251 				SETMIDIEVENT(evm[0], 0, ME_SINGLE_NOTE_TUNING,
2252 					0, val[4], 0);
2253 				for (i = 0; i < val[5]; i++) {
2254 					SETMIDIEVENT(evm[i * 2 + 1], 0, ME_SINGLE_NOTE_TUNING,
2255 						1, val[i * 4 + 6], val[i * 4 + 7]);
2256 					SETMIDIEVENT(evm[i * 2 + 2], 0, ME_SINGLE_NOTE_TUNING,
2257 						2, val[i * 4 + 8], val[i * 4 + 9]);
2258 				}
2259 				num_events += val[5] * 2 + 1;
2260 				break;
2261 			case 0x0b:
2262 				channel_tt = ((val[4] & 0x03) << 14 | val[5] << 7 | val[6])
2263 					<< ((val[4] >> 2) * 16);
2264 				if (val[1] == 0x7f) {
2265 					SETMIDIEVENT(evm[0], 0, ME_MASTER_TEMPER_TYPE,
2266 						0, val[7], (val[0] == 0x7f));
2267 					num_events++;
2268 				}
2269 				else {
2270 					for (i = j = 0; i < 32; i++)
2271 						if (channel_tt & 1 << i) {
2272 							SETMIDIEVENT(evm[j], 0, ME_TEMPER_TYPE,
2273 								MERGE_CHANNEL_PORT(i),
2274 								val[7], (val[0] == 0x7f));
2275 							j++;
2276 						}
2277 					num_events += j;
2278 				}
2279 				break;
2280 			case 0x0c:
2281 				SETMIDIEVENT(evm[0], 0, ME_USER_TEMPER_ENTRY,
2282 					0, val[4], val[21]);
2283 				for (i = 0; i < val[21]; i++) {
2284 					SETMIDIEVENT(evm[i * 5 + 1], 0, ME_USER_TEMPER_ENTRY,
2285 						1, val[i * 10 + 22], val[i * 10 + 23]);
2286 					SETMIDIEVENT(evm[i * 5 + 2], 0, ME_USER_TEMPER_ENTRY,
2287 						2, val[i * 10 + 24], val[i * 10 + 25]);
2288 					SETMIDIEVENT(evm[i * 5 + 3], 0, ME_USER_TEMPER_ENTRY,
2289 						3, val[i * 10 + 26], val[i * 10 + 27]);
2290 					SETMIDIEVENT(evm[i * 5 + 4], 0, ME_USER_TEMPER_ENTRY,
2291 						4, val[i * 10 + 28], val[i * 10 + 29]);
2292 					SETMIDIEVENT(evm[i * 5 + 5], 0, ME_USER_TEMPER_ENTRY,
2293 						5, val[i * 10 + 30], val[i * 10 + 31]);
2294 				}
2295 				num_events += val[21] * 5 + 1;
2296 				break;
2297 			}
2298 			break;
2299 		case 0x09:	/* General MIDI Message */
2300 			switch (val[3]) {
2301 			case 0x01:	/* Channel Pressure */
2302 				for (i = 5; i < len && val[i] != 0xf7; i += 2) {
2303 					switch (val[i]) {
2304 					case 0x00:	/* Pitch Control */
2305 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, val[4], val[i + 1], 0x00);
2306 						num_events++;
2307 						break;
2308 					case 0x01:	/* Filter Cutoff Control */
2309 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, val[4], val[i + 1], 0x01);
2310 						num_events++;
2311 						break;
2312 					case 0x02:	/* Amplitude Control */
2313 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, val[4], val[i + 1], 0x02);
2314 						num_events++;
2315 						break;
2316 					case 0x03:	/* LFO Pitch Depth */
2317 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, val[4], val[i + 1], 0x04);
2318 						num_events++;
2319 						break;
2320 					case 0x04:	/* LFO Filter Depth */
2321 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, val[4], val[i + 1], 0x05);
2322 						num_events++;
2323 						break;
2324 					case 0x05:	/* LFO Amplitude Depth */
2325 						SETMIDIEVENT(evm[num_events], 0, ME_SYSEX_LSB, val[4], val[i + 1], 0x06);
2326 						num_events++;
2327 						break;
2328 					}
2329 				}
2330 				break;
2331 			}
2332 			break;
2333 		case 0x7b:	/* End of File */
2334 		case 0x7c:	/* Handshaking Message: Wait */
2335 		case 0x7d:	/* Handshaking Message: Cancel */
2336 		case 0x7e:	/* Handshaking Message: NAK */
2337 		case 0x7f:	/* Handshaking Message: ACK */
2338 			break;
2339 		}
2340 
2341 	return(num_events);
2342 }
2343 
2344 
2345 int SysexConvert::parse_sysex_event(const uint8_t *val, int32_t len, MidiEvent *ev, Instruments *instruments)
2346 {
2347 	uint16_t vol;
2348 
2349 	if (len >= 10 &&
2350 		val[0] == 0x41 && /* Roland ID */
2351 		val[1] == 0x10 && /* Device ID */
2352 		val[2] == 0x42 && /* GS Model ID */
2353 		val[3] == 0x12)   /* Data Set Command */
2354 	{
2355 		/* Roland GS-Based Synthesizers.
2356 		* val[4..6] is address, val[7..len-2] is body.
2357 		*
2358 		* GS     Channel part number
2359 		* 0      10
2360 		* 1-9    1-9
2361 		* 10-15  11-16
2362 		*/
2363 
2364 		int32_t addr, checksum, i;		/* SysEx address */
2365 		const uint8_t *body;		/* SysEx body */
2366 		uint8_t p, gslen;		/* Channel part number [0..15] */
2367 
2368 								/* check Checksum */
2369 		checksum = 0;
2370 		for (gslen = 9; gslen < len; gslen++)
2371 			if (val[gslen] == 0xF7)
2372 				break;
2373 		for (i = 4; i < gslen - 1; i++) {
2374 			checksum += val[i];
2375 		}
2376 		if (((128 - (checksum & 0x7F)) & 0x7F) != val[gslen - 1]) {
2377 			return 0;
2378 		}
2379 
2380 		addr = (((int32_t)val[4]) << 16 |
2381 			((int32_t)val[5]) << 8 |
2382 			(int32_t)val[6]);
2383 		body = val + 7;
2384 		p = (uint8_t)((addr >> 8) & 0xF);
2385 		if (p == 0)
2386 			p = 9;
2387 		else if (p <= 9)
2388 			p--;
2389 		p = MERGE_CHANNEL_PORT(p);
2390 
2391 		if (val[4] == 0x50) {	/* for double module mode */
2392 			p += 16;
2393 			addr = (((int32_t)0x40) << 16 |
2394 				((int32_t)val[5]) << 8 |
2395 				(int32_t)val[6]);
2396 		}
2397 		else {	/* single module mode */
2398 			addr = (((int32_t)val[4]) << 16 |
2399 				((int32_t)val[5]) << 8 |
2400 				(int32_t)val[6]);
2401 		}
2402 
2403 		if ((addr & 0xFFF0FF) == 0x401015) /* Rhythm Parts */
2404 		{
2405 			/* GS drum part check from Masaaki Koyanagi's patch (GS_Drum_Part_Check()) */
2406 			/* Modified by Masanao Izumo */
2407 			SETMIDIEVENT(*ev, 0, ME_DRUMPART, p, *body, SYSEX_TAG);
2408 			return 1;
2409 		}
2410 
2411 		if ((addr & 0xFFF0FF) == 0x401016) /* Key Shift */
2412 		{
2413 			SETMIDIEVENT(*ev, 0, ME_KEYSHIFT, p, *body, SYSEX_TAG);
2414 			return 1;
2415 		}
2416 
2417 		if (addr == 0x400000) /* Master Tune, not for SMF */
2418 		{
2419 			uint16_t tune = ((body[1] & 0xF) << 8) | ((body[2] & 0xF) << 4) | (body[3] & 0xF);
2420 
2421 			if (tune < 0x18)
2422 				tune = 0x18;
2423 			else if (tune > 0x7E8)
2424 				tune = 0x7E8;
2425 			SETMIDIEVENT(*ev, 0, ME_MASTER_TUNING, 0, tune & 0xFF, (tune >> 8) & 0x7F);
2426 			return 1;
2427 		}
2428 
2429 		if (addr == 0x400004) /* Master Volume */
2430 		{
2431 			vol = gs_convert_master_vol(*body);
2432 			SETMIDIEVENT(*ev, 0, ME_MASTER_VOLUME,
2433 				0, vol & 0xFF, (vol >> 8) & 0xFF);
2434 			return 1;
2435 		}
2436 
2437 		if ((addr & 0xFFF0FF) == 0x401019) /* Volume on/off */
2438 		{
2439 #if 0
2440 			SETMIDIEVENT(*ev, 0, ME_VOLUME_ONOFF, p, *body >= 64, SYSEX_TAG);
2441 #endif
2442 			return 0;
2443 		}
2444 
2445 		if ((addr & 0xFFF0FF) == 0x401002) /* Receive channel on/off */
2446 		{
2447 #if 0
2448 			SETMIDIEVENT(*ev, 0, ME_RECEIVE_CHANNEL, (uint8_t)p, *body >= 64, SYSEX_TAG);
2449 #endif
2450 			return 0;
2451 		}
2452 
2453 		if (0x402000 <= addr && addr <= 0x402F5A) /* Controller Routing */
2454 			return 0;
2455 
2456 		if ((addr & 0xFFF0FF) == 0x401040) /* Alternate Scale Tunings */
2457 			return 0;
2458 
2459 		if ((addr & 0xFFFFF0) == 0x400130) /* Changing Effects */
2460 		{
2461 #if 0
2462 			struct chorus_text_gs_t *chorus_text = &(reverb->chorus_status_gs.text);
2463 			switch (addr & 0xF)
2464 			{
2465 			case 0x8: /* macro */
2466 				memcpy(chorus_text->macro, body, 3);
2467 				break;
2468 			case 0x9: /* PRE-LPF */
2469 				memcpy(chorus_text->pre_lpf, body, 3);
2470 				break;
2471 			case 0xa: /* level */
2472 				memcpy(chorus_text->level, body, 3);
2473 				break;
2474 			case 0xb: /* feed back */
2475 				memcpy(chorus_text->feed_back, body, 3);
2476 				break;
2477 			case 0xc: /* delay */
2478 				memcpy(chorus_text->delay, body, 3);
2479 				break;
2480 			case 0xd: /* rate */
2481 				memcpy(chorus_text->rate, body, 3);
2482 				break;
2483 			case 0xe: /* depth */
2484 				memcpy(chorus_text->depth, body, 3);
2485 				break;
2486 			case 0xf: /* send level */
2487 				memcpy(chorus_text->send_level, body, 3);
2488 				break;
2489 			default: break;
2490 			}
2491 #endif
2492 			return 0;
2493 		}
2494 
2495 		if ((addr & 0xFFF0FF) == 0x401003) /* Rx Pitch-Bend */
2496 			return 0;
2497 
2498 		if (addr == 0x400110) /* Voice Reserve */
2499 		{
2500 #if 0
2501 			if (len >= 25)
2502 				memcpy(reverb->chorus_status_gs.text.voice_reserve, body, 18);
2503 #endif
2504 			return 0;
2505 		}
2506 
2507 		if (addr == 0x40007F ||	/* GS Reset */
2508 			addr == 0x00007F)	/* SC-88 Single Module */
2509 		{
2510 			SETMIDIEVENT(*ev, 0, ME_RESET, 0, GS_SYSTEM_MODE, SYSEX_TAG);
2511 			return 1;
2512 		}
2513 		return 0;
2514 	}
2515 
2516 	if (len > 9 &&
2517 		val[0] == 0x41 && /* Roland ID */
2518 		val[1] == 0x10 && /* Device ID */
2519 		val[2] == 0x45 &&
2520 		val[3] == 0x12 &&
2521 		val[4] == 0x10 &&
2522 		val[5] == 0x00 &&
2523 		val[6] == 0x00)
2524 	{
2525 		return 0;
2526 	}
2527 
2528 	if (len > 9 &&                     /* GS lcd event. by T.Nogami*/
2529 		val[0] == 0x41 && /* Roland ID */
2530 		val[1] == 0x10 && /* Device ID */
2531 		val[2] == 0x45 &&
2532 		val[3] == 0x12 &&
2533 		val[4] == 0x10 &&
2534 		val[5] == 0x01 &&
2535 		val[6] == 0x00)
2536 	{
2537 		return 0;
2538 	}
2539 
2540 	/* val[1] can have values other than 0x10 for the XG ON event, which
2541 	* work on real XG hardware.  I have several midi that use 0x1f instead
2542 	* of 0x10.  playmidi.h lists 0x10 - 0x13 as MU50/80/90/100.  I don't
2543 	* know what real world Device Number 0x1f would correspond to, but the
2544 	* XG spec says the entire 0x1n range is valid, and 0x1f works on real
2545 	* hardware, so I have modified the check below to accept the entire
2546 	* 0x1n range.
2547 	*
2548 	* I think there are/were some hacks somewhere in playmidi.c (?) to work
2549 	* around non- 0x10 values, but this fixes the root of the problem, which
2550 	* allows the server mode to handle XG initialization properly as well.
2551 	*/
2552 	if (len >= 8 &&
2553 		val[0] == 0x43 &&
2554 		(val[1] >= 0x10 && val[1] <= 0x1f) &&
2555 		val[2] == 0x4C)
2556 	{
2557 		int addr = (val[3] << 16) | (val[4] << 8) | val[5];
2558 
2559 		if (addr == 0x00007E)	/* XG SYSTEM ON */
2560 		{
2561 			SETMIDIEVENT(*ev, 0, ME_RESET, 0, XG_SYSTEM_MODE, SYSEX_TAG);
2562 			return 1;
2563 		}
2564 		else if (addr == 0x000000 && len >= 12)	/* XG Master Tune */
2565 		{
2566 			uint16_t tune = ((val[7] & 0xF) << 8) | ((val[8] & 0xF) << 4) | (val[9] & 0xF);
2567 
2568 			if (tune > 0x7FF)
2569 				tune = 0x7FF;
2570 			SETMIDIEVENT(*ev, 0, ME_MASTER_TUNING, 0, tune & 0xFF, (tune >> 8) & 0x7F);
2571 			return 1;
2572 		}
2573 	}
2574 
2575 	if (len >= 7 && val[0] == 0x7F && val[1] == 0x7F)
2576 	{
2577 		if (val[2] == 0x04 && val[3] == 0x03)	/* GM2 Master Fine Tune */
2578 		{
2579 			uint16_t tune = (val[4] & 0x7F) | (val[5] << 7) | 0x4000;
2580 
2581 			SETMIDIEVENT(*ev, 0, ME_MASTER_TUNING, 0, tune & 0xFF, (tune >> 8) & 0x7F);
2582 			return 1;
2583 		}
2584 		if (val[2] == 0x04 && val[3] == 0x04)	/* GM2 Master Coarse Tune */
2585 		{
2586 			uint8_t tune = val[5];
2587 
2588 			if (tune < 0x28)
2589 				tune = 0x28;
2590 			else if (tune > 0x58)
2591 				tune = 0x58;
2592 			SETMIDIEVENT(*ev, 0, ME_MASTER_TUNING, 0, tune, 0x80);
2593 			return 1;
2594 		}
2595 	}
2596 
2597 	/* Non-RealTime / RealTime Universal SysEx messages
2598 	* 0 0x7e(Non-RealTime) / 0x7f(RealTime)
2599 	* 1 SysEx device ID.  Could be from 0x00 to 0x7f.
2600 	*   0x7f means disregard device.
2601 	* 2 Sub ID
2602 	* ...
2603 	* E 0xf7
2604 	*/
2605 	if (len > 4 && val[0] >= 0x7e)
2606 		switch (val[2]) {
2607 		case 0x01:	/* Sample Dump header */
2608 		case 0x02:	/* Sample Dump packet */
2609 		case 0x03:	/* Dump Request */
2610 			break;
2611 		case 0x04:	/* MIDI Time Code Setup/Device Control */
2612 			switch (val[3]) {
2613 			case 0x01:	/* Master Volume */
2614 				vol = gm_convert_master_vol(val[4], val[5]);
2615 				if (val[1] == 0x7f) {
2616 					SETMIDIEVENT(*ev, 0, ME_MASTER_VOLUME, 0,
2617 						vol & 0xff, vol >> 8 & 0xff);
2618 				}
2619 				else {
2620 					SETMIDIEVENT(*ev, 0, ME_MAINVOLUME,
2621 						MERGE_CHANNEL_PORT(val[1]),
2622 						vol >> 8 & 0xff, 0);
2623 				}
2624 				return 1;
2625 			}
2626 			break;
2627 		case 0x05:	/* Sample Dump extensions */
2628 		case 0x06:	/* Inquiry Message */
2629 		case 0x07:	/* File Dump */
2630 			break;
2631 		case 0x08:	/* MIDI Tuning Standard */
2632 			switch (val[3]) {
2633 			case 0x0a:
2634 				SETMIDIEVENT(*ev, 0, ME_TEMPER_KEYSIG, 0,
2635 					val[4] - 0x40 + val[5] * 16, (val[0] == 0x7f));
2636 				return 1;
2637 			}
2638 			break;
2639 		case 0x09:	/* General MIDI Message */
2640 					/* GM System Enable/Disable */
2641 			if (val[3] == 1) {
2642 				printMessage(CMSG_INFO, VERB_DEBUG, "SysEx: GM System On");
2643 				SETMIDIEVENT(*ev, 0, ME_RESET, 0, GM_SYSTEM_MODE, 0);
2644 			}
2645 			else if (val[3] == 3) {
2646 				printMessage(CMSG_INFO, VERB_DEBUG, "SysEx: GM2 System On");
2647 				SETMIDIEVENT(*ev, 0, ME_RESET, 0, GM2_SYSTEM_MODE, 0);
2648 			}
2649 			else {
2650 				printMessage(CMSG_INFO, VERB_DEBUG, "SysEx: GM System Off");
2651 				SETMIDIEVENT(*ev, 0, ME_RESET, 0, DEFAULT_SYSTEM_MODE, 0);
2652 			}
2653 			return 1;
2654 		case 0x7b:	/* End of File */
2655 		case 0x7c:	/* Handshaking Message: Wait */
2656 		case 0x7d:	/* Handshaking Message: Cancel */
2657 		case 0x7e:	/* Handshaking Message: NAK */
2658 		case 0x7f:	/* Handshaking Message: ACK */
2659 			break;
2660 		}
2661 
2662 	return 0;
2663 }
2664 }