home *** CD-ROM | disk | FTP | other *** search
- /* MED - music editor by Teijo Kinnunen 1989, 1990*/
- /* med-tied.c: some file handling stuff */
- #include "med.h"
- extern void __asm Korosta(register __a0 struct Gadget *,register __d0 BOOL);
- extern void __asm PaivitaNaytto(register __d0 BOOL);
- extern void __asm SetTempo(register __d0 UWORD);
- extern struct Kappale far tamakappale;
- typedef LONG Fixed;
- typedef LONG IFFP;
- typedef IFFP ClientProc();
- typedef struct _ClientFrame {
- ClientProc *getList,*getProp,*getForm,*getCat; } ClientFrame;
- typedef struct { ULONG oneShotHiSamples, repeatHiSamples, samplesPerHiCycle;
- UWORD samplesPerSec; UBYTE ctOctave, sCompression; Fixed volume; }
- Voice8Header;
- typedef struct {
- ClientFrame clientFrame;
- UBYTE foundVHDR;
- UBYTE pad1;
- Voice8Header sampHdr;
- } SVXFrame;
- extern SVXFrame smusFrame;
- extern BYTE *buf;
- extern int szBuf;
- extern void Ilmoita(),AsetaTempo(),PaivitaSoittimennimi(),NollaaVarit();
- extern void SeekSong();
- extern UWORD soittimennum,lohkoja;
- extern UWORD volatile tempo;
- extern ULONG soittimenpituus[];
- extern struct Screen *screen;
- extern struct Window *window;
- extern struct ViewPort *vp;
- extern struct Lohko far *lohko[];
- extern struct SoundTrackerKappale far ladattu;
- extern struct Gadget far gadget3[],far gadget7[];
- extern struct Soitin *soitin[];
- static UBYTE *soitinlista = NULL;
- static ULONG slistanpituus = NULL;
- extern BOOL Continue(),AskName();
- BOOL LoadInstrument(),LataaKappale(),LataaIFFSoitin(),diskerr();
- void LataaSoitinLista(),VapautaSoitinLista(),EtsiHakemisto();
- static BOOL kappaleenlatausmenossa = FALSE,LataaLohkot();
- static BPTR fh = NULL;
- void ConvertTo200();
- UWORD uusitoisto,uusitoistonpit;
-
- BOOL NewInstrument(ULONG size, UWORD num)
- {
- if(soitin[num]) {
- FreeMem((void *)soitin[num],soitin[num]->length +
- sizeof(struct Soitin));
- soitin[num] = NULL;
- }
- soitin[num] = AllocMem(size + sizeof(struct Soitin),
- MEMF_PUBLIC|MEMF_CHIP|MEMF_CLEAR);
- if(!soitin[num]) return(TRUE);
- soitin[num]->length = size;
- return(FALSE);
- }
-
- BOOL LoadInstrument(char *name,BOOL src)
- {
- ULONG length;
- char latausnimi[100],tunnus[5];
- if(*name == '\0') return(AskName());
- if(src) EtsiHakemisto(tamakappale.soitin[soittimennum],latausnimi);
- else {
- strcpy(latausnimi,name);
- strcpy(tamakappale.soitin[soittimennum],name);
- }
- if(!kappaleenlatausmenossa) {
- tamakappale.stoisto[soittimennum] = uusitoisto;
- tamakappale.stoistonpit[soittimennum] = uusitoistonpit;
- }
- if(!(fh = Open2(latausnimi,MODE_OLDFILE))) return(diskerr(0,0));
- if(Read(fh,tunnus,4) != 4) return(diskerr(fh,"Sample too short."));
- tunnus[4] = '\0';
- if(!strcmp(tunnus,"FORM")) {
- BOOL res = LataaIFFSoitin(fh);
- if(!src) PaivitaSoittimennimi();
- return(res);
- }
- Ilmoita("Loading sample...");
- Seek(fh,0,OFFSET_END);
- length = Seek(fh,0,OFFSET_BEGINNING);
- if(NewInstrument(length,soittimennum)) return(diskerr(0,"No memory."));
- if(Read(fh,(char *)(soitin[soittimennum]) + sizeof(struct Soitin),
- length) != length) {
- FreeMem((void *)soitin[soittimennum],
- soitin[soittimennum]->length + sizeof(struct Soitin));
- soitin[soittimennum] = NULL;
- return(diskerr(0,0));
- }
- Close(fh); fh = NULL;
- if(!src) PaivitaSoittimennimi();
- return(FALSE);
- }
-
- BOOL LoadSong(char *nimi)
- {
- UWORD scnt;
- char tunnus[5];
- if(*nimi == '\0') return(AskName());
- if(!(fh = Open2(nimi,MODE_OLDFILE))) return(diskerr(0,0));
- if(Read(fh,tunnus,4) != 4) return(diskerr(fh,"This is not a song!"));
- tunnus[4] = '\0';
- Seek(fh,0,OFFSET_BEGINNING);
- if(AlustaKappale(TRUE)) return(diskerr(fh,"Out of memory..."));
- NollaaVarit();
- lohkoja = 0;
- if(!strcmp(tunnus,"MED\x02")) {
- Ilmoita("Loading MED1.12-song...");
- if(Read(fh,(char *)&tamakappale,sizeof(struct Kappale111)) <
- sizeof(struct Kappale111)) return(diskerr(fh,0));
- if(LataaLohkot(FALSE)) return(diskerr(fh,0));
- LoadRGB4(vp,tamakappale.rgb,4);
- } else if(!strcmp(tunnus,"MED\x03")) {
- if(Load200Song(fh)) return(diskerr(fh,0));
- LoadRGB4(vp,tamakappale.rgb,8);
- } else {
- if(!strcmp(tunnus,"SONG")) Ilmoita("Loading SoundFX-song...");
- else Ilmoita("Loading SoundTracker-song...");
- if(Read(fh,(char *)&ladattu,sizeof(struct SoundTrackerKappale)) <
- sizeof(struct SoundTrackerKappale)) return(diskerr(fh,"This is not a song!"));
- if(LataaLohkot(TRUE)) return(diskerr(fh,0));
- tamakappale.lohkoja = lohkoja;
- tamakappale.tempo = 6;
- tamakappale.kappaleen_pituus = ladattu.st_kappaleen_pit;
- tamakappale.vaihtoja = 5;
- memcpy((char *)(tamakappale.soittojarjestys),
- (char *)(ladattu.st_lohkojarj),100);
- for(scnt = 0; scnt < 15; scnt++) {
- tamakappale.soitin[scnt+1][0] = '\0';
- tamakappale.soittimenvoimakkuus[scnt+1] = ladattu.st_ins[scnt].sti_vol;
- tamakappale.stoisto[scnt+1] = ladattu.st_ins[scnt].sti_repeat;
- tamakappale.stoistonpit[scnt+1] = ladattu.st_ins[scnt].sti_replen * 2;
- strcpy(tamakappale.soitin[scnt+1],ladattu.st_ins[scnt].sti_nimi);
- }
- }
- AsetaSuodatin();
- Korosta(&gadget3[7],(BOOL)(tamakappale.vaihtoja == 6 ? FALSE : TRUE));
- Korosta(&gadget3[8],(BOOL)(tamakappale.vaihtoja == 6 ? TRUE : FALSE));
- UpdateJumpGadgets();
- PaivitaNaytto(TRUE);
- soittimennum = 1;
- SetTempo(tamakappale.tempo);
- PaivitaSoittimennimi();
- kappaleenlatausmenossa = TRUE; /*vasta nyt voi virherequesterissa jatkaa*/
- if(tamakappale.liput & LIPPU_SOITTIMETMUKANA) LoadAttachedInstrs(fh);
- Close(fh); fh = NULL;
- if(!(tamakappale.liput & LIPPU_SOITTIMETMUKANA)) {
- for(scnt = 0; scnt < 31; scnt++) {
- if(tamakappale.soitin[scnt+1][0] && !tamakappale.midikanava[scnt+1])
- if(LoadInstrument(tamakappale.
- soitin[scnt+1],TRUE) && !Continue()) break;
- SeurSoitin();
- }
- }
- soittimennum = 1;
- PaivitaSoittimennimi();
- TulostaLohkoJaSoitin();
- Ilmoita("Song is now loaded.");
- kappaleenlatausmenossa = FALSE;
- return(FALSE);
- }
-
- BOOL LataaLohkot(st)
- BOOL st; /* SoundTracker ?? */
- {
- long jaljella = Seek(fh,0,OFFSET_END),lpt1 = 1024,lpt2 = 1028;
- BOOL error = FALSE;
- ULONG *convblk = AllocMem(1024 + 4,MEMF_PUBLIC|MEMF_CLEAR);
- if(!convblk) return(TRUE); /* no memory */
- jaljella = Seek(fh,jaljella,OFFSET_BEGINNING) - jaljella;
- for(;;) {
- if(lohkoja >= 100) return(TRUE); /* Apua...ei enΣΣ!!!! */
- memset((void *)convblk,0,1028);
- if(st) {
- *convblk = 0L;
- if(lpt1 > jaljella) lpt1 = jaljella;
- if(Read(fh,(char *)(convblk + 1),lpt1)
- < lpt1) { error = TRUE; break; }
- if((jaljella -= 1024) <= 0) break; /* 0 jΣljellΣ */
- } else {
- if(lpt2 > jaljella) lpt2 = jaljella;
- if(Read(fh,(char *)convblk,lpt2) < lpt2)
- { error = TRUE; break; }
- if((jaljella -= 1028) <= 0) break;
- }
- ConvertTo200((UBYTE *)convblk,(UBYTE *)lohko[lohkoja]);
- if(AllocBlock(++lohkoja,4)) {
- error = TRUE; /* Out of memory!!*/
- break;
- }
- }
- ConvertTo200((UBYTE *)convblk,(UBYTE *)lohko[lohkoja]);
- lohkoja++;
- FreeMem((void *)convblk,1028);
- return(error);
- }
-
- BOOL diskerr(BPTR fh,char *txt)
- {
- char virheteksti[45],*virheptr;
- DisplayBeep(screen);
- strcpy(virheteksti,"Error: ");
- switch(IoErr()) {
- case 103: virheptr = "Insufficient free store."; break;
- case 202: virheptr = "Object in use."; break;
- case 203: virheptr = "Object already exists."; break;
- case 204: virheptr = "Directory not found."; break;
- case 205: virheptr = "Object not found."; break;
- case 210: virheptr = "Invalid name."; break;
- case 212: virheptr = "Not of required type."; break;
- case 213: virheptr = "Disk not validated."; break;
- case 214: virheptr = "Disk write-protected."; break;
- case 218: virheptr = "Device not mounted."; break;
- case 221: virheptr = "Disk full."; break;
- case 222: virheptr = "File is delete-protected."; break;
- case 223: virheptr = "File is write-protected."; break;
- case 224: virheptr = "File is read-protected."; break;
- case 225: virheptr = "Not a DOS disk."; break;
- case 226: virheptr = "No disk in drive."; break;
- default: if(txt) virheptr = txt;
- else virheptr = "Something is wrong.";
- } /* A very informative error msg -^^ */
- if(fh) Close(fh);
- strcpy(virheteksti+7,virheptr);
- Ilmoita(virheteksti);
- return(TRUE);
- }
-
- BOOL LataaIFFSoitin()
- {
- Seek(fh,0,OFFSET_BEGINNING);
- Ilmoita("Loading IFF-instrument...");
- if(soitin[soittimennum]) {
- FreeMem((void *)soitin[soittimennum],
- soitin[soittimennum]->length + sizeof(struct Soitin));
- soitin[soittimennum] = NULL;
- }
- buf = NULL; szBuf = NULL;
- (void)ReadSample(fh);
- Close(fh); fh = NULL;
- if(!buf) return(diskerr(0,"Failed to load!!!"));
- soitin[soittimennum] = (struct Soitin *)buf;
- soitin[soittimennum]->length = szBuf;
- switch(smusFrame.sampHdr.ctOctave) {
- case 5: soitin[soittimennum]->type = IFF5OCT; break;
- case 3: soitin[soittimennum]->type = IFF3OCT; break;
- default: soitin[soittimennum]->type = 0;
- }
- if(kappaleenlatausmenossa); /* <- tiedot ovat jo kappaleessa */
- else if(smusFrame.sampHdr.repeatHiSamples) {
- tamakappale.stoisto[soittimennum] = smusFrame.sampHdr.oneShotHiSamples;
- tamakappale.stoistonpit[soittimennum] = smusFrame.sampHdr.repeatHiSamples;
- tamakappale.soittimenvoimakkuus[soittimennum] = 64; /* TΣysillΣ vaan */
- } else {
- tamakappale.stoisto[soittimennum] = 0;
- tamakappale.stoistonpit[soittimennum] = 0;
- tamakappale.soittimenvoimakkuus[soittimennum] = 64;
- }
- return(FALSE);
- }
-
- void LataaSoitinLista()
- {
- UBYTE *scanptr;
- fh = Open("MED_paths",MODE_OLDFILE);
- if(!fh) fh = Open("S:MED_paths",MODE_OLDFILE);
- if(!fh) {
- Ilmoita("MED_paths not found.");
- return; /* ei l÷ytynyt */
- }
- Seek(fh,0,OFFSET_END);
- slistanpituus = Seek(fh,0,OFFSET_BEGINNING);
- if(!(soitinlista = AllocMem(slistanpituus,MEMF_PUBLIC))) {
- Close(fh);
- fh = NULL;
- return;
- }
- Read(fh,soitinlista,slistanpituus);
- Close(fh);
- fh = NULL;
- for(scanptr=soitinlista;scanptr<soitinlista+slistanpituus;scanptr++) {
- if(*scanptr == '\n') *scanptr = '\0';
- if(*scanptr == ':' && *(scanptr+1) == ':') *scanptr = '\0';
- if(*scanptr >= 'a' && *scanptr <= 'z')
- *scanptr = *scanptr - 'a' + 'A'; /* isoiksi */
- /* rivinvaihdot 0:ksi */
- }
- }
-
- void VapautaSoitinLista()
- {
- if(soitinlista) FreeMem((void *)soitinlista,slistanpituus);
- }
-
- void EtsiHakemisto(nimi,mihin)
- UBYTE *nimi,*mihin;
- {
- UBYTE *scanptr = soitinlista,*hakemisto = NULL,isonimi[40],*isoksi = &isonimi[0];
- UBYTE mikanumero = 0;
- BOOL loytyi = FALSE;
- uusitoisto = uusitoistonpit = 0;
- if(!scanptr) { /* soitinlistaa ei ole ladattu */
- strcpy(mihin,nimi);
- return;
- }
- if(*nimi == '*' || *nimi == ':') {
- *mihin = '\0'; /* ei hyvΣksytΣ! */
- return;
- }
- strcpy(isonimi,nimi);
- while(*isoksi) {
- if(*isoksi >= 'a' && *isoksi <= 'z')
- *isoksi = *isoksi - 'a' + 'A'; /*muutetaan isoksi*/
- isoksi++;
- }
- while(scanptr < soitinlista + slistanpituus) {
- if(*scanptr == '*') hakemisto = scanptr;
- else if(*scanptr == isonimi[0]) { /* tutkitaan 1.merkki */
- if(!strcmp(scanptr,isonimi)) {
- loytyi = TRUE; /* l÷ytyi !! */
- break;
- }
- }
- while(*scanptr++ != '\0'); /* etsitΣΣn seuraava */
- }
- if(!loytyi) {
- strcpy(mihin,nimi); /* ei l÷ytynyt, kokeillaan sellaisenaan */
- return;
- }
- /* l÷ytyi!! */
- if(hakemisto) strcpy(mihin,hakemisto+1);
- /* kopioidaan hakemiston nimi (alussa '*') */
- strcat(mihin,nimi); /* ja lisΣtΣΣn nimi */
- if(*(scanptr + strlen(scanptr) + 1) == ':') { /* toisto! */
- scanptr += strlen(scanptr) + 1;
- while(*scanptr) {
- if(*scanptr == '/') mikanumero = 1; /* pituus.. */
- if(*scanptr >= '0' && *scanptr <= '9')
- switch(mikanumero) {
- case 0:
- uusitoisto *= 10;
- uusitoisto += ((*scanptr) - '0');
- break;
- case 1:
- uusitoistonpit *= 10;
- uusitoistonpit += ((*scanptr)-'0');
- }
- scanptr++;
- }
- }
- }
-
- void ConvertTo200(from,to)
- UBYTE *from,*to;
- {
- extern UWORD periodit[];
- register UWORD testper,count;
- register UBYTE newnotenum = 0,instrG_V = 0;
- from += 4; /* skip 4 bytes */
- to += 4;
- for(count = 0; count < (64 * 4); count++) {
- testper = *((UWORD *)from);
- from += 2;
- newnotenum = instrG_V = 0;
- if(testper & 0x9000) { testper &= ~0x9000; instrG_V = 1; }
- if(testper) while(testper < periodit[newnotenum++]);
- if(instrG_V) newnotenum |= 0x80;
- *to++ = newnotenum;
- *to++ = *from++;
- *to++ = *from++;
- }
- }
-