#include #include #include #include using namespace std; unsigned long int get32le(fstream* input){ unsigned char b1=input->get(); unsigned char b2=input->get(); unsigned char b3=input->get(); unsigned char b4=input->get(); long int i1=b1; long int i2=b2; long int i3=b3; long int i4=b4; return i1 | (i2<<8) | (i3<<16) | (i4<<24);} int main(int argc, char** argv){ if (argc <= 1){ cout << "Instrument Reorderer for FamiTracker\n" << "Usage: reinst [filename] ([listname])\n" << "Description: Reads a text file containing space-delimited hexadecimal numbers,\n" << " so that the ordering of the FamiTracker module's instruments,\n" << " including those not created, matches the text file.\n" << "Options:\n" << "[filename]: Name of the FTM\n" << "[listname]: Name of the reorder list. Defaults to \"reinst.txt\" if not present" << endl;} else{ int version; fstream instlist((argc >= 3) ? (argv[2]) : ("reinst.txt"), ios::in); if (!instlist){ cerr << "Cannot open instrument list!" << endl; exit(1);} fstream ftm(argv[1], ios::in | ios::out | ios::binary); if (!ftm){ cerr << "Cannot open FamiTracker module!" << endl; exit(1);} fstream* ftmP = &ftm; int* permute = new int[65]; for (int i=0;i<=0x40;i++){ permute[i]=i;} for (int i=0;i<0x40;i++){ if (instlist){ string str; instlist >> str; if (str!="") permute[stoi(str,NULL,16)]=i;}} ftm.seekg(0x2A); ftm.seekg(get32le(ftmP)+0x14,ios_base::cur); ftm.seekg(get32le(ftmP)+0x14,ios_base::cur); int pos=get32le(ftmP); pos+=0x10+ftm.tellg(); int songs=ftm.get()+1; int zero=0; while (zero(&newinst),1); ftm.seekg(0x3,ios_base::cur); switch(ftm.get()){ case 1: // 2A03 ftm.seekg(0x9E+0x30*(version>=2)+0x60*(version>=6),ios_base::cur); break; case 2: // VRC6 ftm.seekg(0xE,ios_base::cur); break; case 3: // VRC7 ftm.seekg(0xC,ios_base::cur); break; case 4: // FDS ftm.seekg(0x6C,ios_base::cur); for (int j=0;j<3;j++) ftm.seekg(ftm.get()+0xC,ios_base::cur); break; case 5: // N163 ftm.seekg(0xE,ios_base::cur); int wavecount=get32le(ftmP); ftm.seekg(0x4,ios_base::cur); ftm.seekg(wavecount*get32le(ftmP),ios_base::cur); break;} ftm.seekg(get32le(ftmP),ios_base::cur);} ftm.seekg(0x14,ios_base::cur); ftm.seekg(get32le(ftmP)+0x14,ios_base::cur); ftm.seekg(get32le(ftmP)+0x10,ios_base::cur); // seeks through "PATTERNS " for normally created FTMs version=get32le(ftmP); int patsize=get32le(ftmP)+ftm.tellg(); while (ftm.tellg()(&newinst2),1); int pos2=ftm.tellg(); ftm.seekg(headerpos+(songs+1)*channel+track+1); ftm.seekg(pos2+3+2*ftm.get());}}} return 0;}