Esempio n. 1
0
File: xgm.c Progetto: clbr/SGDK
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;
}
Esempio n. 2
0
File: xgmsmp.c Progetto: elraro/SGDK
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;
}