fbpx
Skip to main content

MIDI Forum

Example MIDIs with ...
 
Notifications
Clear all

Example MIDIs with XG/GS drums?

20 Posts
8 Users
0 Reactions
11.2 K Views
Nikolai
Posts: 36
Trusted Member
Topic starter
 

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

 
Posted : 05/11/2021 1:18 am
Nikolai
Posts: 36
Trusted Member
Topic starter
 

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]

 
Posted : 05/11/2021 1:41 am
JohnG
Posts: 226
 

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.

 
Posted : 05/11/2021 2:44 am
Sema
 Sema
Posts: 179
Reputable Member
 

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.

 
Posted : 05/11/2021 6:39 am
Eddie Lotter
Posts: 295
Reputable Member
 

[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.

 
Posted : 05/11/2021 6:41 am
Nikolai
Posts: 36
Trusted Member
Topic starter
 

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..

 
Posted : 05/11/2021 6:59 am
Nikolai
Posts: 36
Trusted Member
Topic starter
 

[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?

 
Posted : 05/11/2021 7:07 am
Sema
 Sema
Posts: 179
Reputable Member
 

[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
 
Posted : 05/11/2021 8:40 am
Nikolai
Posts: 36
Trusted Member
Topic starter
 

[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

 
Posted : 05/11/2021 9:27 am
Sema
 Sema
Posts: 179
Reputable Member
 

Third byte is the device ID. 10 means for the device 10, 7f means for all devices.
Check the specs 🙂

 
Posted : 05/11/2021 9:38 am
Nikolai
Posts: 36
Trusted Member
Topic starter
 

Ah, cool. Didn't know that, thanks.

 
Posted : 05/11/2021 9:50 am
Jason
Posts: 438
Honorable Member
 

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.

 
Posted : 05/11/2021 5:43 pm
Jason
Posts: 438
Honorable Member
 

Here's a GS file with drums on 10 and 11, type 0.

 
Posted : 05/11/2021 5:55 pm
Jason
Posts: 438
Honorable Member
 

Another GS, drums on 10 and 11, type 1.

 
Posted : 05/11/2021 6:04 pm
Jason
Posts: 438
Honorable Member
 

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.

 
Posted : 05/11/2021 8:28 pm
Page 1 / 2
Share: