Created
June 19, 2014 02:27
-
-
Save kode54/ded4e0f4629d68f62cc9 to your computer and use it in GitHub Desktop.
MIDI System Exclusive message interpreter from TMIDI - Tom's MIDI Player
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Interprets a sysex string | |
char *interpret_sysex(unsigned char *s, int len) | |
{ | |
static char buf[256], timbreName[16]; | |
int i, j; | |
buf[0] = '\0'; | |
switch (s[0]) // Manufacturer ID | |
{ | |
case 0x41: // Roland | |
switch (s[2]) // Model ID | |
{ | |
case 0x16: // MT-32 | |
switch (s[4]) | |
{ | |
case 0x03: // Patch Temp Area | |
sprintf(buf, "Patch Temp Area, Part %d", HINYBBLE(s[6]) + 1); | |
break; | |
case 0x04: // Timbre Temp Area | |
strcpy(buf, "Timbre Temp Area"); | |
break; | |
case 0x05: // Patch Memory | |
strcpy(buf, "Patch Memory"); | |
interpret_mt32_patch_memory(s, len); | |
break; | |
case 0x08: // Timbre Memory | |
strcpy(buf, "Timbre Memory: "); | |
interpret_mt32_timbre_memory(s, len); | |
strncat(buf, (char *) &s[7], 10); | |
break; | |
case 0x10: // System Area | |
strcpy(buf, "System Area"); | |
break; | |
case 0x20: // Display Area | |
strcpy(buf, "MT-32 Display: "); | |
j = strlen(buf); | |
for (i = 7; i < len - 2; i++) | |
buf[j++] = s[i]; | |
buf[j] = '\0'; | |
break; | |
} | |
break; | |
case 0x42: // GS Message | |
switch (s[4]) | |
{ | |
case 0x00: // SC-88 System Parameter | |
switch (s[5]) | |
{ | |
case 0x00: // System message | |
switch (s[6]) | |
{ | |
case 0x7F: | |
//sprintf(buf, "SC-88 System Mode Set: %s", s[7] ? "Double Module Mode" : "Single Module Mode"); | |
sprintf(buf, "SC-88 Reset (%s)", s[7] ? "Double" : "Single"); | |
break; | |
} | |
break; | |
case 0x01: // Part message | |
sprintf(buf, "SC-88 Part %c%d: Port %c", HINYBBLE(s[6]) + 'A', interpret_sysex_part(LONYBBLE(s[6])), s[7] + 'A'); | |
break; | |
} | |
break; | |
case 0x08: // SC-88 Bulk Dump Setup Parameters | |
strcpy(buf, "SC-88 Bulk Dump Setup Parameters"); | |
break; | |
case 0x40: // Parameter byte | |
if (s[5] >= 0x10 && s[5] <= 0x1F) | |
{ | |
sprintf(buf, "Part %d: ", interpret_sysex_part(s[5])); | |
switch (s[6]) | |
{ | |
case 0x00: | |
sprintf(&buf[strlen(buf)], "Tone #: Bank %d, Patch %d", s[7], s[8]); | |
break; | |
case 0x01: | |
sprintf(&buf[strlen(buf)], "Rx Control Change: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x02: | |
sprintf(&buf[strlen(buf)], "Rx Channel: %d", s[7]); | |
break; | |
case 0x03: | |
sprintf(&buf[strlen(buf)], "Rx Pitch Bend: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x04: | |
sprintf(&buf[strlen(buf)], "Rx Channel Pressure: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x05: | |
sprintf(&buf[strlen(buf)], "Rx Program Change: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x06: | |
sprintf(&buf[strlen(buf)], "Rx Control Change: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x07: | |
sprintf(&buf[strlen(buf)], "Rx Poly Pressure: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x08: | |
sprintf(&buf[strlen(buf)], "Rx Note Message: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x09: | |
sprintf(&buf[strlen(buf)], "RPN: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x0A: | |
sprintf(&buf[strlen(buf)], "NRPN: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x0B: | |
sprintf(&buf[strlen(buf)], "Rx Modulation: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x0C: | |
sprintf(&buf[strlen(buf)], "Rx Volume: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x0D: | |
sprintf(&buf[strlen(buf)], "Rx Panpot: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x0E: | |
sprintf(&buf[strlen(buf)], "Rx Expression: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x0F: | |
sprintf(&buf[strlen(buf)], "Rx Hold 1: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x10: | |
sprintf(&buf[strlen(buf)], "Rx Portamento: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x11: | |
sprintf(&buf[strlen(buf)], "Rx Sostenuto: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x12: | |
sprintf(&buf[strlen(buf)], "Rx Soft Pedal: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x13: | |
sprintf(&buf[strlen(buf)], "Mono/Poly Mode: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x14: | |
sprintf(&buf[strlen(buf)], "Assign Mode: %s", (s[7] > 0) ? ((s[7] == 1) ? "Limited" : "Full-Multi") : "Single"); | |
break; | |
case 0x15: | |
sprintf(&buf[strlen(buf)], "Use for Rhythm Part: %s", (s[7] > 0) ? ((s[7] == 1) ? "Map 1" : "Map 2") : "Off"); | |
break; | |
case 0x16: | |
sprintf(&buf[strlen(buf)], "Pitch Key Shift: %d", s[7]); | |
break; | |
case 0x17: | |
sprintf(&buf[strlen(buf)], "Pitch Offset Fine: %d", s[7]); | |
break; | |
case 0x19: | |
sprintf(&buf[strlen(buf)], "Rx Part Level: %d", s[7]); | |
break; | |
case 0x1A: | |
sprintf(&buf[strlen(buf)], "Rx Velocity Sense Depth: %d", s[7]); | |
break; | |
case 0x1B: | |
sprintf(&buf[strlen(buf)], "Rx Velocity Sense Offset: %d", s[7]); | |
break; | |
case 0x1C: | |
sprintf(&buf[strlen(buf)], "Rx Part Panpot: %d", s[7]); | |
break; | |
case 0x1D: | |
sprintf(&buf[strlen(buf)], "Key Range Low: %d", s[7]); | |
break; | |
case 0x1E: | |
sprintf(&buf[strlen(buf)], "Key Range High: %d", s[7]); | |
break; | |
case 0x1F: | |
sprintf(&buf[strlen(buf)], "CC1 Controller Number: %d", s[7]); | |
break; | |
case 0x20: | |
sprintf(&buf[strlen(buf)], "CC2 Controller Number: %d", s[7]); | |
break; | |
case 0x21: | |
sprintf(&buf[strlen(buf)], "Chorus Send Level: %d", s[7]); | |
break; | |
case 0x22: | |
sprintf(&buf[strlen(buf)], "Reverb Send Level: %d", s[7]); | |
break; | |
case 0x23: | |
sprintf(&buf[strlen(buf)], "Rx Bank Select: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x24: | |
sprintf(&buf[strlen(buf)], "SC-88 Rx Bank Select LSB: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x2A: | |
sprintf(&buf[strlen(buf)], "SC-88 Pitch Tune Fine: %d", s[7]); | |
break; | |
case 0x30: | |
sprintf(&buf[strlen(buf)], "Vibrato Rate: %d", s[7]); | |
break; | |
case 0x31: | |
sprintf(&buf[strlen(buf)], "Vibrato Depth: %d", s[7]); | |
break; | |
case 0x32: | |
sprintf(&buf[strlen(buf)], "TVF Cutoff Frequency: %d", s[7] - 64); | |
break; | |
case 0x33: | |
sprintf(&buf[strlen(buf)], "TVF Resonance: %d", s[7] - 64); | |
break; | |
case 0x34: | |
sprintf(&buf[strlen(buf)], "TVF/TVA Envelope Attack: %d", s[7] - 64); | |
break; | |
case 0x35: | |
sprintf(&buf[strlen(buf)], "TVF/TVA Envelope Decay: %d", s[7] - 64); | |
break; | |
case 0x36: | |
sprintf(&buf[strlen(buf)], "TVF/TVA Envelope Release: %d", s[7] - 64); | |
break; | |
case 0x37: | |
sprintf(&buf[strlen(buf)], "Vibrato Delay: %d", s[7]); | |
break; | |
case 0x40: | |
sprintf(&buf[strlen(buf)], "Scale Tuning"); | |
break; | |
} | |
} | |
else | |
if (s[5] >= 0x20 && s[5] <= 0x2F) | |
{ | |
strcpy(buf, "VCF/VCO/VCA Parameter"); | |
} | |
else | |
if (s[5] >= 0x40 && s[5] <= 0x4F) | |
{ | |
sprintf(buf, "SC-88 Part %d: ", interpret_sysex_part(s[5])); | |
SC88PartParam: | |
switch (s[6]) | |
{ | |
case 0x13: | |
sprintf(&buf[strlen(buf)], "Mono/Poly mode: %s", s[7] ? "Polyphonic" : "Mono"); | |
break; | |
case 0x20: | |
sprintf(&buf[strlen(buf)], "EQ: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x21: | |
strcat(buf, "Output Assign: "); | |
switch (s[7]) | |
{ | |
case 0x00: strcat(buf, "Output 1"); break; | |
case 0x01: strcat(buf, "Output 2"); break; | |
case 0x02: strcat(buf, "Output 2-L"); break; | |
case 0x03: strcat(buf, "Output 2-R"); break; | |
default: strcat(buf, itoa(s[7], buf, 10)); | |
} | |
break; | |
case 0x22: | |
sprintf(&buf[strlen(buf)], "EFX: %s", s[7] ? "On" : "Off"); | |
break; | |
case 0x2A: | |
sprintf(&buf[strlen(buf)], "SC-88 Pitch Tune Fine: %d", s[7]); | |
break; | |
} | |
} | |
else | |
switch (s[5]) | |
{ | |
case 0x00: // System parameter | |
switch (s[6]) | |
{ | |
case 0x00: // Master Tune | |
case 0x02: | |
case 0x03: | |
strcpy(buf, "Master Tune"); | |
break; | |
case 0x04: // Master Volume | |
strcpy(buf, "Master Volume"); | |
break; | |
case 0x05: // Master Key Shift | |
strcpy(buf, "Master Key Shift"); | |
break; | |
case 0x06: // Master Pan | |
strcpy(buf, "Master Pan"); | |
break; | |
case 0x7F: // GS Reset | |
strcpy(buf, "GS Reset"); // F0 41 10 42 12 40 00 7F 00 41 F7 | |
break; | |
} | |
break; | |
case 0x01: // Patch parameter | |
switch (s[6]) | |
{ | |
case 0x00: // Patch Name | |
strcpy(buf, "Patch Name: "); | |
j = strlen(buf); | |
for (i = 8; i < len - 2; i++) | |
buf[j++] = s[i]; | |
buf[j] = '\0'; | |
break; | |
case 0x10: // Voice Reserve | |
strcpy(buf, "Voice Reserve"); | |
break; | |
case 0x30: // Reverb Macro | |
strcpy(buf, "Reverb Macro: "); | |
switch (s[7]) | |
{ | |
case 0x00: strcat(buf, "Room 1"); break; | |
case 0x01: strcat(buf, "Room 2"); break; | |
case 0x02: strcat(buf, "Room 3"); break; | |
case 0x03: strcat(buf, "Hall 1"); break; | |
case 0x04: strcat(buf, "Hall 2"); break; | |
case 0x05: strcat(buf, "Plate"); break; | |
case 0x06: strcat(buf, "Delay"); break; | |
case 0x07: strcat(buf, "Panning Delay"); break; | |
} | |
break; | |
case 0x31: // Reverb Character | |
sprintf(buf, "Reverb Character: %d", s[7]); | |
break; | |
case 0x32: // Reverb PRE-LPF | |
sprintf(buf, "Reverb PRE-LPF: %d", s[7]); | |
break; | |
case 0x33: // Reverb Level | |
sprintf(buf, "Reverb Level: %d", s[7]); | |
break; | |
case 0x34: // Reverb Time | |
sprintf(buf, "Reverb Time: %d", s[7]); | |
break; | |
case 0x35: // Reverb Delay Feedback | |
sprintf(buf, "Reverb Delay Feedback: %d", s[7]); | |
break; | |
case 0x36: // Reverb Send to Chorus | |
sprintf(buf, "Reverb Send to Chorus: %d", s[7]); | |
break; | |
case 0x37: // SC-88 Reverb Pre-Delay Time | |
sprintf(buf, "SC-88 Reverb Pre-Delay Time: %d", s[7]); | |
break; | |
case 0x38: // Chorus Macro | |
strcpy(buf, "Chorus Macro: "); | |
switch (s[7]) | |
{ | |
case 0x00: strcat(buf, "Chorus 1"); break; | |
case 0x01: strcat(buf, "Chorus 2"); break; | |
case 0x02: strcat(buf, "Chorus 3"); break; | |
case 0x03: strcat(buf, "Chorus 4"); break; | |
case 0x04: strcat(buf, "Feedback Chorus"); break; | |
case 0x05: strcat(buf, "Flanger"); break; | |
case 0x06: strcat(buf, "Short Delay"); break; | |
case 0x07: strcat(buf, "Short Delay - Feedback"); break; | |
} | |
break; | |
case 0x39: // Chorus PRE-LPF | |
sprintf(buf, "Chorus PRE-LPF: %d", s[7]); | |
break; | |
case 0x3A: // Chorus Level | |
sprintf(buf, "Chorus Level: %d", s[7]); | |
break; | |
case 0x3B: // Chorus Feedback | |
sprintf(buf, "Chorus Feedback: %d", s[7]); | |
break; | |
case 0x3C: // Chorus Delay | |
sprintf(buf, "Chorus Delay: %d", s[7]); | |
break; | |
case 0x3D: // Chorus Rate | |
sprintf(buf, "Chorus Rate: %d", s[7]); | |
break; | |
case 0x3E: // Chorus Depth | |
sprintf(buf, "Chorus Depth: %d", s[7]); | |
break; | |
case 0x3F: // Chorus Send to Reverb | |
sprintf(buf, "Chorus Send to Reverb: %d", s[7]); | |
break; | |
case 0x40: // Chorus Send to Delay | |
sprintf(buf, "Chorus Send to Delay: %d", s[7]); | |
break; | |
case 0x50: // SC-88 Delay Macro | |
strcpy(buf, "SC-88 Delay Macro: "); | |
switch (s[7]) | |
{ | |
case 0x00: strcat(buf, "Delay 1"); break; | |
case 0x01: strcat(buf, "Delay 2"); break; | |
case 0x02: strcat(buf, "Delay 3"); break; | |
case 0x03: strcat(buf, "Delay 4"); break; | |
case 0x04: strcat(buf, "Pan Delay 1"); break; | |
case 0x05: strcat(buf, "Pan Delay 2"); break; | |
case 0x06: strcat(buf, "Pan Delay 3"); break; | |
case 0x07: strcat(buf, "Pan Delay 4"); break; | |
case 0x08: strcat(buf, "Delay to Reverb"); break; | |
case 0x09: strcat(buf, "Pan Repeat"); break; | |
} | |
break; | |
case 0x51: // SC-88 Delay PRE-LPF | |
sprintf(buf, "SC-88 Delay PRE-LPF: %d", s[7]); | |
break; | |
case 0x52: // SC-88 Delay Time Center | |
sprintf(buf, "SC-88 Delay Time Center: %d", s[7]); | |
break; | |
case 0x53: // SC-88 Delay Time Ratio Left | |
sprintf(buf, "SC-88 Delay Time Ratio Left: %d", s[7]); | |
break; | |
case 0x54: // SC-88 Delay Time Ratio Right | |
sprintf(buf, "SC-88 Delay Time Ratio Right: %d", s[7]); | |
break; | |
case 0x55: // SC-88 Delay Level Center | |
sprintf(buf, "SC-88 Delay Level Center: %d", s[7]); | |
break; | |
case 0x56: // SC-88 Delay Level Left | |
sprintf(buf, "SC-88 Delay Level Left: %d", s[7]); | |
break; | |
case 0x57: // SC-88 Delay Level Right | |
sprintf(buf, "SC-88 Delay Level Right: %d", s[7]); | |
break; | |
case 0x58: // SC-88 Delay Level | |
sprintf(buf, "SC-88 Delay Level: %d", s[7]); | |
break; | |
case 0x59: // SC-88 Delay Feedback | |
sprintf(buf, "SC-88 Delay Feedback: %s%d", s[7] > 0x40 ? "+" : "", s[7] - 0x40); | |
break; | |
case 0x5A: // SC-88 Send Level to Reverb | |
sprintf(buf, "SC-88 Send Level to Reverb: %d", s[7]); | |
break; | |
} | |
break; | |
case 0x02: // SC-88 Equalization Parameter | |
switch (s[6]) | |
{ | |
case 0x00: | |
sprintf(buf, "SC-88 Low Freq. EQ: %d Hz", s[7] ? 200 : 100); | |
break; | |
case 0x01: | |
sprintf(buf, "SC-88 Low Freq. Gain: %s%d db", s[7] >= 0x40 ? "+" : "", s[7] - 0x40); | |
break; | |
case 0x02: | |
sprintf(buf, "SC-88 High Freq. EQ: %d kHz", s[7] ? 8 : 4); | |
break; | |
case 0x03: | |
sprintf(buf, "SC-88 High Freq. Gain: %s%d db", s[7] >= 0x40 ? "+" : "", s[7] - 0x40); | |
break; | |
} | |
break; | |
case 0x03: // SC-88 Pro EFX Parameter | |
switch (s[6]) | |
{ | |
case 0x00: | |
sprintf(buf, "SC-88 Pro EFX Type %d/%d", s[7], s[8]); | |
break; | |
default: | |
sprintf(buf, "SC-88 Pro EFX Parameter %d: %d", s[6] - 2, s[7]); | |
break; | |
} | |
break; | |
} | |
break; | |
case 0x41: // Drum Setup Parameter | |
strcpy(buf, "Drum Setup"); | |
break; | |
case 0x48: // SC Bulk Dump | |
strcpy(buf, "SC Bulk Dump"); | |
break; | |
case 0x49: // SC Bulk Dump Drum Parameters | |
strcpy(buf, "SC Bulk Dump Drum Parameters"); | |
break; | |
case 0x50: // SC-88 Block "B" Parameter | |
sprintf(buf, "SC-88 Block \"B\" SC-88 Part %d ", interpret_sysex_part(LONYBBLE(s[5]))); | |
goto SC88PartParam; // Cheap but very effective | |
case 0x58: // SC-88 Block "B" Bulk Dump | |
strcpy(buf, "SC-88 Block \"B\" Bulk Dump"); | |
break; | |
case 0x59: // SC-88 Block "B" Bulk Dump Drum Parameters | |
strcpy(buf, "SC-88 Block \"B\" Bulk Dump Drum Parameters"); | |
break; | |
} | |
break; | |
case 0x45: // GS Display Data | |
switch (s[4]) | |
{ | |
case 0x10: // Sound Canvas Display | |
switch (s[5]) | |
{ | |
case 0x00: // Display Letters | |
if (s[6] == 0x00) // Letter bytes | |
{ | |
strcpy(buf, "SC Display: "); | |
j = strlen(buf); | |
for (i = 7; i < len - 2; i++) | |
buf[j++] = s[i]; | |
buf[j] = '\0'; | |
} | |
break; | |
case 0x01: // Display Dot Letters | |
strcpy(buf, "SC Bitmap: Page 1"); | |
break; | |
case 0x02: | |
strcpy(buf, "SC Bitmap: Page 4"); | |
break; | |
case 0x03: | |
strcpy(buf, "SC Bitmap: Page 5"); | |
break; | |
case 0x04: | |
strcpy(buf, "SC Bitmap: Page 7"); | |
break; | |
case 0x20: // Set Display Page | |
switch (s[6]) | |
{ | |
case 0x00: // Display Page | |
sprintf(buf, "Display Page: %d", s[7]); | |
break; | |
case 0x01: // Display Page Time | |
sprintf(buf, "Display Page Time: %.2f sec", | |
(float) s[7] / 15.0f * 7.2f); | |
break; | |
} | |
break; | |
} | |
break; | |
} | |
break; | |
} | |
break; | |
case 0x43: // Yamaha | |
switch (s[2]) // Model ID | |
{ | |
case 0x49: // SW60XG Message | |
case 0x7A: | |
strcpy(buf, "SW60XG Message"); | |
break; | |
case 0x4C: // XG Message | |
switch (s[3]) // XG System Parameter | |
{ | |
case 0x00: | |
switch (s[4]) // System Byte for XG System Parameter 0x00 | |
{ | |
case 0x00: | |
switch (s[5]) | |
{ | |
case 0x00: // Master Tune | |
strcpy(buf, "Master Tune"); | |
break; | |
case 0x04: // Master Volume | |
sprintf(buf, "Master Volume: %d", s[6]); | |
case 0x7E: // Set XG System On | |
strcpy(buf, "XG Reset"); | |
break; | |
case 0x7F: // All Parameter Reset | |
strcpy(buf, "All Parameter Reset"); | |
break; | |
} | |
break; | |
} | |
break; | |
case 0x02: | |
switch (s[4]) // System Byte for XG System Parameter 0x02 | |
{ | |
case 0x01: | |
switch (s[5]) | |
{ | |
case 0x00: // Reverb | |
strcpy(buf, "Reverb Type: "); | |
strcat(buf, get_yamaha_effect_name(s[6])); | |
break; | |
case 0x02: // Reverb Time | |
sprintf(buf, "Reverb Time: %d", s[6]); | |
break; | |
case 0x03: // Reverb Diffusion | |
sprintf(buf, "Reverb Diffusion: %d", s[6]); | |
break; | |
case 0x04: // Reverb Initial Delay | |
sprintf(buf, "Reverb Initial Delay: %d", s[6]); | |
break; | |
case 0x05: // Reverb HPF Cutoff | |
sprintf(buf, "Reverb HPF Cutoff: %d", s[6]); | |
break; | |
case 0x06: // Reverb LPF Cutoff | |
sprintf(buf, "Reverb LPF Cutoff: %d", s[6]); | |
break; | |
case 0x07: // Reverb Width | |
sprintf(buf, "Reverb Width: %d", s[6]); | |
break; | |
case 0x08: // Reverb Height | |
sprintf(buf, "Reverb Height: %d", s[6]); | |
break; | |
case 0x09: // Reverb Depth | |
sprintf(buf, "Reverb Depth: %d", s[6]); | |
break; | |
case 0x0A: // Reverb Wall Vary | |
sprintf(buf, "Reverb Wall Vary: %d", s[6]); | |
break; | |
case 0x0B: // Reverb Dry/Wet | |
sprintf(buf, "Reverb Dry/Wet: %s%d", (s[6] == 64) ? "" : (s[6] < 64 ? "D" : "W"), abs(s[6] - 64)); | |
break; | |
case 0x0C: // Reverb Level | |
sprintf(buf, "Reverb Level: %d", s[6]); | |
break; | |
case 0x0D: // Reverb Pan | |
sprintf(buf, "Reverb Pan: %s%d", (s[6] == 64) ? "" : (s[6] < 64 ? "L" : "R"), abs(s[6] - 64)); | |
break; | |
case 0x20: // Chorus | |
strcpy(buf, "Chorus Type: "); | |
strcat(buf, get_yamaha_effect_name(s[6])); | |
break; | |
case 0x22: // Chorus LFO Frequency | |
sprintf(buf, "Chorus LFO Frequency: %d", s[6]); | |
break; | |
case 0x23: // Chorus LFO Depth | |
sprintf(buf, "Chorus LFO Depth: %d", s[6]); | |
break; | |
case 0x24: // Chorus Feedback | |
sprintf(buf, "Chorus Feedback: %s%d", s[6] > 0x40 ? "+" : "", s[6] - 0x40); | |
break; | |
case 0x25: // Chorus Delay Offset | |
sprintf(buf, "Chorus Delay Offset: %s%d", s[6] > 0x40 ? "+" : "", s[6] - 0x40); | |
break; | |
case 0x26: // Chorus Parameter 5 | |
sprintf(buf, "Chorus Parameter 5: %d", s[6]); | |
break; | |
case 0x27: // Chorus EQ Low Frequency | |
sprintf(buf, "Chorus EQ Low Frequency: %d", s[6]); | |
break; | |
case 0x28: // Chorus EQ Low Gain | |
sprintf(buf, "Chorus EQ Low Gain: %d", s[6] - 64); | |
break; | |
case 0x29: // Chorus EQ High Frequency | |
sprintf(buf, "Chorus EQ High Frequency: %d", s[6]); | |
break; | |
case 0x2A: // Chorus EQ High Gain | |
sprintf(buf, "Chorus EQ High Gain: %d", s[6] - 64); | |
break; | |
case 0x2B: // Chorus Dry/Wet | |
sprintf(buf, "Chorus Dry/Wet: %d", s[6] - 64); | |
break; | |
case 0x2C: // Chorus Level | |
sprintf(buf, "Chorus Level: %d", s[6]); | |
break; | |
case 0x2D: // Chorus Pan | |
sprintf(buf, "Chorus Pan: %s%d", (s[6] == 64) ? "" : (s[6] < 64 ? "L" : "R"), abs(s[6] - 64)); | |
break; | |
case 0x2E: // Chorus Send to Reverb | |
sprintf(buf, "Chorus Send to Reverb: %d", s[6]); | |
break; | |
case 0x40: // Variation | |
strcpy(buf, "Variation Type: "); | |
strcat(buf, get_yamaha_effect_name(s[6])); | |
break; | |
case 0x42: // Variation Parameter 1 | |
sprintf(buf, "Variation Parameter 1: %d", s[7]); | |
break; | |
case 0x44: // Variation Parameter 2 | |
sprintf(buf, "Variation Parameter 2: %d", s[7]); | |
break; | |
case 0x46: // Variation Parameter 3 | |
sprintf(buf, "Variation Parameter 3: %d", s[7]); | |
break; | |
case 0x48: // Variation Parameter 4 | |
sprintf(buf, "Variation Parameter 4: %d", s[7]); | |
break; | |
case 0x4A: // Variation Parameter 5 | |
sprintf(buf, "Variation Parameter 5: %d", s[7]); | |
break; | |
case 0x4C: // Variation Parameter 6 | |
sprintf(buf, "Variation Parameter 6: %d", s[7]); | |
break; | |
case 0x4E: // Variation Parameter 7 | |
sprintf(buf, "Variation Parameter 7: %d", s[7]); | |
break; | |
case 0x50: // Variation Parameter 8 | |
sprintf(buf, "Variation Parameter 8: %d", s[7]); | |
break; | |
case 0x52: // Variation Parameter 9 | |
sprintf(buf, "Variation Parameter 9: %d", s[7]); | |
break; | |
case 0x54: // Variation Parameter 10 | |
sprintf(buf, "Variation Parameter 10: %d", s[7]); | |
break; | |
case 0x56: // Variation Level | |
sprintf(buf, "Variation Level: %d", s[6]); | |
break; | |
case 0x57: // Variation Pan | |
sprintf(buf, "Variation Pan: %s%d", (s[6] == 64) ? "" : (s[6] < 64 ? "L" : "R"), abs(s[6] - 64)); | |
break; | |
case 0x58: // Variation Send to Reverb | |
sprintf(buf, "Variation Send to Reverb: %d", s[6]); | |
break; | |
case 0x59: // Variation Send to Chorus | |
sprintf(buf, "Variation Send to Chorus: %d", s[6]); | |
break; | |
case 0x5A: // Variation Connection | |
sprintf(buf, "Variation Connection: %s", s[6] ? "System" : "Insertion"); | |
break; | |
case 0x5B: // Variation Part | |
sprintf(buf, "Variation Part: 0x%02X", s[6]); | |
break; | |
} | |
break; | |
case 0x40: | |
switch (s[5]) | |
{ | |
case 0x00: // EQ Type | |
strcpy(buf, "EQ Type: "); | |
switch (s[6]) | |
{ | |
case 0x00: strcat(buf, "Flat"); break; | |
case 0x01: strcat(buf, "Jazz"); break; | |
case 0x02: strcat(buf, "Pops"); break; | |
case 0x03: strcat(buf, "Rock"); break; | |
case 0x04: strcat(buf, "Classic"); break; | |
default: sprintf(&buf[strlen(buf)], "Unknown (%02X)", s[6]); break; | |
} | |
break; | |
case 0x01: // EQ Gain 1 | |
sprintf(buf, "EQ Gain 1: %d", s[6]); | |
break; | |
case 0x02: // EQ Frequency 1 | |
sprintf(buf, "EQ Frequency 1: %d", s[6]); | |
break; | |
case 0x03: // EQ Q1 | |
sprintf(buf, "EQ Q1: %d", s[6]); | |
break; | |
case 0x04: // EQ Shape 1 | |
sprintf(buf, "EQ Shape 1: %s", s[6] ? "Peaking" : "Shelving"); | |
break; | |
case 0x05: // EQ Gain 2 | |
sprintf(buf, "EQ Gain 2: %d", s[6]); | |
break; | |
case 0x06: // EQ Frequency 2 | |
sprintf(buf, "EQ Frequency 2: %d", s[6]); | |
break; | |
case 0x07: // EQ Q2 | |
sprintf(buf, "EQ Q2: %d", s[6]); | |
break; | |
case 0x09: // EQ Gain 3 | |
sprintf(buf, "EQ Gain 3: %d", s[6]); | |
break; | |
case 0x0A: // EQ Frequency 3 | |
sprintf(buf, "EQ Frequency 3: %d", s[6]); | |
break; | |
case 0x0B: // EQ Q3 | |
sprintf(buf, "EQ Q3: %d", s[6]); | |
break; | |
case 0x0D: // EQ Gain 4 | |
sprintf(buf, "EQ Gain 4: %d", s[6]); | |
break; | |
case 0x0E: // EQ Frequency 4 | |
sprintf(buf, "EQ Frequency 4: %d", s[6]); | |
break; | |
case 0x0F: // EQ Q4 | |
sprintf(buf, "EQ Q4: %d", s[6]); | |
break; | |
case 0x11: // EQ Gain 5 | |
sprintf(buf, "EQ Gain 5: %d", s[6]); | |
break; | |
case 0x12: // EQ Frequency 5 | |
sprintf(buf, "EQ Frequency 5: %d", s[6]); | |
break; | |
case 0x13: // EQ Q5 | |
sprintf(buf, "EQ Q5: %d", s[6]); | |
break; | |
case 0x14: // EQ Shape 5 | |
sprintf(buf, "EQ Shape 5: %s", s[6] ? "Peaking" : "Shelving"); | |
break; | |
} | |
break; | |
} | |
break; | |
case 0x03: | |
switch (s[4]) // System Byte for XG System Parameter 0x03 | |
{ | |
case 0x00: | |
case 0x01: // ??? Not sure if 0x01 should be included, see dajir1.mid | |
switch (s[5]) | |
{ | |
case 0x00: // Insertion Effect | |
strcpy(buf, "Insertion Effect: "); | |
strcat(buf, get_yamaha_effect_name(s[6])); | |
break; | |
case 0x0B: // Insertion Parameter 10 | |
sprintf(buf, "Insertion Parameter 10: %d", s[6]); | |
break; | |
case 0x0C: // Insertion Effect Part | |
sprintf(buf, "Insertion Effect Part: %d", s[6]); | |
break; | |
} | |
break; | |
} | |
break; | |
case 0x06: // XG Display | |
/* switch (s[5]) | |
{ | |
case 0x11: // Displayed Letters | |
case 0x12: // Displayed Letters | |
case 0x13: // Displayed Letters*/ | |
strcpy(buf, "Displayed Letters: "); | |
j = strlen(buf); | |
for (i = 6; i < len - 1; i++) | |
buf[j++] = s[i]; | |
buf[j] = '\0'; | |
break; | |
// } | |
break; | |
case 0x08: // XG Part Parameter | |
sprintf(buf, "Part %d ", s[4] + 1); | |
switch (s[5]) | |
{ | |
case 0x00: // Element Reserve | |
sprintf(&buf[strlen(buf)], "Element Reserve: %d", s[6]); | |
break; | |
case 0x01: // Bank Select MSB | |
sprintf(&buf[strlen(buf)], "Bank Select MSB: %d", s[6]); | |
break; | |
case 0x02: // Bank Select LSB | |
sprintf(&buf[strlen(buf)], "Bank Select LSB: %d", s[6]); | |
break; | |
case 0x03: // Program Number | |
sprintf(&buf[strlen(buf)], "Program Number: %d (%s)", s[6], get_program_name(s[6], 0)); | |
break; | |
case 0x04: // Rx Channel | |
sprintf(&buf[strlen(buf)], "Rx Channel: %d", s[6]); | |
break; | |
case 0x05: // Mono/Poly Mode | |
sprintf(&buf[strlen(buf)], "Mono/Poly Mode: %s", s[6] ? "Poly" : "Mono"); | |
break; | |
case 0x06: // Same Note Number Assign | |
sprintf(&buf[strlen(buf)], "Same Note Number Assign: "); | |
switch (s[6]) | |
{ | |
case 0x00: strcat(buf, "Single"); break; | |
case 0x01: strcat(buf, "Multi"); break; | |
case 0x02: strcat(buf, "Inst (for Drum)"); break; | |
default: sprintf(&buf[strlen(buf)], "Unknown (%d)", s[6]); | |
} | |
break; | |
case 0x07: // Part Mode | |
strcat(buf, "Part Mode: "); | |
switch (s[6]) | |
{ | |
case 0x00: strcat(buf, "Normal"); break; | |
case 0x01: strcat(buf, "Drum"); break; | |
case 0x02: strcat(buf, "Drums 1"); break; | |
case 0x03: strcat(buf, "Drums 2"); break; | |
case 0x04: strcat(buf, "Drums 3"); break; | |
case 0x05: strcat(buf, "Drums 4"); break; | |
default: sprintf(&buf[strlen(buf)], "Unknown (%02X)", s[6]); break; | |
} | |
break; | |
case 0x08: // Note Shift | |
sprintf(&buf[strlen(buf)], "Note Shift: %s%d semitones", s[6] > 0x40 ? "+" : "", s[6] - 0x40); | |
break; | |
case 0x09: // Detune | |
sprintf(&buf[strlen(buf)], "Detune: %d/%d", s[6], s[7]); | |
break; | |
case 0x0B: // Volume | |
sprintf(&buf[strlen(buf)], "Volume: %d", s[6]); | |
break; | |
case 0x0C: // Velocity Sense Depth | |
sprintf(&buf[strlen(buf)], "Velocity Sense Depth: %d", s[6]); | |
break; | |
case 0x0D: // Velocity Sense Offset | |
sprintf(&buf[strlen(buf)], "Velocity Sense Offset: %d", s[6]); | |
break; | |
case 0x0E: // Pan | |
strcat(buf, "Pan: "); | |
if (!s[6]) | |
strcat(buf, "Random"); | |
else | |
if (s[6] < 64) | |
sprintf(&buf[strlen(buf)], "L%d", 64 - s[6]); | |
else | |
if (s[6] == 64) | |
sprintf(&buf[strlen(buf)], "0"); | |
else | |
sprintf(&buf[strlen(buf)], "R%d", s[6] - 64); | |
break; | |
case 0x11: // Dry Level | |
sprintf(&buf[strlen(buf)], "Dry Level: %d", s[6]); | |
break; | |
case 0x12: // Chorus Level | |
sprintf(&buf[strlen(buf)], "Chorus Level: %d", s[6]); | |
break; | |
case 0x13: // Reverb Level | |
sprintf(&buf[strlen(buf)], "Reverb Level: %d", s[6]); | |
break; | |
case 0x14: // Variation Level | |
sprintf(&buf[strlen(buf)], "Variation Level: %d", s[6]); | |
break; | |
case 0x15: // Vibrato Rate | |
sprintf(&buf[strlen(buf)], "Vibrato Rate: %d", s[6]); | |
break; | |
case 0x16: // Vibrato Depth | |
sprintf(&buf[strlen(buf)], "Vibrato Depth: %d", s[6]); | |
break; | |
case 0x17: // Vibrato Delay | |
sprintf(&buf[strlen(buf)], "Vibrato Delay: %d", s[6]); | |
break; | |
case 0x18: // Filter Cutoff | |
sprintf(&buf[strlen(buf)], "Filter Cutoff: %d", s[6]); | |
break; | |
case 0x19: // Filter Resonance | |
sprintf(&buf[strlen(buf)], "Filter Resonance: %d", s[6]); | |
break; | |
case 0x1A: // Attack Time | |
sprintf(&buf[strlen(buf)], "Attack Time: %d", s[6]); | |
break; | |
case 0x1B: // Decay Time | |
sprintf(&buf[strlen(buf)], "Decay Time: %d", s[6]); | |
break; | |
case 0x1C: // Release Time | |
sprintf(&buf[strlen(buf)], "Release Time: %d", s[6]); | |
break; | |
case 0x1D: // Mod Pitch Control | |
sprintf(&buf[strlen(buf)], "Mod Pitch Control: %d", s[6]); | |
break; | |
case 0x1E: // Mod Filter Control | |
sprintf(&buf[strlen(buf)], "Mod Filter Control: %d", s[6]); | |
break; | |
case 0x1F: // Mod Amplitude Control | |
sprintf(&buf[strlen(buf)], "Mod Amplitude Control: %d", s[6]); | |
break; | |
case 0x20: // LFO PMOD Depth | |
sprintf(&buf[strlen(buf)], "LFO PMOD Depth: %d", s[6]); | |
break; | |
case 0x21: // LFO FMOD Depth | |
sprintf(&buf[strlen(buf)], "LFO FMOD Depth: %d", s[6]); | |
break; | |
case 0x22: // LFO AMOD Depth | |
sprintf(&buf[strlen(buf)], "LFO AMOD Depth: %d", s[6]); | |
break; | |
case 0x23: // Bend Pitch Control | |
sprintf(&buf[strlen(buf)], "Bend Pitch Control: %d", s[6]); | |
break; | |
case 0x24: // Bend Filter Control | |
sprintf(&buf[strlen(buf)], "Bend Filter Control: %d", s[6]); | |
break; | |
case 0x25: // Bend Amplitude Control | |
sprintf(&buf[strlen(buf)], "Bend Amplitude Control: %d", s[6]); | |
break; | |
case 0x26: // Bend LFO PMOD Depth | |
sprintf(&buf[strlen(buf)], "Bend LFO PMOD Depth: %d", s[6]); | |
break; | |
case 0x27: // Bend LFO FMOD Depth | |
sprintf(&buf[strlen(buf)], "Bend LFO FMOD Depth: %d", s[6]); | |
break; | |
case 0x28: // Bend LFO AMOD Depth | |
sprintf(&buf[strlen(buf)], "Bend LFO AMOD Depth: %d", s[6]); | |
break; | |
case 0x69: // Pitch Initial Level | |
sprintf(&buf[strlen(buf)], "Pitch Initial Level: %d", s[6] - 64); | |
break; | |
case 0x6A: // Pitch Attack Time | |
sprintf(&buf[strlen(buf)], "Pitch Attack Time: %d", s[6] - 64); | |
break; | |
case 0x6B: // Pitch Release Level | |
sprintf(&buf[strlen(buf)], "Pitch Release Level: %d", s[6] - 64); | |
break; | |
case 0x6C: // Pitch Release Time | |
sprintf(&buf[strlen(buf)], "Pitch Release Time: %d", s[6] - 64); | |
break; | |
} | |
break; | |
case 0x30: // XG Drum Parameter | |
case 0x31: | |
sprintf(buf, "Drum Note %d Parameter %d = %d", s[4], s[5], s[6]); | |
break; | |
} | |
break; | |
} | |
break; | |
case 0x7E: // General MIDI | |
case 0x7F: | |
// F0 7E 7F 09 01 F7 (definitely standard GM Reset) | |
// F0 7F 7F 04 01 00 7F F7 (?? from FF7 MIDI's) | |
// F0H,7FH,7FH,04H,01H,llH,mmH,F7H | |
// F0 7F 7F 04 01 00 7E F7 | |
if (s[1] == 0x7F && | |
s[2] == 0x09 && | |
s[3] == 0x01) | |
strcpy(buf, "GM Reset"); | |
else | |
if (s[1] == 0x7F && | |
s[2] == 0x04 && | |
s[3] == 0x01) | |
sprintf(buf, "Master Volume: %d", s[5]); | |
break; | |
} | |
return buf; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment