home *** CD-ROM | disk | FTP | other *** search
/ PC Loisirs 18 / cd.iso / sharewar / mikm202 / source / loaders / farload.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-18  |  4.9 KB  |  284 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include "mloader.h"
  6. #include "munitrk.h"
  7.  
  8.  
  9. typedef struct FARSAMPLE{
  10.     char  samplename[32];
  11.     ULONG length;
  12.     UBYTE finetune;
  13.     UBYTE volume;
  14.     ULONG reppos;
  15.     ULONG repend;
  16.     UBYTE type;
  17.     UBYTE loop;
  18. } FARSAMPLE;
  19.  
  20.  
  21.  
  22. typedef struct FARHEADER1{
  23.     UBYTE id[4];                            // file magic
  24.     char  songname[40];                     // songname
  25.     char  blah[3];                          // 13,10,26
  26.     UWORD headerlen;                        // remaining length of header in bytes
  27.     UBYTE version;
  28.     UBYTE onoff[16];
  29.     UBYTE edit1[9];
  30.     UBYTE speed;
  31.     UBYTE panning[16];
  32.     UBYTE edit2[4];
  33.     UWORD stlen;
  34. } FARHEADER1;
  35.  
  36.  
  37. typedef struct FARHEADER2{
  38.     UBYTE orders[256];
  39.     UBYTE numpat;
  40.     UBYTE snglen;
  41.     UBYTE loopto;
  42.     UWORD patsiz[256];
  43. } FARHEADER2;
  44.  
  45.  
  46.  
  47. typedef struct FARNOTE{
  48.     UBYTE note,ins,vol,eff;
  49. } FARNOTE;
  50.  
  51.  
  52.  
  53. char FAR_Version[]="Farandole";
  54. static FARHEADER1 *mh1;
  55. static FARHEADER2 *mh2;
  56. static FARNOTE *pat;
  57.  
  58.  
  59. BOOL FAR_Test(void)
  60. {
  61.     char id[4];
  62.  
  63.     rewind(modfp);
  64.     if(!fread(&id,4,1,modfp)) return 0;
  65.  
  66.     return(!strncmp(id,"FARâ– ",4));
  67. }
  68.  
  69.  
  70. BOOL FAR_Init(void)
  71. {
  72.     mh1=NULL;
  73.     mh2=NULL;
  74.     pat=NULL;
  75.  
  76.     if(!(mh1=(FARHEADER1 *)MyMalloc(sizeof(FARHEADER1)))) return 0;
  77.     if(!(mh2=(FARHEADER2 *)MyMalloc(sizeof(FARHEADER2)))) return 0;
  78.     if(!(pat=(FARNOTE *)MyMalloc(16*256*sizeof(FARNOTE)))) return 0;
  79.  
  80.     return 1;
  81. }
  82.  
  83.  
  84. void FAR_Cleanup(void)
  85. {
  86.     if(mh1!=NULL) free(mh1);
  87.     if(mh2!=NULL) free(mh2);
  88.     if(pat!=NULL) free(pat);
  89. }
  90.  
  91.  
  92. UBYTE *FAR_ConvertTrack(FARNOTE *n,int rows)
  93. {
  94.     int t;
  95.  
  96.     UniReset();
  97.  
  98.     for(t=0;t<rows;t++){
  99.  
  100.         if(n->note){
  101.             UniInstrument(n->ins);
  102.             UniNote(n->note+23+12);
  103.         }
  104.  
  105.         if(n->vol&0xf){
  106.             UniPTEffect(0xc,(n->vol&0xf)<<2);
  107.         }
  108.  
  109.         switch(n->eff>>4){
  110.  
  111.             case 0xf:
  112.                 UniPTEffect(0xf,n->eff&0xf);
  113.                 break;
  114.  
  115.             // others not yet implemented
  116.         }
  117.  
  118.         UniNewline();
  119.         n+=16;
  120.  
  121.     }
  122.  
  123.     return UniDup();
  124. }
  125.  
  126.  
  127.  
  128. BOOL FAR_Load(void)
  129. {
  130.     int t,u,tracks=0;
  131.     INSTRUMENT *d;
  132.     SAMPLE *q;
  133.     FARSAMPLE s;
  134.     UBYTE smap[8];
  135.  
  136.     rewind(modfp);
  137.  
  138.     // try to read module header (first part)
  139.  
  140.     if(!fread(mh1,sizeof(FARHEADER1),1,modfp)){
  141.         myerr=ERROR_LOADING_HEADER;
  142.         return 0;
  143.     }
  144.  
  145. //      printf("Farandole version %d.%d\n",mh1->version>>4,mh1->version&0xf);
  146.  
  147.     // init modfile data
  148.  
  149.     of.modtype=strdup(FAR_Version);
  150.     of.songname=DupStr(mh1->songname,40);
  151.     of.numchn=16;
  152.     of.initspeed=mh1->speed;
  153.     of.inittempo=88;
  154.  
  155.     for(t=0;t<16;t++) of.panning[t]=mh1->panning[t]<<4;
  156.  
  157.     // read songtext into comment field
  158.  
  159.     if(!ReadComment(mh1->stlen)) return 0;
  160.  
  161.     // try to read module header (second part)
  162.  
  163.     if(!fread(mh2,sizeof(FARHEADER2),1,modfp)){
  164.         myerr=ERROR_LOADING_HEADER;
  165.         return 0;
  166.     }
  167.  
  168. //      of.numpat=mh2->numpat;
  169.     of.numpos=mh2->snglen;
  170.     memcpy(of.positions,mh2->orders,256);
  171.  
  172.     // count number of patterns stored in file
  173.  
  174.     of.numpat=0;
  175.     for(t=0;t<256;t++){
  176.         if(mh2->patsiz[t]) if((t+1)>of.numpat) of.numpat=t+1;
  177.     }
  178.  
  179.     of.numtrk=of.numpat*of.numchn;
  180.  
  181.     // seek across eventual new data
  182.  
  183.     fseek(modfp,mh1->headerlen-(869+mh1->stlen),SEEK_CUR);
  184.  
  185. //      printf("%s\n%d patterns\n%d pos\n",of.songname,of.numpat,of.songlength);
  186.  
  187.     // alloc track and pattern structures
  188.  
  189.     if(!AllocTracks()) return 0;
  190.     if(!AllocPatterns()) return 0;
  191.  
  192.     for(t=0;t<of.numpat;t++){
  193.         UBYTE rows=0,tempo;
  194.  
  195.         memset(pat,0,16*256*sizeof(FARNOTE));
  196.  
  197.         if(mh2->patsiz[t]){
  198.  
  199.             fread(&rows,1,1,modfp);
  200.             fread(&tempo,1,1,modfp);
  201.  
  202.             if(!fread(pat,mh2->patsiz[t]-2,1,modfp)){
  203.                 myerr=ERROR_LOADING_PATTERN;
  204.                 return 0;
  205.             };
  206.         }
  207.  
  208.         of.pattrows[t]=rows+2;
  209.  
  210.         for(u=0;u<16;u++){
  211.             if(!(of.tracks[tracks++]=FAR_ConvertTrack(&pat[u],rows+2))) return 0;
  212.         }
  213.     }
  214.  
  215.  
  216.     // read sample map
  217.  
  218.     if(!fread(smap,8,1,modfp)){
  219.         myerr=ERROR_LOADING_HEADER;
  220.         return 0;
  221.     }
  222.  
  223.     // count number of samples used
  224.  
  225.     of.numins=0;
  226.     for(t=0;t<64;t++){
  227.         if(smap[t>>3] & (1 << (t&7))) of.numins++;
  228.     }
  229.  
  230.     // alloc sample structs
  231.  
  232.     if(!AllocInstruments()) return 0;
  233.  
  234.  
  235.     d=of.instruments;
  236.     for(t=0;t<64;t++){
  237.  
  238.         if(smap[t>>3] & (1 << (t&7))){
  239.  
  240.             d->numsmp=1;
  241.             if(!AllocSamples(d)) return 0;
  242.             q=d->samples;
  243.  
  244.             // and load sample info
  245.  
  246.             if(fread(&s,sizeof(FARSAMPLE),1,modfp)!=1){
  247.                 myerr=ERROR_LOADING_SAMPLEINFO;
  248.                 return 0;
  249.             }
  250.  
  251.             d->insname=DupStr(s.samplename,32);
  252.             q->length=s.length;
  253.             q->loopstart=s.reppos;
  254.             q->loopend=s.repend;
  255.             q->volume=64;
  256.             q->c2spd=8363;
  257.  
  258.             q->flags=SF_SIGNED;
  259.             if(s.type&1) q->flags|=SF_16BITS;
  260.             if(s.loop) q->flags|=SF_LOOP;
  261.  
  262.             q->seekpos=ftell(modfp);
  263.  
  264. //                      printf("Sample %d : name %s %ld %ld %ld %ld\n",t,d->samplename,d->length,d->loopstart,d->loopend,d->seekpos);
  265.  
  266.             fseek(modfp,q->length,SEEK_CUR);
  267.         }
  268.         d++;
  269.     }
  270.     return 1;
  271. }
  272.  
  273.  
  274.  
  275. LOADER farload={
  276.     NULL,
  277.     "FAR",
  278.     "FAR loader v0.1",
  279.     FAR_Init,
  280.     FAR_Test,
  281.     FAR_Load,
  282.     FAR_Cleanup
  283. };
  284.