public void WriteAllData(FileStream fs) { //set 16bit alignment for first soundbank int alignment = 16 - ((int)fs.Position % 16); for (int i = 0; i < alignment; i++) { fs.WriteByte(0); } //update address of midi (SoundBank 0) by making the difference between old position and new position this.finalIndexAudioStart = (int)fs.Position; //Array.Copy(rawData, RomLangAddress.GetMidiSongSoundBank0(), addressHeaderSb0, 0, addressHeaderSb0.Length); //set the good position of song, and write to rom int valueToStore1 = 0; int lengthData = 0; int adder = 0; fs.Position = RomLangAddress.GetMidiSongSoundBank0(); for (int i = 0; i < soundBankList[0].songList.Count; i++) { //finalindexaudiostart + ptrlength+wavedatalength valueToStore1 = finalIndexAudioStart + soundBankList[0].ptrTable.Length + soundBankList[0].waveTable.Length + adder; lengthData = soundBankList[0].songList[i].rawData.Length; fs.Write(CGeneric.ConvertIntToByteArray(valueToStore1), 0, 4); fs.Write(CGeneric.ConvertIntToByteArray(valueToStore1 + lengthData), 0, 4); adder += lengthData; } /*for (int i = 0; i < addressHeaderSb0.Length; i += 4) * { * int tmpValue = CGeneric.ConvertByteArrayToInt(CGeneric.GiveMeArray(addressHeaderSb0, i, 4)); * if (finalIndexAudioStart > initialIndexAudioStart) * tmpValue += finalIndexAudioStart - initialIndexAudioStart; * else * tmpValue -= initialIndexAudioStart - finalIndexAudioStart; * byte[] tmpBytesNew = CGeneric.ConvertIntToByteArray(tmpValue); * for(int j = 0; j < tmpBytesNew.Length; j++) * addressHeaderSb0[i + j] = tmpBytesNew[j]; * * }*/ //write rawData soundBank fs.Position = finalIndexAudioStart; //write ptrData, waveTable, midi and sfx for (int i = 0; i <= 0x15; i++) { //write ptrData and update position soundBankList[i].address.PtrTable = CGeneric.ConvertIntToByteArray((int)fs.Position); fs.Write(soundBankList[i].ptrTable, 0, soundBankList[i].ptrTable.Length); //write waveTable and update position soundBankList[i].address.WaveTable = CGeneric.ConvertIntToByteArray((int)fs.Position); fs.Write(soundBankList[i].waveTable, 0, soundBankList[i].waveTable.Length); //write midi song and update sfx position ! (will only change the position of soundbank 1 and 2, the others doesn't have midi) soundBankList[i].address.Sfx = CGeneric.ConvertIntToByteArray((int)fs.Position); fs.Write(soundBankList[i].GetRawSongs() /*midi*/, 0, soundBankList[i].GetRawSongs().Length /*midi.Length*/); //write sfx and update position fs.Write(soundBankList[i].sfx, 0, soundBankList[i].sfx.Length); //write end position soundBankList[i].address.end = CGeneric.ConvertIntToByteArray((int)fs.Position); } long savedFsPosition = fs.Position; //update address in the header (first part) for (int i = 0; i <= 0x15; i++) { fs.Position = RomLangAddress.GetSoundBankPtrTable()[i]; fs.Write(soundBankList[i].address.PtrTable, 0, 4); fs.Write(soundBankList[i].address.WaveTable, 0, 4); if (i == 0 || i == 2) { if (i == 2) { fs.Position -= 0x38; fs.Write(soundBankList[i].address.Sfx, 0, 4); // in fact, it's the start of midi fs.Write(soundBankList[i].address.end, 0, 4); // and it's end here (and not the sfx) fs.Position += 0x30; } byte[] nullBytes = new byte[4]; fs.Write(nullBytes, 0, 4); fs.Write(nullBytes, 0, 4); } else { fs.Write(soundBankList[i].address.Sfx, 0, 4); //small hack.. weird part in the rom... if (i != 1) { fs.Write(soundBankList[i].address.end, 0, 4); } else { int oldValue = CGeneric.ConvertByteArrayToInt(soundBankList[i].address.end); byte[] newValue = CGeneric.ConvertIntToByteArray(oldValue - 0x470); fs.Write(newValue, 0, 4); } } fs.Write(soundBankList[i].address.WaveTable, 0, 4); } //update address in the header(second part) for (int i = 4; i <= 0x14; i++) { fs.Position = RomLangAddress.GetSoundBankPtrTable()[i] + 0x168; fs.Write(soundBankList[i].address.PtrTable, 0, 4); fs.Write(soundBankList[i].address.WaveTable, 0, 4); fs.Write(soundBankList[i].address.Sfx, 0, 4); fs.Write(soundBankList[i].address.end, 0, 4); fs.Write(soundBankList[i].address.WaveTable, 0, 4); } fs.Position = savedFsPosition; }