home *** CD-ROM | disk | FTP | other *** search
/ Large Pack of OldSkool DOS MOD Trackers / far094.zip / FARLOAD.CPP < prev    next >
C/C++ Source or Header  |  1993-10-09  |  6KB  |  218 lines

  1. // THIS IS THE SAVE/LOAD MODULE FROM FARANDOLE COMPOSER! THIS IS NOT COMPLETE
  2. // BUT YOU MAY USE ANY PIECE OF CODE FROM HERE IF YOU CREDIT ME!
  3.  
  4. #include "Far.HPP"
  5. #include <IO.H>
  6.  
  7. void LoadOneFSM(word n,FILE *i) {
  8.   byte far *q;
  9.  
  10.   fread(&Sample[n].Name,32,1,i);       // Read sample name
  11.   fread(&Sample[n].Len,4,1,i);         // Read sample length
  12.   fread(&Sample[n].FineTune,1,1,i);    // Read finetune byte
  13.   fread(&Sample[n].Volume,1,1,i);      // Read default volume byte
  14.   fread(&Sample[n].Rep,4,1,i);         // Read repeat start
  15.   fread(&Sample[n].RepEnd,4,1,i);      // Read repeat end
  16.   fread(&Sample[n].SType,1,1,i);       // Read sample type byte
  17.   fread(&Sample[n].LoopMode,1,1,i);    // Read loop mode byte
  18.  
  19.   if (Sample[n].RepEnd<5) {
  20.     Sample[n].RepEnd=Sample[n].Len;
  21.     Sample[n].LoopMode=0;
  22.   }
  23.   else
  24.     Sample[n].LoopMode=(1<<3);
  25.  
  26.   if (Sample[n].SType&1) Sample[n].LoopMode|=(1<<2);
  27.  
  28.   if (Sample[n].Len>0) {
  29.     q=(char far *)malloc(Sample[n].Len);
  30.     if (q) {
  31.       fread(q,Sample[n].Len,1,i);          // Read sample data
  32.     }
  33.     Sample[n].Seg=HighPtr>>16;
  34.     Sample[n].Off=HighPtr&0xFFFF;
  35.     HighPtr=Music.LoadSample(Sample[n].Seg,Sample[n].Off,
  36.                              Sample[n].Len,
  37.                              (char far *)q);
  38.     farfree(q);
  39.   }
  40.   else {
  41.     Sample[n].Seg=0;
  42.     Sample[n].Off=0;
  43.   }
  44. }
  45.  
  46. void SaveOneFSM(word n,FILE *i) {
  47.   byte  far *q;
  48.   dword kk;
  49.  
  50.   if (Sample[n].LoopMode&(1<<3))
  51.     kk=Sample[n].RepEnd;
  52.   else
  53.     kk=0;
  54.  
  55.   fwrite(&Sample[n].Name,32,1,i);       // Write sample name
  56.   fwrite(&Sample[n].Len,4,1,i);         // Write sample length
  57.   fwrite(&Sample[n].FineTune,1,1,i);    // Write finetune byte
  58.   fwrite(&Sample[n].Volume,1,1,i);      // Write default volume byte
  59.   fwrite(&Sample[n].Rep,4,1,i);         // Write repeat start
  60.   fwrite(&kk,4,1,i);                    // Write repeat end
  61.   fwrite(&Sample[n].SType,1,1,i);       // Write sample type byte
  62.   fwrite(&Sample[n].LoopMode,1,1,i);    // Write loop mode byte
  63.  
  64.   if (Sample[n].Len>0) {
  65.     q=(char far *)malloc(Sample[n].Len);
  66.     if (q)
  67.       Music.SaveSample(Sample[n].Seg,Sample[n].Off,
  68.                        Sample[n].Len,(char far *)q);
  69.  
  70.     fwrite(q,Sample[n].Len,1,i);        // Write sample data
  71.     farfree(q);
  72.   }
  73. }
  74.  
  75. void SaveSong(char *fn) {
  76.   FILE  *i;
  77.   char  Magic1[]="FAR■";
  78.   char  Magic2[]={13,10,26};
  79.   char  t[80];
  80.   Flag  SMap[256/8]={0};
  81.   word  q,HLen=869+STLen;
  82.   byte  lq;
  83.  
  84.   Saving=ON;
  85.   Saved=TRUE;
  86.   strcpy(t,SongDir);
  87.   strcat(t,"\\");
  88.   strcat(t,fn);
  89.   i=fopen(t,"wb");
  90.   if (!i) {
  91.     Saving=OFF;
  92.     return;
  93.   }
  94.  
  95.   if (Playing) StopMusic();
  96.   PutAwayPat(CurPattern);
  97.  
  98.   fwrite(&Magic1[0],4,1,i);
  99.   fwrite(&SongName[0],40,1,i);
  100.   fwrite(&Magic2[0],3,1,i);
  101.   fwrite(&HLen,2,1,i);
  102.   fputc(0x10,i);
  103.   fwrite(&ChanOn[0],16,1,i);
  104.   fwrite(&CurOct,1,1,i);
  105.   fwrite(&CurVoice,1,1,i);
  106.   fwrite(&CurRow,1,1,i);
  107.   fwrite(&CurPattern,1,1,i);
  108.   fwrite(&CurOrder,1,1,i);
  109.   fwrite(&CurSample,1,1,i);
  110.   fwrite(&CurVol,1,1,i);
  111.   fwrite(&CurTop,1,1,i);
  112.   fwrite(&CurArea,1,1,i);
  113.   fwrite(&CurTempo,1,1,i);
  114.   fwrite(&CurBalance[0],16,1,i);
  115.   fwrite(&MarkTop,1,1,i);
  116.   fwrite(&MarkBot,1,1,i);
  117.   fwrite(&Grid,1,1,i);
  118.   fwrite(&EditMode,1,1,i);
  119.   fwrite(&STLen,2,1,i);
  120.   fwrite(&SongText[0],STLen,1,i);
  121.   fwrite(&Order[0],256,1,i);
  122.   fwrite(&NumPatterns,1,1,i);
  123.   fwrite(&OrdLen,1,1,i);
  124.   fwrite(&LoopTo,1,1,i);
  125.   fwrite(&PatSize,sizeof(PatSize),1,i);
  126.  
  127.   for (q=0;q<256;q++) if (PatStore[q]) fwrite(PatStore[q],PatSize[q],1,i);
  128.  
  129.   for (q=0;q<255;q++) {
  130.     if (Sample[q].Len || Sample[q].Name[0]) {
  131.       SMap[q/8]|=(1<<(q%8));
  132.     }
  133.   }
  134.  
  135.   fwrite(&SMap[0],8,1,i);
  136.  
  137.   for (q=0;q<255;q++) {
  138.     if (Sample[q].Len || Sample[q].Name[0]) {
  139.       SaveOneFSM(q,i);
  140.     }
  141.   }
  142.  
  143.   fclose(i);
  144.   Saving=OFF;
  145. }
  146.  
  147. void LoadSong(char *fn) {
  148.   FILE  *i;
  149.   char  Magic1[]="FAR■";
  150.   char  Magic2[]={13,10,26};
  151.   char  t[80];
  152.   Flag  SMap[256/8]={0};
  153.   word  q,HdrLen;
  154.   byte  lq;
  155.  
  156.   i=fopen(fn,"rb");
  157.   if (!i) return;
  158.   fread(&Magic1[0],4,1,i);
  159.   if (strcmp(Magic1,"FAR■")) {
  160.     fclose(i);
  161.     return;
  162.   }
  163.   Saving=ON;
  164.   if (Playing) StopMusic();
  165.   FreeSong();
  166.   Saved=TRUE;
  167.   strcpy(DosName,fn);
  168.  
  169.   fread(&SongName[0],40,1,i);
  170.   fread(&Magic2[0],3,1,i);
  171.   fread(&HdrLen,2,1,i);
  172.   fgetc(i);                     // (Read version number, should be 0x10)
  173.   fread(&ChanOn[0],16,1,i);
  174.   fread(&CurOct,1,1,i);
  175.   fread(&CurVoice,1,1,i);
  176.   fread(&CurRow,1,1,i);
  177.   fread(&CurPattern,1,1,i);
  178.   fread(&CurOrder,1,1,i);
  179.   fread(&CurSample,1,1,i);
  180.   fread(&CurVol,1,1,i);
  181.   fread(&CurTop,1,1,i);
  182.   fread(&CurArea,1,1,i);
  183.   fread(&CurTempo,1,1,i);
  184.   fread(&CurBalance[0],16,1,i);
  185.   fread(&MarkTop,1,1,i);
  186.   fread(&MarkBot,1,1,i);
  187.   fread(&Grid,1,1,i);
  188.   fread(&EditMode,1,1,i);
  189.   fread(&STLen,2,1,i);
  190.   fread(&SongText[0],STLen,1,i);
  191.   fread(&Order[0],256,1,i);
  192.   fread(&NumPatterns,1,1,i);
  193.   fread(&OrdLen,1,1,i);
  194.   fread(&LoopTo,1,1,i);
  195.   fread(&PatSize,sizeof(PatSize),1,i);
  196.   if (HdrLen-(869+STLen))
  197.     fseek(i,HdrLen-(869+STLen),SEEK_CUR);
  198.  
  199.   for (q=0;q<256;q++)
  200.     if (PatSize[q]) {
  201.       PatStore[q]=(char *)malloc(PatSize[q]);
  202.       fread(PatStore[q],PatSize[q],1,i);
  203.     }
  204.  
  205.   fread(&SMap[0],8,1,i);
  206.  
  207.   for (q=0;q<255;q++)
  208.     if (SMap[q/8] & (1<<(q%8)))
  209.       LoadOneFSM(q,i);
  210.  
  211.   fclose(i);
  212.   memset(&Pattern[0],0,sizeof(Pattern));
  213.   GetPat(CurPattern);
  214.   sScreen();
  215.   Saving=OFF;
  216. }
  217.  
  218.