home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
487.lha
/
FileID_v1.30
/
8SVX.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-03-11
|
6KB
|
243 lines
/**************************************************
*
* 8SVX.c
*
* IFF-8SVX file manipulation code
*
* Copyright(c), 1990, 1991 Lloyd B. Eldred
* & Fredrick R Homan
**************************************************/
#include <stdio.h>
#include <math.h>
#include <string.h>
#include "fi_IFF.h"
extern UBYTE VERBOSE, TERSE,COMMENT; /* Yuck, global variables... */
void IFF_8SVX(picfile,size)
FILE *picfile;
LONG size;
{
union chunk_ID{
char text_ID[4];
LONG long_ID;} chunk;
LONG ch_size,offset;
if(!TERSE) printf(" 8SVX (8-Bit Sample Voice) chunk \n");
if(TERSE) printf("8SVX ");
offset=0;
while(offset <= size-8){
IFF_ID(picfile,chunk.text_ID);
ch_size = IFF_size(picfile);
offset += (8+ch_size+is_odd(ch_size));
switch(chunk.long_ID){
case ID_VHDR :
IFF_VHDR(picfile,ch_size);
break;
case ID_NAME :
IFF_NAME(picfile,ch_size);
break;
case ID_copyright :
IFF_copyright(picfile,ch_size);
break;
case ID_AUTH :
IFF_AUTH(picfile,ch_size);
break;
case ID_ANNO :
IFF_ANNO(picfile,ch_size);
break;
case ID_BODY :
IFF_BODY(picfile,ch_size);
break;
case ID_ATAK :
IFF_ATAK(picfile,ch_size);
break;
case ID_RLSE :
IFF_RLSE(picfile,ch_size);
break;
case ID_CHAN :
IFF_CHAN(picfile,ch_size);
break;
case ID_PAN :
IFF_PAN(picfile,ch_size);
break;
default:
if(VERBOSE) printf(
" Inappropriate sub chunk for 8SVX: %4s\n",chunk.text_ID);
IFF_GotoEnd(picfile,ch_size);
} /* end of switch */
}/* end of while */
IFF_GotoEnd(picfile,size-offset);
if(VERBOSE) printf(" End of 8SVX.\n");
} /* end of IFF_8SVX */
/************************************************************/
/* Useful chunks for 8SVX Sampled sounds */
/************************************************************/
void IFF_VHDR(picfile,size)
FILE *picfile;
LONG size;
{
unsigned char c1,c2,c3,c4;
ULONG oneShotHiSamples,repeatHiSamples,samplesPerHiCycle;
UWORD samplesPerSec;
UBYTE ctOctave,sCompression;
LONG volume;
fi_getc(picfile,&c1);
fi_getc(picfile,&c2);
fi_getc(picfile,&c3);
fi_getc(picfile,&c4);
oneShotHiSamples = (ULONG)makelong(c1,c2,c3,c4);
fi_getc(picfile,&c1);
fi_getc(picfile,&c2);
fi_getc(picfile,&c3);
fi_getc(picfile,&c4);
repeatHiSamples = (ULONG)makelong(c1,c2,c3,c4);
fi_getc(picfile,&c1);
fi_getc(picfile,&c2);
fi_getc(picfile,&c3);
fi_getc(picfile,&c4);
samplesPerHiCycle = (ULONG)makelong(c1,c2,c3,c4);
fi_getc(picfile,&c1);
fi_getc(picfile,&c2);
samplesPerSec = (UWORD)c2 + (UWORD)(c1<<8);
fi_getc(picfile,&c1);
fi_getc(picfile,&c2);
ctOctave = (UBYTE)c1;
sCompression = (UBYTE)c2;
fi_getc(picfile,&c1);
fi_getc(picfile,&c2);
fi_getc(picfile,&c3);
fi_getc(picfile,&c4);
volume = makelong(c1,c2,c3,c4);
volume = (volume * 100) / 65536;
if(VERBOSE){
printf(" VHDR (Voice 8 Header) chunk.\n");
printf(" One Shot Hi-samples : %d\n",oneShotHiSamples);
printf(" Repeat Hi-samples : %d\n",repeatHiSamples);
printf(" Samples per Hi-cycle: %d\n",samplesPerHiCycle);
printf(" Samples per second : %d\n",samplesPerSec);
printf(" # of octaves : %d\n",ctOctave);
if(sCompression == 0)
printf(" No compression used\n");
else if(sCompression == 1)
printf(" Fibonacci-delta compression used\n");
else
printf(" Unknown compression technique used\n");
printf(" Volume (percent) : %d\n",volume);
}
else if(TERSE) printf(" %d %d\n",samplesPerSec,volume);
else if(!COMMENT){ /* i.e. Normal mode */
printf(" Samples per second : %d\n",samplesPerSec);
printf(" # of octaves : %d\n",ctOctave);
printf(" Volume (percent) : %d\n",volume);
}
IFF_GotoEnd(picfile,size-20);
} /* end of IFF_VHDR */
void IFF_ATAK(picfile,size)
FILE *picfile;
LONG size;
{
if(VERBOSE) printf(" ATAK (Envelope Attack Data) chunk.\n");
IFF_GotoEnd(picfile,size);
} /* end of IFF_ATAK */
void IFF_RLSE(picfile,size)
FILE *picfile;
LONG size;
{
if(VERBOSE) printf(" RLSE (Envelope Release Data) chunk.\n");
IFF_GotoEnd(picfile,size);
} /* end of IFF_RLSE */
void IFF_CHAN(picfile,size)
FILE *picfile;
LONG size;
{
LONG sampletype;
if(VERBOSE) printf(" CHAN (Stereo Channel) chunk.\n");
/* use our chunk size reader to read a LONG */
sampletype = IFF_size(picfile);
switch(sampletype){
case 4L:
if(VERBOSE) printf(" Right channel sound.\n");
break;
case 2L:
if(VERBOSE) printf(" Left channel sound.\n");
break;
case 6L:
if(VERBOSE) printf(" Stereo sound.\n");
break;
default:
if(VERBOSE) printf(
" Channel information not understood\n");
} /* end of switch */
IFF_GotoEnd(picfile,size-4);
} /* end of IFF_CHAN */
void IFF_PAN(picfile,size)
FILE *picfile;
LONG size;
{
LONG sposition;
float lvol,rvol;
if(VERBOSE) printf(" PAN (Stereo Pan) chunk.\n");
/* use IFF_size to read a LONG */
sposition = IFF_size(picfile);
lvol = sposition / 65536.0;
rvol = 1.0 - lvol;
lvol *= 100.;
rvol *= 100.;
if(VERBOSE) printf(" Left channel volume = %g %%\n"
" Right channel volume = %g %%\n",
lvol,rvol);
IFF_GotoEnd(picfile,size-4);
} /* end of IFF_PAN */