I recently noticed v2.2 update. Congratulations.
It works very good, but I'd like to mention to a few of nitpicky things.
Order of RPN/NRPN
GBAMusRiper sends LSB first, but AFAIK most MIDI files sends MSB first. (General MIDI Lite v1.0 RP (RP-033) PDF has an example of it)
I prefer GBAMusRiper changes MSB/LSB order of RPN/NRPN. (I mean, use 101, 100, 6, 38, rather than 100, 101, 6, 38)
Pan and Volume Curve
I guess GBA MP2000 uses linear pan (well, it's a guess). On other hand, GM2 compatible sound modules does not use linear pan, but they use sin/cos volume curve instead. (see RP024)
If you want to make the volume balance of output sequence more GBA-like, you probably need to convert pan value and adjust volume value.
// Takes a percentage pan value (linear volume curve)
// and converts it to a standard midi curve (sin/cos curve)
double ConvertPercentPanToStdMidiScale(double percent, double * ptr_volume_scale)
double panPI2 = atan2(percent, 1.0 - percent);
if (ptr_volume_scale != NULL)
*ptr_volume_scale = 1.0 / (cos(panPI2) + sin(panPI2)); // <= 1.0
return panPI2 / M_PI_2;
However, I like the current simple conversion. It's just a nitpick.