00001
00002
00003
00004
00005
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008 #include <string.h>
00009
00010 main(int ac, char *av[])
00011 {
00012 char *inpt,*outpt;
00013 FILE *inf,*outf;
00014 int j;
00015 unsigned char *workbuf;
00016 char orders[256];
00017 int workptr;
00018 unsigned long i,numpats,k;
00019 unsigned long length,repstart,replen;
00020 char insstruc[30];
00021 int numorders;
00022 unsigned int period,ins,effect;
00023 long percentile;
00024
00025 int periodtable[]={6848,6464,6096,5760,5424,5120,4832,4560,4304,
00026 4064,3840,3628,3424,3232,3048,2880,2712,2560,
00027 2416,2280,2152,2032,1920,1814,1712,1616,1524,
00028 1440,1356,1280,1208,1140,1076,1016, 960, 907,
00029 856, 808, 762, 720, 678, 640, 604, 570, 538,
00030 508, 480, 453, 428, 404, 381, 360, 339, 320,
00031 302, 285, 269, 254, 240, 226, 214, 202, 190,
00032 180, 170, 160, 151, 143, 135, 127, 120, 113,
00033 107, 101, 95, 90, 85, 80, 75, 71, 67,
00034 63, 60, 56, 53, 50, 47, 45, 42, 40,
00035 37, 35, 33, 31, 30, 28};
00036
00037 if (ac<3) {
00038 printf("syntax: AMF2MOD inputfile outputfile\n");
00039 exit(1);
00040 }
00041
00042 inpt=av[1];
00043 outpt=av[2];
00044
00045 inf=fopen(inpt,"rb");
00046 outf=fopen(outpt,"wb");
00047
00048 if (!inf) {
00049 printf ("Unable to open file for reading '%s'\n", inpt);
00050 exit(-1);
00051 }
00052 else if (!outf) {
00053 printf ("Unable to open file for writing '%s'\n", outpt);
00054 exit(-1);
00055 }
00056
00057
00058 printf("Converting %s from AMF to MOD, %s as output\n\n",inpt,outpt);
00059 printf("Translating header: [ ]");
00060
00061 workbuf = (unsigned char *)malloc(64*37);
00062
00063 memset(workbuf,0,64*37);
00064 fwrite(workbuf,1,20,outf);
00065
00066
00067 fseek(inf,32,0);
00068
00069
00070 fread(workbuf,1,6,inf);
00071 numorders=workbuf[4];
00072 numpats=workbuf[3];
00073
00074
00075 memset(orders,0,256);
00076 fread(orders,1,numorders,inf);
00077 fseek(inf,294,0);
00078
00079 printf("\b\bX]\n");
00080 printf("Translating instruments [ ]");
00081
00082
00083 fread(workbuf,37,64,inf);
00084
00085 workptr=0;
00086
00087 for (i=0;i<31;i++) {
00088
00089 printf("\b\b|]");
00090
00091 strcpy(insstruc,(char*) &(workbuf[workptr]));
00092
00093 insstruc[24]=workbuf[workptr+22];
00094
00095 insstruc[25]=workbuf[workptr+23];
00096 length=((workbuf[workptr+25]) |
00097 ((workbuf[workptr+26])<<8) |
00098 ((workbuf[workptr+27])<<16)|
00099 ((workbuf[workptr+28])<<24))/2;
00100
00101 insstruc[22]=((length>>8)&0xff);
00102 insstruc[23]=(length&0xff);
00103 printf("\b\b/]");
00104
00105 repstart=((workbuf[workptr+29]&0xff) |
00106 ((workbuf[workptr+30]&0xff)<<8) |
00107 ((workbuf[workptr+31]&0xff)<<16)|
00108 ((workbuf[workptr+32]&0xff)<<24))/2;
00109
00110 insstruc[26]=((repstart>>8)&0xff);
00111 insstruc[27]=(repstart&0xff);
00112 printf("\b\b-]");
00113
00114 replen=((workbuf[workptr+33]&0xff) |
00115 ((workbuf[workptr+34]&0xff)<<8) |
00116 ((workbuf[workptr+35]&0xff)<<16)|
00117 ((workbuf[workptr+36]&0xff)<<24))/2;
00118
00119 insstruc[28]=((replen>>8)&0xff);
00120 insstruc[29]=(replen&0xff);
00121 printf("\b\b\\]");
00122
00123 workptr+=37;
00124
00125 fwrite(insstruc,1,30,outf);
00126 }
00127 printf("\b\bX]\n");
00128
00129 printf("Translating orders [ ]");
00130
00131 insstruc[0]=numorders;
00132 insstruc[1]=127;
00133 fwrite(insstruc,1,2,outf);
00134
00135 fwrite(orders,1,128,outf);
00136
00137 insstruc[0]='8';
00138 insstruc[1]='C';
00139 insstruc[2]='H';
00140 insstruc[3]='N';
00141 fwrite(insstruc,1,4,outf);
00142
00143 printf("\b\bX]\n");
00144 printf("Translating patterns 00%%");
00145
00146
00147 for(i=0;i<numpats;i++) {
00148
00149 fread(workbuf,64,32,inf);
00150
00151 for(j=0;j<512;j++) {
00152
00153 if (workbuf[j*4] != 0) {
00154
00155 period=periodtable[workbuf[j*4]];
00156 } else
00157 period=0;
00158 ins=workbuf[j*4+1];
00159
00160 effect=(workbuf[j*4+2] * 256)|workbuf[j*4+3];
00161
00162 insstruc[0]=(ins&0xf0)|((period&0xf00)>>8);
00163 insstruc[1]=(period&0xff);
00164 insstruc[2]=((ins&0xf)<<4)|((effect&0xf00)>>8);
00165 insstruc[3]=(effect&0xff);
00166
00167 fwrite(insstruc,1,4,outf);
00168 }
00169
00170 percentile=((100*(i*2048))/(2048*numpats));
00171 printf("\b\b\b%2ld%%",percentile);
00172 }
00173 printf("\b\b\b[X]\n");
00174
00175 printf("Copying sample data 00%%");
00176 i=2662+(2048*numpats);
00177
00178 fseek(inf,0,2);
00179 k=ftell(inf);
00180 fseek(inf,i,0);
00181
00182 free(workbuf);
00183 workbuf=(unsigned char *)malloc(31*1024);
00184 while((k-i)>=31*1024) {
00185 fread(workbuf,31*1024,1,inf);
00186 fwrite(workbuf,31*1024,1,outf);
00187 i+=31*1024;
00188
00189 percentile=((100*i)/k);
00190 printf("\b\b\b%2ld%%",percentile);
00191 }
00192
00193 if ((k-i) != 0) {
00194 fread(workbuf,k-i,1,inf);
00195 fwrite(workbuf,k-i,1,outf);
00196 }
00197
00198 free(workbuf);
00199 printf("\b\b\b[X]\n");
00200
00201 fclose(inf);
00202 fclose(outf);
00203 printf("\nConversion successful.\n");
00204 return 0;
00205 }
00206