示例#1
0
        //chunk RawData into PtrTable, WaveTable and Sfx
        private void ChunkRawData(int id)
        {
            //initialized to 16 to avoid first soundbank set to 0..
            int sizeOfPtrTable = 0;

            //searching waveTable (end of PtrTable) and write ptrTable rawData
            sizeOfPtrTable = CGeneric.SearchBytesInArray(rawData, CGeneric.patternN64WaveTable, 0, 16, 16);
            ptrTable       = CGeneric.GiveMeArray(rawData, 0, sizeOfPtrTable);

            //waveTable = CGeneric.GiveMeArray(rawData,ptrTable.Length,rawData.Length - ptrTable.Length);

            int sizeSfx  = 0;
            int sizeMidi = 0;

            //searching midi and sfx
            switch (id)
            {
            case 0:
                sizeMidi = DecomposeSong();
                break;

            //there is a midi song and sfx, so with a unknow wavetable length, we need to determine sfx and midi length..
            case 1:
                var startMidi = CGeneric.SearchBytesInArray(rawData, CGeneric.patternMidiSoundBank1, 0, 0, 16);
                sizeMidi = RomLangAddress.GetSizeMidiSoundBank1();
                sizeSfx  = rawData.Length - (startMidi + sizeMidi);
                break;

            //there is song but no sfx
            case 2:
                sizeMidi = RomLangAddress.GetSizeMidiSoundBank2();
                break;

            //standard computed sfx size and no midi file (dirty check, but seems working pretty well).
            default:
                int tmpSfxEqualValue;
                int tmpSfxEqualValue2;
                int tmpSfxEqualValue3;
                int tmpSfxNull;

                for (int i = ptrTable.Length; i < rawData.Length - 16; i += 16)
                {
                    //quick test, for avoiding cpu consuption
                    tmpSfxNull = CGeneric.ConvertByteArrayToInt(CGeneric.GiveMeArray(rawData, i + 12, 4));
                    if (tmpSfxNull == 0)
                    {
                        tmpSfxEqualValue  = CGeneric.ConvertByteArrayToInt(CGeneric.GiveMeArray(rawData, i, 4));
                        tmpSfxEqualValue2 = CGeneric.ConvertByteArrayToInt(CGeneric.GiveMeArray(rawData, i + 4, 4));
                        tmpSfxEqualValue3 = CGeneric.ConvertByteArrayToInt(CGeneric.GiveMeArray(rawData, i + 8, 4));
                        var tmpSfxEqualValue4 = tmpSfxEqualValue3++;
                        if (tmpSfxEqualValue != 0 && tmpSfxEqualValue == tmpSfxEqualValue2 && (tmpSfxEqualValue2 == tmpSfxEqualValue4 || tmpSfxEqualValue2 == tmpSfxEqualValue3))
                        {
                            sizeSfx = rawData.Length - i;
                            break;
                        }
                    }
                }
                break;
            }

            //store date with size found previously
            waveTable = CGeneric.GiveMeArray(rawData, ptrTable.Length, rawData.Length - (ptrTable.Length + sizeMidi + sizeSfx));
            midi      = CGeneric.GiveMeArray(rawData, ptrTable.Length + waveTable.Length, sizeMidi);
            sfx       = CGeneric.GiveMeArray(rawData, ptrTable.Length + waveTable.Length + sizeMidi, sizeSfx);
        }