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 >
C/C++ Source or Header  |  1991-03-11  |  6KB  |  243 lines

  1. /**************************************************
  2.  *
  3.  * 8SVX.c
  4.  *
  5.  *   IFF-8SVX file manipulation code
  6.  *
  7.  *    Copyright(c), 1990, 1991 Lloyd B. Eldred
  8.  *                           & Fredrick R Homan
  9.  **************************************************/
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include <string.h>
  13. #include "fi_IFF.h"
  14.  
  15. extern UBYTE VERBOSE, TERSE,COMMENT;  /* Yuck, global variables... */
  16.  
  17. void IFF_8SVX(picfile,size)
  18. FILE *picfile;
  19. LONG size;
  20.  
  21. {
  22.    union chunk_ID{
  23.        char text_ID[4];
  24.        LONG long_ID;} chunk;
  25.    LONG ch_size,offset;
  26.  
  27.    if(!TERSE) printf("    8SVX (8-Bit Sample Voice) chunk \n");
  28.    if(TERSE) printf("8SVX  ");
  29.    offset=0;
  30.    
  31.    while(offset <= size-8){
  32.       IFF_ID(picfile,chunk.text_ID);
  33.       ch_size = IFF_size(picfile);
  34.       offset += (8+ch_size+is_odd(ch_size));
  35.       
  36.       switch(chunk.long_ID){
  37.          case ID_VHDR :
  38.             IFF_VHDR(picfile,ch_size);
  39.             break;
  40.          case ID_NAME :
  41.             IFF_NAME(picfile,ch_size);
  42.             break;
  43.          case ID_copyright :
  44.             IFF_copyright(picfile,ch_size);
  45.             break;
  46.          case ID_AUTH :
  47.             IFF_AUTH(picfile,ch_size);
  48.             break;
  49.          case ID_ANNO :
  50.             IFF_ANNO(picfile,ch_size);
  51.             break;
  52.          case ID_BODY :
  53.             IFF_BODY(picfile,ch_size);
  54.             break;
  55.          case ID_ATAK :
  56.             IFF_ATAK(picfile,ch_size);
  57.             break;
  58.          case ID_RLSE :
  59.             IFF_RLSE(picfile,ch_size);
  60.             break;
  61.          case ID_CHAN :
  62.             IFF_CHAN(picfile,ch_size);
  63.             break;
  64.          case ID_PAN :
  65.             IFF_PAN(picfile,ch_size);
  66.             break;
  67.          default:
  68.             if(VERBOSE) printf(
  69.                "   Inappropriate sub chunk for 8SVX: %4s\n",chunk.text_ID);
  70.             IFF_GotoEnd(picfile,ch_size);
  71.          } /* end of switch */
  72.       }/* end of while */
  73.    
  74.    IFF_GotoEnd(picfile,size-offset);
  75.    if(VERBOSE) printf("    End of 8SVX.\n");
  76.    
  77. } /* end of IFF_8SVX */
  78.  
  79. /************************************************************/
  80. /* Useful chunks for 8SVX Sampled sounds                    */
  81. /************************************************************/
  82.  
  83. void IFF_VHDR(picfile,size)
  84. FILE *picfile;
  85. LONG size;
  86.  
  87. {
  88.    unsigned char c1,c2,c3,c4;
  89.    ULONG oneShotHiSamples,repeatHiSamples,samplesPerHiCycle;
  90.    UWORD samplesPerSec;
  91.    UBYTE ctOctave,sCompression;
  92.    LONG volume;
  93.    
  94.    fi_getc(picfile,&c1);
  95.    fi_getc(picfile,&c2);
  96.    fi_getc(picfile,&c3);
  97.    fi_getc(picfile,&c4);
  98.    
  99.    oneShotHiSamples = (ULONG)makelong(c1,c2,c3,c4);
  100.  
  101.    fi_getc(picfile,&c1);
  102.    fi_getc(picfile,&c2);
  103.    fi_getc(picfile,&c3);
  104.    fi_getc(picfile,&c4);
  105.    
  106.    repeatHiSamples = (ULONG)makelong(c1,c2,c3,c4);
  107.       
  108.    fi_getc(picfile,&c1);
  109.    fi_getc(picfile,&c2);
  110.    fi_getc(picfile,&c3);
  111.    fi_getc(picfile,&c4);
  112.    
  113.    samplesPerHiCycle = (ULONG)makelong(c1,c2,c3,c4);
  114.  
  115.    fi_getc(picfile,&c1);
  116.    fi_getc(picfile,&c2);
  117.    
  118.    samplesPerSec = (UWORD)c2 + (UWORD)(c1<<8);            
  119.  
  120.    fi_getc(picfile,&c1);
  121.    fi_getc(picfile,&c2);
  122.    
  123.    ctOctave = (UBYTE)c1;
  124.    sCompression = (UBYTE)c2;
  125.    
  126.    fi_getc(picfile,&c1);
  127.    fi_getc(picfile,&c2);
  128.    fi_getc(picfile,&c3);
  129.    fi_getc(picfile,&c4);
  130.    
  131.     volume = makelong(c1,c2,c3,c4);
  132.     volume = (volume * 100) / 65536;
  133.     
  134.    if(VERBOSE){        
  135.          printf("      VHDR (Voice 8 Header) chunk.\n");
  136.          printf("        One Shot Hi-samples : %d\n",oneShotHiSamples);
  137.          printf("        Repeat   Hi-samples : %d\n",repeatHiSamples);
  138.          printf("        Samples per Hi-cycle: %d\n",samplesPerHiCycle);
  139.          printf("        Samples per second  : %d\n",samplesPerSec);
  140.          printf("        # of octaves        : %d\n",ctOctave);
  141.          if(sCompression == 0)
  142.             printf("        No compression used\n");
  143.          else if(sCompression == 1)
  144.             printf("        Fibonacci-delta compression used\n");
  145.          else
  146.             printf("        Unknown compression technique used\n");
  147.             printf("        Volume (percent)    : %d\n",volume);
  148.       }
  149.    else if(TERSE) printf(" %d   %d\n",samplesPerSec,volume);
  150.    else if(!COMMENT){  /* i.e. Normal mode */
  151.          printf("        Samples per second  : %d\n",samplesPerSec);
  152.          printf("        # of octaves        : %d\n",ctOctave);
  153.             printf("        Volume (percent)    : %d\n",volume);
  154.    }
  155.    IFF_GotoEnd(picfile,size-20);
  156.    
  157. } /* end of IFF_VHDR */
  158.  
  159. void IFF_ATAK(picfile,size)
  160. FILE *picfile;
  161. LONG size;
  162.  
  163. {
  164.    
  165.    if(VERBOSE) printf("      ATAK (Envelope Attack Data) chunk.\n");
  166.    
  167.    IFF_GotoEnd(picfile,size);
  168.       
  169. } /* end of IFF_ATAK */
  170.  
  171. void IFF_RLSE(picfile,size)
  172. FILE *picfile;
  173. LONG size;
  174.  
  175. {
  176.    
  177.    if(VERBOSE) printf("      RLSE (Envelope Release Data) chunk.\n");
  178.  
  179.    IFF_GotoEnd(picfile,size);
  180.       
  181. } /* end of IFF_RLSE */
  182.  
  183. void IFF_CHAN(picfile,size)
  184. FILE *picfile;
  185. LONG size;
  186.  
  187. {
  188.    LONG sampletype;
  189.    
  190.    if(VERBOSE) printf("      CHAN (Stereo Channel) chunk.\n");
  191.    
  192. /* use our chunk size reader to read a LONG */
  193.  
  194.    sampletype = IFF_size(picfile);
  195.    
  196.    switch(sampletype){
  197.       case 4L:
  198.          if(VERBOSE) printf("         Right channel sound.\n");
  199.          break;
  200.       case 2L:
  201.          if(VERBOSE) printf("         Left channel sound.\n");
  202.          break;
  203.       case 6L:
  204.          if(VERBOSE) printf("         Stereo sound.\n");
  205.          break;
  206.       default:
  207.          if(VERBOSE) printf(
  208.             "         Channel information not understood\n");   
  209.       } /* end of switch */
  210.             
  211.    IFF_GotoEnd(picfile,size-4);
  212.       
  213. } /* end of IFF_CHAN */
  214.  
  215. void IFF_PAN(picfile,size)
  216. FILE *picfile;
  217. LONG size;
  218.  
  219. {
  220.    LONG sposition;
  221.    float lvol,rvol;
  222.    
  223.    if(VERBOSE) printf("      PAN (Stereo Pan) chunk.\n");
  224.    
  225. /* use IFF_size to read a LONG */
  226.  
  227.    sposition = IFF_size(picfile);
  228.       
  229.    lvol = sposition / 65536.0;
  230.    
  231.    rvol = 1.0 - lvol;
  232.    
  233.    lvol *= 100.;
  234.    rvol *= 100.;
  235.    
  236.    if(VERBOSE) printf("        Left  channel volume = %g %%\n"
  237.                         "        Right channel volume = %g %%\n",
  238.                         lvol,rvol);
  239.                         
  240.    IFF_GotoEnd(picfile,size-4);
  241.       
  242. } /* end of IFF_PAN */
  243.