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-tied.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-05-03
|
12KB
|
377 lines
/* 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++;
}
}