Hello, I am developing some open-source MIDI software.
I have been trying to find some MIDIs with XG/GS drum use, so I can proper test the software works.
Specifically these types:
Type 1 MIDI with XG drums in tracks where there also is melodic notes.
Type 0 and 1 GS MIDI with drums on channel that is not 10, especially where there also is melodic notes in same track.
Does anyone have such MIDIs laying around or link to such? Would be appreciated.
Regards
- Nikolai
And one question more:
What does 'sum' mean in the specification below:
[code type=markup]
SYSEX GS USE FOR RHYTHM PART
[ F0 41 10 42 12 40 1x 15 mm sum F7 ]
x : 1 - 9 => 0 - 8 channel / 0 => 9 channel / A - F => 11 - 16 channel
mm : 0 => normal part / 1,2 => set to drum track
[/code]
With SysEX mesages for GS devices the penultimate byte is a checksum as detailed in several of the GS device specifications.
(See the manual for the SC-8850, where I found it in the past.)
JohnG.
The GS file called test-sysex-gs-40-1x-15-drum-part-change.mid is available at https://github.com/jazz-soft/test-midi-files
An XG example at http://midkar.com/MidiStudio/ERock/Spice_Girls_Wannabe_XG.mid uses drums on channels 9, 10, 11 via "Bank select" and "Program Change" messages.
[quotePost id=11803]What does 'sum' mean in the specification below:[/quotePost]
You can have a look at my tutorial to understand how the checksum works.
Thank you for all the answers and the samples. 🙂
One more thing I am confused about is if GS can convert a channel to drums in the middle of the song? or if it always applies to whole song. The message was called non-realtime in the spec, which leads me to believe its only for whole song, but I don't know..
[quotePost id=11808]The GS file called test-sysex-gs-40-1x-15-drum-part-change.mid[/quotePost]
Am I reading it wrong or is this a GM file? I didn't find the F0 41 10 42 12 40 00 7F 00 41 F7 in it..
So it should not be legal for it to change drum parts, right?
[quotePost id=11811]
Am I reading it wrong or is this a GM file? I didn't find the F0 41 10 42 12 40 00 7F 00 41 F7 in it..
So it should not be legal for it to change drum parts, right?[/quotePost]
Changing drum parts is legal, but that makes the MIDI file incompatible with non-GS synths.
SMF:
type: 0
ppqn: 96
tracks: 1
MTrk:
0: ff03 -- Sequence Name: GS Drum Part Change Test
0: ff02 -- Copyright: https://jazz-soft.net
0: ff01 -- Text: Changing the drum channel on GS-compatible synths.\n
0: f0 41 7f 42 12 40 00 7f 00 41 f7 (GS Reset)
0: f0 41 7f 42 12 40 11 15 02 18 f7 (GS Drum Part Change)
0: ff01 -- Text: If your synth supports GS you must hear drum playing on channel 0
0: 90 30 7f -- Note On
96: 80 30 40 -- Note Off
96: 90 34 7f -- Note On
192: 80 34 40 -- Note Off
192: 90 37 7f -- Note On
288: 80 37 40 -- Note Off
288: 90 3c 7f -- Note On
384: 80 3c 40 -- Note Off
576: f0 41 7f 42 12 40 10 15 00 1b f7 (GS Drum Part Change)
576: ff01 -- Text: If your synth supports GS you must hear piano playing on channel 9
576: 99 30 7f -- Note On
672: 89 30 40 -- Note Off
672: 99 34 7f -- Note On
768: 89 34 40 -- Note Off
768: 99 37 7f -- Note On
864: 89 37 40 -- Note Off
864: 99 3c 7f -- Note On
960: 89 3c 40 -- Note Off
1152: ff01 -- Text: Thank you!
1152: ff2f -- End of Track
[quotePost id=11814][code] 0: f0 41 7f 42 12 40 00 7f 00 41 f7 (GS Reset)[/quotePost]
But why 7F instead of 10? All the specs I looked at showed 41 10 42 ...etc
Third byte is the device ID. 10 means for the device 10, 7f means for all devices.
Check the specs 🙂
Ah, cool. Didn't know that, thanks.
Here are two XG files. One has drums on Ch 10 and 11, type 1. The other has drums on 9, 10, and 11, type 0.
Here's a GS file with drums on 10 and 11, type 0.
Another GS, drums on 10 and 11, type 1.
FYI, here is my code from my instrument changer to check for GS percussion assignment on a non-standard channel:
[code type=markup]
// GS Custom Percussion Assignment
// F0 0A 41 (10) 42 12 [40 1A 15] [02] 0F F7
// [.. 1x ..] x = part# / (probably) ch# 1-9, 0, A-F
// [0y] y = type: 0 = standard, 1 = drum map 1, 2 = drum map 2
else if ((buffer_peek(global.edit_buffer, cur_pos, buffer_u8) == 0x41) &&
/*(buffer_peek(global.edit_buffer, cur_pos + 1, buffer_u8) == 0x10) &&*/
(buffer_peek(global.edit_buffer, cur_pos + 2, buffer_u8) == 0x42) &&
(buffer_peek(global.edit_buffer, cur_pos + 3, buffer_u8) == 0x12) &&
(buffer_peek(global.edit_buffer, cur_pos + 4, buffer_u8) == 0x40) &&
/*(buffer_peek(global.edit_buffer, cur_pos + 5, buffer_u8) == 0x00) &&*/
(buffer_peek(global.edit_buffer, cur_pos + 6, buffer_u8) == 0x15) &&
/*(buffer_peek(global.edit_buffer, cur_pos + 7, buffer_u8) == 0x00) &&*/
(buffer_peek(global.edit_buffer, cur_pos + 8, buffer_u8) == 0x0F) &&
(buffer_peek(global.edit_buffer, cur_pos + 9, buffer_u8) == 0xF7))
{
part_num = buffer_peek(global.edit_buffer, cur_pos + 5, buffer_u8);
part_num -= 0xF;
part_type = buffer_peek(global.edit_buffer, cur_pos + 7, buffer_u8);
global.custom_drums[part_num - 1] = part_type;
}
buffer_seek(global.edit_buffer, buffer_seek_relative, v_length);
break;
[/code]
I read the F0 to trigger a SYSEX scan (all values in HEX). If the next byte is 0A then check for 41 (skip device ID) 42 12 40 (skip part number) 15 (skip type) 0F F7. If those all match, I then go back and read the part number and type.
XG is easier to determine percussion channels, as the MSB for a channel will either be set to 126 or 127.
GM can also have percussion set with MSB 120.