/**************************************************
 *
 * SMUS.c
 *
 *   IFF-SMUS 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_SMUS(picfile,size)
FILE *picfile;
LONG size;

{
   union chunk_ID{
       char text_ID[4];
       LONG long_ID;} chunk;
   LONG ch_size,offset;

	if(!TERSE) printf("    SMUS (Simple MUsical Score)\n");
   if(TERSE) printf("SMUS ");
   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_SHDR :
            IFF_SHDR(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_INS1 :
            IFF_INS1(picfile,ch_size);
            break;
         case ID_INST :
            IFF_INST(picfile,ch_size);
            break;
         case ID_TRAK :
            IFF_TRAK(picfile,ch_size);
            break;
         case ID_IRev :
            IFF_IRev(picfile,ch_size);
            break;
         case ID_BIAS :
            IFF_BIAS(picfile,ch_size);
            break;
         case ID_SNX1 :
            IFF_SNX1(picfile,ch_size);
            break;
         default:
            if(VERBOSE) printf(
               "   Inappropriate sub chunk for SMUS: %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 SMUS.\n");
}

/************************************************************/
/* Useful chunks for SMUS files                             */
/************************************************************/

void IFF_SHDR(picfile,size)
FILE *picfile;
LONG size;

{
   unsigned char c1,c2,c3,c4;
   UWORD tempo;
   UBYTE volume, ctTrack;
   float tempo2;
   
   if(VERBOSE) printf("      SHDR (sound header) chunk\n");

   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
			
	tempo = (UWORD)c2 + (UWORD)(c1<<8);

   tempo2 = tempo/128.0; 
						
	fi_getc(picfile,&c3);

	volume = ((int)c3 * 100)/127;

	fi_getc(picfile,&c4);
	
   ctTrack = c4;
   		
	if(!TERSE && !COMMENT){
   		printf("        Tempo  (1/4 notes/min): %g\n",tempo2);
			printf("        Volume (percent)      : %d\n",volume);
			printf("        Tracks                : %d\n",ctTrack);
         }
    if(TERSE) printf("  %g   %d   %d\n",tempo2,volume,ctTrack);
    IFF_GotoEnd(picfile,size-4);
    
}

void IFF_INS1(picfile,size)
FILE *picfile;
LONG size;

{
   char c1,c2,c3,c4;
   UBYTE reg,type,data1,data2;
   int i;
   
   if(VERBOSE) printf("      INS1 (Instrument) chunk\n");

   fi_getc(picfile,&c1);
   fi_getc(picfile,&c2);
	fi_getc(picfile,&c3);
	fi_getc(picfile,&c4);
	  		
   reg = c1;
   type = c2;
   data1 = c3;
   data2 = c4;
   
	if(VERBOSE) printf("        Instrument Register   : %d\n",reg);
   if(type == 1)
			   if(VERBOSE) printf("        If MIDI is available use:"
                   " MIDI channel %d, preset %d\n",
                   data1,data2);
	if(VERBOSE) printf("        Instrument name       : ");
   for(i=0;i<size-4;i++){
            fi_getc(picfile,&c1);
            if(VERBOSE) printf("%c",c1);
            }
   if(VERBOSE) printf("\n");
         
    
   if(is_odd(size)) fi_getc(picfile,&c1);
    
}

void IFF_INST(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      INST (Obsolete SMUS Instrument) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_INST */

void IFF_TRAK(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      TRAK (SMUS data) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_TRAK */

void IFF_IRev(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      IRev (Private Instant Music) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_IRev */

void IFF_BIAS(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      BIAS (Private Instant Music) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_BIAS */

void IFF_SNX1(picfile,size)
FILE *picfile;
LONG size;

{
   
   if(VERBOSE) printf("      SNX1 (Sonix proprietary) chunk.\n");
   
   IFF_GotoEnd(picfile,size);
      
} /* end of IFF_SNX1 */

