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 >
Wrap
C/C++ Source or Header
|
1990-05-03
|
5KB
|
161 lines
/* MED-stmod.c: SoundTracker 2.x module load / ST-song save functions
by Teijo Kinnunen 1989, 1990 */
#include "med.h"
extern struct Kappale far tamakappale;
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 UWORD soittimennum,lohkoja;
extern BOOL diskerr(),AskName();
extern struct Gadget far gadget3[];
extern struct Soitin *soitin[];
extern struct Lohko *lohko[];
BOOL STModLoader(char *name)
{
BPTR fh;
struct ST24Mod stsong = { 0 };
UBYTE scntr,*cnvblk;
long modlen,samplelen = 0,readlen;
if(*name == '\0') return(AskName());
if(!(fh = Open2(name,MODE_OLDFILE))) return(diskerr(0,0));
if(AlustaKappale(TRUE)) return(diskerr(fh,"Lacking memory..."));
NollaaVarit();
lohkoja = 0;
Ilmoita("Loading ST2.x-module...");
Seek(fh,0,OFFSET_END);
modlen = Seek(fh,0,OFFSET_BEGINNING);
if(Read(fh,(void *)&stsong,sizeof(struct ST24Mod)) <
sizeof(struct ST24Mod)) return(diskerr(fh,0));
modlen -= sizeof(struct ST24Mod); /* length of the remaining part */
for(scntr = 0; scntr < 31; scntr++) {
samplelen += stsong.sample[scntr].length * 2;
}
modlen -= samplelen;
if(modlen < 0) return(diskerr(fh,"Not a valid module."));
cnvblk = AllocMem(1028,MEMF_PUBLIC);
if(!cnvblk) return(diskerr(fh,"No...MEMORY!!"));
Ilmoita("Loading blocks...");
while(modlen > 0) { /* Load the song */
if(lohkoja >= 100) break; /* too many blocks */
if(AllocBlock(lohkoja,4)) {
FreeMem(cnvblk,1028);
return(diskerr(fh,"Hey, no mem for blocks."));
}
lohkoja++;
if(modlen > 1024) readlen = 1024;
else { readlen = modlen; memset((void *)cnvblk,0,1028); }
if(Read(fh,cnvblk+4,readlen) < readlen) {
FreeMem(cnvblk,1028);
return(diskerr(fh,0));
}
modlen -= readlen;
ConvertTo200(cnvblk,lohko[lohkoja-1]);
}
FreeMem(cnvblk,1028);
tamakappale.lohkoja = lohkoja;
tamakappale.tempo = 6;
tamakappale.kappaleen_pituus = stsong.songlen;
tamakappale.vaihtoja = 5;
memcpy((char *)(tamakappale.soittojarjestys),(char *)(stsong.
playseq),100);
for(scntr = 0; scntr < 31; scntr++) {
strcpy(tamakappale.soitin[scntr+1],stsong.sample[scntr].
name);
tamakappale.soittimenvoimakkuus[scntr+1] = stsong.sample[
scntr].volume;
tamakappale.stoisto[scntr+1] = stsong.sample[scntr].repeat;
tamakappale.stoistonpit[scntr+1] = stsong.sample[scntr].
replen * 2;
}
PaivitaNaytto(TRUE);
Korosta(&gadget3[7],TRUE); Korosta(&gadget3[8],FALSE);
SetTempo(6);
Ilmoita("Loading samples...");
soittimennum = 1;
PaivitaSoittimennimi();
for(scntr = 0; scntr < 31; scntr++) {
samplelen = stsong.sample[scntr].length * 2;
if(samplelen) {
if(NewInstrument(samplelen,soittimennum))
return(diskerr(fh,"No memory!!"));;
if(Read(fh,(char *)(soitin[soittimennum]) +
sizeof(struct Soitin),samplelen) <
samplelen) return(diskerr(fh,0));
}
SeurSoitin();
}
Close(fh);
soittimennum = 1;
PaivitaSoittimennimi();
TulostaLohkoJaSoitin();
Ilmoita("Module is now loaded.");
return(FALSE);
}
void ConvertToST(UBYTE *from,UBYTE *to)
{
extern UWORD periodit[];
register UWORD cnt,per;
register UBYTE instrG_V = 0,nnum;
for(cnt = 0; cnt < (64 * 4); cnt++) {
nnum = *from++;
if(nnum & 0x80) { instrG_V = 1; nnum &= 0x7f; }
else instrG_V = 0;
if(!nnum) per = 0;
else per = periodit[nnum - 1];
if(instrG_V) per |= 0x1000;
*to++ = (UBYTE)(per >> 8);
*to++ = (UBYTE)(per & 0xff);
*to++ = *from++;
*to++ = *from++;
}
}
BOOL STSongSaver(char *name)
{
UBYTE oldexists,scnt,*convblk;
struct SoundTrackerKappale stsong = { 0 };
BPTR fh;
if(*name == '\0') return(AskName());
if(IsHere(name)) {
oldexists = 1;
Ilmoita("File already exists. Continue?");
if(!Continue()) return(TRUE);
}
fh = Open2(name,MODE_NEWFILE);
if(!fh) return(diskerr(0,"Can't create the file."));
Ilmoita("Saving ST-song.");
strcpy(stsong.st_nimi,name);
for(scnt = 0; scnt < 15; scnt++) {
strcpy(stsong.st_ins[scnt].sti_nimi,tamakappale.soitin[scnt+1]);
stsong.st_ins[scnt].sti_vol = tamakappale.
soittimenvoimakkuus[scnt+1];
stsong.st_ins[scnt].sti_pit = soitin[scnt+1]->length / 2;
stsong.st_ins[scnt].sti_repeat = tamakappale.stoisto[scnt+1];
if(tamakappale.stoistonpit[scnt+1] <= 2)
stsong.st_ins[scnt].sti_replen = 1;
else stsong.st_ins[scnt].sti_replen = tamakappale.stoistonpit[scnt+1] / 2;
}
stsong.st_kappaleen_pit = tamakappale.kappaleen_pituus;
memcpy(stsong.st_lohkojarj,tamakappale.soittojarjestys,100);
stsong.st_kummajainen = 0x78; /* ???????? */
if(Write(fh,(char *)&stsong,sizeof(struct SoundTrackerKappale)) !=
sizeof(struct SoundTrackerKappale)) return(diskerr(fh,0));
convblk = AllocMem(1024,MEMF_PUBLIC);
if(!convblk) return(diskerr(fh,"No memory."));
Ilmoita("Saving blocks...");
for(scnt = 0; scnt < lohkoja; scnt++) {
ConvertToST(lohko[scnt]->music,convblk);
if(Write(fh,convblk,1024) != 1024) {
FreeMem(convblk,1024);
return(diskerr(fh,0));
}
}
FreeMem(convblk,1024);
Close(fh);
if(!oldexists) InsertSavedFile(name);
Ilmoita("ST-song is now saved.");
return(FALSE);
}