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 }