/* xm2moddi 30.8.2004 Marq */ #include #include #include #define U8() fgetc(f) #define U16() (fgetc(f)+(fgetc(f)<<8)) #define U32() (fgetc(f)+(fgetc(f)<<8)+(fgetc(f)<<16)+(fgetc(f)<<24)) #define M8(x) fputc(x,f) #define M16(x) fputc(x>>8,f);fputc(x&0xff,f) #define M32(x) fputc((x>>24)&255,f);fputc((x>>16)&255,f);fputc((x>>8)&255,f);\ fputc(x&255,f) #define charset(x) ((x>='!') && (x<='z')) typedef struct ptn_t { unsigned short rows,packed; unsigned char *pdata; unsigned char *data; } PTN; typedef struct sample_t { unsigned len,vol,loop,looplen; char *name; int finetune; signed char *data; } SMP; void convptn(PTN *ptn,int chn) { unsigned char *s,*d; int n,i,j; ptn->data=malloc(chn*5*ptn->rows); s=ptn->pdata; d=ptn->data; memset(d,0,chn*5*ptn->rows); if(!ptn->packed) return; for(n=0;nrows;n++) { for(j=0;j31) printf("Warning! Too many instruments.\n"); if(U16()&1) amiga=0; else amiga=1; printf("Amiga periods:%s\n",(amiga)?"yes":"no. You have been warned."); tempo=U16(); printf("Tempo:%d\n",tempo); bpm=U16(); printf("BPM:%d\n",bpm); for(n=0;n<256;n++) order[n]=U8(); for(n=0;n1) { printf(" Error: more than 1 sample per instrument\n"); return(-1); } puts(""); if(samples) { shsize=U32(); for(j=0;j<96;j++) U8(); // Sample numbers for notes for(j=0;j<48*2;j++) U8(); // Panning points for(j=0;j<27+7;j++) // Rest of the bs U8(); } U32(); // W00t? for(i=0;i=65535*2) printf("Warning! Sample too large, "); loops=U32(); loopl=U32(); volo=U8(); finetuna=U8(); smp[n].len=slen>>1; smp[n].loop=loops>>1; smp[n].looplen=loopl>>1; smp[n].vol=volo; smp[n].finetune=(finetuna>>4)&0xf; smp[n].data=malloc(slen); type=U8(); printf("%d-bit, ",(type&0x10)?16:8); U8(); // Panning U8(); // Relative note U8(); sname[22]=0; for(j=0;j<22;j++) { tmp=U8(); sname[j]=(charset(tmp))?tmp:' '; } printf("Name:%s",sname); puts(""); s8=s16=0; for(j=0;j>8; } else { s8=U8(); s16+=s8; smp[n].data[j]=s16; } } } } fclose(f); f=fopen(argv[2],"wb"); if(f==NULL) { printf("File error creating: %s\n",argv[2]); return(-1); } printf("Writing %s...\n",argv[2]); for(n=0;n<20;n++) M8(name[n]); for(n=0;n<31;n++) // Instrument infos { for(i=0;i<22;i++) if(i>=strlen(smp[n].name)) M8(0); else M8(smp[n].name[i]); M16(smp[n].len); M8(smp[n].finetune); M8(smp[n].vol); M16(smp[n].loop); M16(smp[n].looplen); } M8(songlen); M8(127); for(n=0;n<128;n++) // Song order M8(order[n]); // MOD id for(n=0;chns[n]!=-1;n++) if(chns[n]==chn) { M8(id[n][0]); M8(id[n][1]); M8(id[n][2]); M8(id[n][3]); break; } /* Write patterns */ for(n=0;n=ptn[n].rows) // Add extra rows... { for(j=0;j<4*chn;j++) M8(0); } else { for(j=0;j=0 && note<=5*12) period=ptable[note]; b1=s[1]&0xf0; b1|=period>>8; b2=period&0xff; b3=s[1]<<4; b3|=s[3]&0xf; b4=s[4]; M8(b1);M8(b2);M8(b3);M8(b4); } } } } /* Write samples */ for(n=0;n<31;n++) { for(i=0;i