void MidiDriver_MT32::mt32SysEx(const byte *&dataPtr, int32 &bytesLeft) { byte sysExMessage[270]; uint16 sysExPos = 0; byte sysExByte = 0; uint16 sysExChecksum = 0; memset(&sysExMessage, 0, sizeof(sysExMessage)); sysExMessage[0] = 0x41; // Roland sysExMessage[1] = 0x10; sysExMessage[2] = 0x16; // Model MT32 sysExMessage[3] = 0x12; // Command DT1 sysExPos = 4; sysExChecksum = 0; while (1) { assert(bytesLeft); sysExByte = *dataPtr++; bytesLeft--; if (sysExByte == 0xff) break; // Message done assert(sysExPos < sizeof(sysExMessage)); sysExMessage[sysExPos++] = sysExByte; sysExChecksum -= sysExByte; } // Calculate checksum assert(sysExPos < sizeof(sysExMessage)); sysExMessage[sysExPos++] = sysExChecksum & 0x7f; debugC(kDebugLevelMT32Driver, "MT32: uploading patch data, size %d", sysExPos); // Send SysEx _driver->sysEx(sysExMessage, sysExPos); // Wait the time it takes to send the SysEx data uint32 delay = (sysExPos + 2) * 1000 / 3125; // Plus an additional delay for the MT-32 rev00 if (_nativeMT32) delay += 40; g_system->delayMillis(delay); }