home *** CD-ROM | disk | FTP | other *** search
- /**************************************************
- *
- * 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 */
-