Skip to content

Instantly share code, notes, and snippets.

@kode54
Created June 19, 2014 02:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kode54/ded4e0f4629d68f62cc9 to your computer and use it in GitHub Desktop.
Save kode54/ded4e0f4629d68f62cc9 to your computer and use it in GitHub Desktop.
MIDI System Exclusive message interpreter from TMIDI - Tom's MIDI Player
// 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