XGM* XGM_createFromData(unsigned char* data, int dataSize) { int s; XGM* result = XGM_create(); if (!silent) printf("Parsing XGM file...\n"); if (strncasecmp(&data[0x00], "XGM ", 4)) { printf("Error: XGM file not recognized !\n"); return NULL; } // sample id table LList* samples = NULL; for (s = 1; s < 0x40; s++) { int offset = getInt16(data, (s * 4) + 0); int len = getInt16(data, (s * 4) + 2); // ignore empty sample if ((offset != 0xFFFF) && (len != 0x0100)) { offset <<= 8; len <<= 8; // add sample samples = insertAfterLList(samples, XGMSample_create(s, data + (offset + 0x104), len, offset)); } } result->samples = getHeadLList(samples); // calculate music data offset (sample block size + 0x104) int offset = (getInt16(data, 0x100) << 8) + 0x104; // int version = data[0x102]; result->pal = data[0x103] & 1; // get music data length int len = getInt(data, offset); if (verbose) { printf("XGM sample number: %d\n", getSizeLList(result->samples)); printf("XGM start music data: %6X len: %d\n", offset + 4, len); } // build command list XGM_parseMusic(result, data + offset + 4, len); if (!silent) printf("XGM duration: %d frames (%d seconds)\n", XGM_computeLenInFrame(result), XGM_computeLenInSecond(result)); // GD3 tags ? if (data[0x103] & 2) result->gd3 = GD3_createFromData(data + offset + 4 + len); return result; }
XGMSample* XGMSample_createFromVGMSample(SampleBank* bank, Sample* sample) { int dataSize; unsigned char* data; // invalid sample if (sample->rate == 0) return NULL; data = resample(bank->data, bank->offset + sample->dataOffset + 7, sample->len - 1, sample->rate, 14000, 256, &dataSize); // index should be modified when inserted in sample list XGMSample* result = XGMSample_create(0, data, dataSize, sample->dataOffset); return result; }