home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 369b.lha / MED_v2.0 / Source / medsrc / med-stmod.c < prev    next >
C/C++ Source or Header  |  1990-05-03  |  5KB  |  161 lines

  1. /* MED-stmod.c: SoundTracker 2.x module load / ST-song save functions
  2.         by Teijo Kinnunen 1989, 1990 */
  3. #include "med.h"
  4. extern struct Kappale far tamakappale;
  5. extern void __asm Korosta(register __a0 struct Gadget *,register __d0 BOOL);
  6. extern void __asm PaivitaNaytto(register __d0 BOOL);
  7. extern void __asm SetTempo(register __d0 UWORD);
  8. extern UWORD soittimennum,lohkoja;
  9. extern BOOL diskerr(),AskName();
  10. extern struct Gadget far gadget3[];
  11. extern struct Soitin *soitin[];
  12. extern struct Lohko *lohko[];
  13.  
  14. BOOL STModLoader(char *name)
  15. {
  16.     BPTR fh;
  17.     struct ST24Mod stsong = { 0 };
  18.     UBYTE scntr,*cnvblk;
  19.     long modlen,samplelen = 0,readlen;
  20.     if(*name == '\0') return(AskName());
  21.     if(!(fh = Open2(name,MODE_OLDFILE))) return(diskerr(0,0));
  22.     if(AlustaKappale(TRUE)) return(diskerr(fh,"Lacking memory..."));
  23.     NollaaVarit();
  24.     lohkoja = 0;
  25.     Ilmoita("Loading ST2.x-module...");
  26.     Seek(fh,0,OFFSET_END);
  27.     modlen = Seek(fh,0,OFFSET_BEGINNING);
  28.     if(Read(fh,(void *)&stsong,sizeof(struct ST24Mod)) <
  29.         sizeof(struct ST24Mod)) return(diskerr(fh,0));
  30.     modlen -= sizeof(struct ST24Mod); /* length of the remaining part */
  31.     for(scntr = 0; scntr < 31; scntr++) {
  32.         samplelen += stsong.sample[scntr].length * 2;
  33.     }
  34.     modlen -= samplelen;
  35.     if(modlen < 0)     return(diskerr(fh,"Not a valid module."));
  36.     cnvblk = AllocMem(1028,MEMF_PUBLIC);
  37.     if(!cnvblk) return(diskerr(fh,"No...MEMORY!!"));
  38.     Ilmoita("Loading blocks...");
  39.     while(modlen > 0) {    /* Load the song */
  40.         if(lohkoja >= 100) break; /* too many blocks */
  41.         if(AllocBlock(lohkoja,4)) {
  42.             FreeMem(cnvblk,1028);
  43.             return(diskerr(fh,"Hey, no mem for blocks."));
  44.         }
  45.         lohkoja++;
  46.         if(modlen > 1024) readlen = 1024;
  47.         else { readlen = modlen; memset((void *)cnvblk,0,1028); }
  48.         if(Read(fh,cnvblk+4,readlen) < readlen) {
  49.             FreeMem(cnvblk,1028);
  50.             return(diskerr(fh,0));
  51.         }
  52.         modlen -= readlen;
  53.         ConvertTo200(cnvblk,lohko[lohkoja-1]);
  54.     }
  55.     FreeMem(cnvblk,1028);
  56.     tamakappale.lohkoja = lohkoja;
  57.     tamakappale.tempo = 6;
  58.     tamakappale.kappaleen_pituus = stsong.songlen;
  59.     tamakappale.vaihtoja = 5;
  60.     memcpy((char *)(tamakappale.soittojarjestys),(char *)(stsong.
  61.         playseq),100);
  62.     for(scntr = 0; scntr < 31; scntr++) {
  63.         strcpy(tamakappale.soitin[scntr+1],stsong.sample[scntr].
  64.             name);
  65.         tamakappale.soittimenvoimakkuus[scntr+1] = stsong.sample[
  66.             scntr].volume;
  67.         tamakappale.stoisto[scntr+1] = stsong.sample[scntr].repeat;
  68.         tamakappale.stoistonpit[scntr+1] = stsong.sample[scntr].
  69.             replen * 2;
  70.     }
  71.     PaivitaNaytto(TRUE);
  72.     Korosta(&gadget3[7],TRUE); Korosta(&gadget3[8],FALSE);
  73.     SetTempo(6);
  74.     Ilmoita("Loading samples...");
  75.     soittimennum = 1;
  76.     PaivitaSoittimennimi();
  77.     for(scntr = 0; scntr < 31; scntr++) {
  78.         samplelen = stsong.sample[scntr].length * 2;
  79.         if(samplelen) {
  80.             if(NewInstrument(samplelen,soittimennum))
  81.                 return(diskerr(fh,"No memory!!"));;
  82.             if(Read(fh,(char *)(soitin[soittimennum]) +
  83.                 sizeof(struct Soitin),samplelen) <
  84.                   samplelen) return(diskerr(fh,0));
  85.         }
  86.         SeurSoitin();
  87.     }
  88.     Close(fh);
  89.     soittimennum = 1;
  90.     PaivitaSoittimennimi();
  91.     TulostaLohkoJaSoitin();
  92.     Ilmoita("Module is now loaded.");
  93.     return(FALSE);
  94. }
  95.  
  96. void ConvertToST(UBYTE *from,UBYTE *to)
  97. {
  98.     extern UWORD periodit[];
  99.     register UWORD cnt,per;
  100.     register UBYTE instrG_V = 0,nnum;
  101.     for(cnt = 0; cnt < (64 * 4); cnt++) {
  102.         nnum = *from++;
  103.         if(nnum & 0x80) { instrG_V = 1; nnum &= 0x7f; }
  104.         else instrG_V = 0;
  105.         if(!nnum) per = 0;
  106.         else per = periodit[nnum - 1];
  107.         if(instrG_V) per |= 0x1000;
  108.         *to++ = (UBYTE)(per >> 8);
  109.         *to++ = (UBYTE)(per & 0xff);
  110.         *to++ = *from++;
  111.         *to++ = *from++;
  112.     }
  113. }
  114.  
  115. BOOL STSongSaver(char *name)
  116. {
  117.     UBYTE oldexists,scnt,*convblk;
  118.     struct SoundTrackerKappale stsong = { 0 };
  119.     BPTR fh;
  120.     if(*name == '\0') return(AskName());
  121.     if(IsHere(name)) {
  122.         oldexists = 1;
  123.         Ilmoita("File already exists. Continue?");
  124.         if(!Continue()) return(TRUE);
  125.     }
  126.     fh = Open2(name,MODE_NEWFILE);
  127.     if(!fh) return(diskerr(0,"Can't create the file."));
  128.     Ilmoita("Saving ST-song.");
  129.     strcpy(stsong.st_nimi,name);
  130.     for(scnt = 0; scnt < 15; scnt++) {
  131.         strcpy(stsong.st_ins[scnt].sti_nimi,tamakappale.soitin[scnt+1]);
  132.         stsong.st_ins[scnt].sti_vol = tamakappale.
  133.             soittimenvoimakkuus[scnt+1];
  134.         stsong.st_ins[scnt].sti_pit = soitin[scnt+1]->length / 2;
  135.         stsong.st_ins[scnt].sti_repeat = tamakappale.stoisto[scnt+1];
  136.         if(tamakappale.stoistonpit[scnt+1] <= 2)
  137.             stsong.st_ins[scnt].sti_replen = 1;
  138.         else stsong.st_ins[scnt].sti_replen = tamakappale.stoistonpit[scnt+1] / 2;
  139.     }
  140.     stsong.st_kappaleen_pit = tamakappale.kappaleen_pituus;
  141.     memcpy(stsong.st_lohkojarj,tamakappale.soittojarjestys,100);
  142.     stsong.st_kummajainen = 0x78; /* ???????? */
  143.     if(Write(fh,(char *)&stsong,sizeof(struct SoundTrackerKappale)) !=
  144.         sizeof(struct SoundTrackerKappale)) return(diskerr(fh,0));
  145.     convblk = AllocMem(1024,MEMF_PUBLIC);
  146.     if(!convblk) return(diskerr(fh,"No memory."));
  147.     Ilmoita("Saving blocks...");
  148.     for(scnt = 0; scnt < lohkoja; scnt++) {
  149.         ConvertToST(lohko[scnt]->music,convblk);
  150.         if(Write(fh,convblk,1024) != 1024) {
  151.             FreeMem(convblk,1024);
  152.             return(diskerr(fh,0));
  153.         }
  154.     }
  155.     FreeMem(convblk,1024);
  156.     Close(fh);
  157.     if(!oldexists) InsertSavedFile(name);
  158.     Ilmoita("ST-song is now saved.");
  159.     return(FALSE);
  160. }
  161.