home *** CD-ROM | disk | FTP | other *** search
/ Sound Sensations! / sound_sensations.iso / misc / fileid13 / smus.c < prev   
C/C++ Source or Header  |  1991-01-26  |  5KB  |  220 lines

  1. /**************************************************
  2.  *
  3.  * SMUS.c
  4.  *
  5.  *   IFF-SMUS 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_SMUS(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("    SMUS (Simple MUsical Score)\n");
  28.    if(TERSE) printf("SMUS ");
  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_SHDR :
  38.             IFF_SHDR(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_INS1 :
  53.             IFF_INS1(picfile,ch_size);
  54.             break;
  55.          case ID_INST :
  56.             IFF_INST(picfile,ch_size);
  57.             break;
  58.          case ID_TRAK :
  59.             IFF_TRAK(picfile,ch_size);
  60.             break;
  61.          case ID_IRev :
  62.             IFF_IRev(picfile,ch_size);
  63.             break;
  64.          case ID_BIAS :
  65.             IFF_BIAS(picfile,ch_size);
  66.             break;
  67.          case ID_SNX1 :
  68.             IFF_SNX1(picfile,ch_size);
  69.             break;
  70.          default:
  71.             if(VERBOSE) printf(
  72.                "   Inappropriate sub chunk for SMUS: %4s\n",chunk.text_ID);
  73.             IFF_GotoEnd(picfile,ch_size);
  74.             
  75.       } /* end of switch */
  76.    } /* end of while */
  77.    IFF_GotoEnd(picfile,size-offset);
  78.    if(VERBOSE) printf("    End of SMUS.\n");
  79. }
  80.  
  81. /************************************************************/
  82. /* Useful chunks for SMUS files                             */
  83. /************************************************************/
  84.  
  85. void IFF_SHDR(picfile,size)
  86. FILE *picfile;
  87. LONG size;
  88.  
  89. {
  90.    unsigned char c1,c2,c3,c4;
  91.    UWORD tempo;
  92.    UBYTE volume, ctTrack;
  93.    float tempo2;
  94.    
  95.    if(VERBOSE) printf("      SHDR (sound header) chunk\n");
  96.  
  97.    fi_getc(picfile,&c1);
  98.    fi_getc(picfile,&c2);
  99.             
  100.     tempo = (UWORD)c2 + (UWORD)(c1<<8);
  101.  
  102.    tempo2 = tempo/128.0; 
  103.                         
  104.     fi_getc(picfile,&c3);
  105.  
  106.     volume = ((int)c3 * 100)/127;
  107.  
  108.     fi_getc(picfile,&c4);
  109.     
  110.    ctTrack = c4;
  111.            
  112.     if(!TERSE && !COMMENT){
  113.            printf("        Tempo  (1/4 notes/min): %g\n",tempo2);
  114.             printf("        Volume (percent)      : %d\n",volume);
  115.             printf("        Tracks                : %d\n",ctTrack);
  116.          }
  117.     if(TERSE) printf("  %g   %d   %d\n",tempo2,volume,ctTrack);
  118.     IFF_GotoEnd(picfile,size-4);
  119.     
  120. }
  121.  
  122. void IFF_INS1(picfile,size)
  123. FILE *picfile;
  124. LONG size;
  125.  
  126. {
  127.    char c1,c2,c3,c4;
  128.    UBYTE reg,type,data1,data2;
  129.    int i;
  130.    
  131.    if(VERBOSE) printf("      INS1 (Instrument) chunk\n");
  132.  
  133.    fi_getc(picfile,&c1);
  134.    fi_getc(picfile,&c2);
  135.     fi_getc(picfile,&c3);
  136.     fi_getc(picfile,&c4);
  137.               
  138.    reg = c1;
  139.    type = c2;
  140.    data1 = c3;
  141.    data2 = c4;
  142.    
  143.     if(VERBOSE) printf("        Instrument Register   : %d\n",reg);
  144.    if(type == 1)
  145.                if(VERBOSE) printf("        If MIDI is available use:"
  146.                    " MIDI channel %d, preset %d\n",
  147.                    data1,data2);
  148.     if(VERBOSE) printf("        Instrument name       : ");
  149.    for(i=0;i<size-4;i++){
  150.             fi_getc(picfile,&c1);
  151.             if(VERBOSE) printf("%c",c1);
  152.             }
  153.    if(VERBOSE) printf("\n");
  154.          
  155.     
  156.    if(is_odd(size)) fi_getc(picfile,&c1);
  157.     
  158. }
  159.  
  160. void IFF_INST(picfile,size)
  161. FILE *picfile;
  162. LONG size;
  163.  
  164. {
  165.    
  166.    if(VERBOSE) printf("      INST (Obsolete SMUS Instrument) chunk.\n");
  167.    
  168.    IFF_GotoEnd(picfile,size);
  169.       
  170. } /* end of IFF_INST */
  171.  
  172. void IFF_TRAK(picfile,size)
  173. FILE *picfile;
  174. LONG size;
  175.  
  176. {
  177.    
  178.    if(VERBOSE) printf("      TRAK (SMUS data) chunk.\n");
  179.    
  180.    IFF_GotoEnd(picfile,size);
  181.       
  182. } /* end of IFF_TRAK */
  183.  
  184. void IFF_IRev(picfile,size)
  185. FILE *picfile;
  186. LONG size;
  187.  
  188. {
  189.    
  190.    if(VERBOSE) printf("      IRev (Private Instant Music) chunk.\n");
  191.    
  192.    IFF_GotoEnd(picfile,size);
  193.       
  194. } /* end of IFF_IRev */
  195.  
  196. void IFF_BIAS(picfile,size)
  197. FILE *picfile;
  198. LONG size;
  199.  
  200. {
  201.    
  202.    if(VERBOSE) printf("      BIAS (Private Instant Music) chunk.\n");
  203.    
  204.    IFF_GotoEnd(picfile,size);
  205.       
  206. } /* end of IFF_BIAS */
  207.  
  208. void IFF_SNX1(picfile,size)
  209. FILE *picfile;
  210. LONG size;
  211.  
  212. {
  213.    
  214.    if(VERBOSE) printf("      SNX1 (Sonix proprietary) chunk.\n");
  215.    
  216.    IFF_GotoEnd(picfile,size);
  217.       
  218. } /* end of IFF_SNX1 */
  219.  
  220.