diff --git a/Source/PluginData.h b/Source/PluginData.h index 22cc6f2..b10e099 100644 --- a/Source/PluginData.h +++ b/Source/PluginData.h @@ -30,7 +30,7 @@ uint8_t sysexChecksum(const uint8_t *sysex, int size); void exportSysexPgm(uint8_t *dest, uint8_t *src); -#define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 } +#define SYSEX_HEADER { 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 } #define SYSEX_SIZE 4104 class Cartridge { @@ -90,6 +90,11 @@ public: return rc; } + /** + * Loads sysex stream + * Returns 0 if it was parsed sucessfully + * Returns -1 if it cannot open the stream + */ int load(InputStream &fis) { uint8 buffer[65535]; int sz = fis.read(buffer, 65535); @@ -98,8 +103,17 @@ public: return load(buffer, sz); } + /** + * Loads sysex buffer + * Returns 0 if it was parsed sucessfully + * Returns 1 if sysex checksum didn't match + * Returns 2 if no sysex data found, probably random data + */ int load(const uint8_t *stream, int size) { const uint8 voiceHeaderBroken[] = { 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 }; + // I've added a stupid bug that saved the wrong sysex data for dx7 sysex (0.9.1) + // This is there to support this version. One day we will be able to remove this. :( + uint8 voiceHeader[] = SYSEX_HEADER; uint8 tmp[65535]; uint8 *pos = tmp; @@ -113,16 +127,14 @@ public: while(size >= 4104) { // random data if ( pos[0] != 0xF0 ) { - if ( status != 0 ) + if ( status != 3 ) return status; memcpy(voiceData, pos+6, 4096); - TRACE("SYSEX Header not found, loading random data"); return 2; } pos[3] = 0; if ( memcmp(pos, voiceHeader, 6) == 0 || memcmp(pos, voiceHeaderBroken, 6) == 0) { - TRACE("SYSEX voice header found at %d", pos); memcpy(voiceData, pos, SYSEX_SIZE); if ( sysexChecksum(voiceData + 6, 4096) == pos[4102] ) status = 0; @@ -143,6 +155,12 @@ public: stream += i; } + // nothing good has been found, map it then to random data + if ( status > 1 ) { + memcpy(voiceData, pos+6, 4096); + return 2; + } + return status; } @@ -168,7 +186,7 @@ public: } // To avoid to erase the performance data, we skip the sysex stream until - // we see the header 0xF0, 0x43, 0x00, 0x00, 0x20, 0x00 + // we see the header 0xF0, 0x43, 0x00, 0x09, 0x20, 0x00 int pos = 0; bool found = 0;