/* smus2MS
 *   Routines for converting IFF stuff to Music Studio
 *     except TRAK conversion found in 'song.c'
 */

#include "smus.h"
#include "music.h"

extern   int   assign();   /* assign color to a track */

/*
 * Load a sound file
 *  return true if successfully read entire file
 */
BOOL
GetPallette(sndfnam)
   char *sndfnam;
{
   LONG  sndfil;
   int   LenRead;
   /* char  sfnam[30];   */
   char  *sfnam;


   sfnam = MakeInName(sndfnam,".sound");
   sndfil = Open(sfnam,MODE_OLDFILE);
   if (sndfil != NULL)
   {
      LenRead = Read(sndfil,mshead,SNDLEN);
      if (IsMSFile(mshead))
         if (LenRead == SNDLEN)
         {
            Close(sndfil);
            mshead[9] = 2;       /* call it a song file */
            return(TRUE);
         }  
   }
   printf("Error reading pallette file '%s'\n");
   Close(sndfil);
   return(FALSE);
} /* GetPallette */


/*
 *  Convert IFF NAME chunk to Music Studio
 */
NameToMS(namlen,buf)
   long namlen;
   char *buf;
{
   int i;

   for (i=0; ((i < namlen) &&    /* stop when end of name chunk */
              (i<31) &&          /* or when name is 31 chars long */
              (buf[i] != NULL));  /* or at a null */
             i++)
      stitle[i] = buf[i];     /* fill global song title array */
   stitle[i] = NULL;          /* Null-terminate song title */
}

/*
 * Extract tempo and volume from SMUS song header chunk
 */
ShdrToMS(SongHead)
   SScoreHeader *SongHead;
{
   song[INITIAL_KEY] =  1;             /* be sure to def. to c maj */
   song[INITIAL_TIME] = 4;             /* time sig to 3/4 */
   song[INITIAL_TEMPO] = (SongHead->tempo>>7);  /* set starting tempo */
   song[INITIAL_VOLUME] = (SongHead->volume);   /* set starting volume */
}

   /* length of ADSR name entry in MS song header */
   /* each ADSR name is up to 9 bytes of name + NULL */
#define  INAM_LEN 10

/*
 *  Handle an SMUS Instrument chunk:
 *    HOW?
 */
Ins1ToMS(ChunkSize,Inst)
   long ChunkSize;
   RefInstrument *Inst;
   {
   int AdsrNum,i;
   char adsrch = ' ';
   char InstName[INAM_LEN];
   char AdsrNam[INAM_LEN];

      /* Check Instrument name against each MS ADSR entry */
   for (AdsrNum = 0; AdsrNum < MAXCOLORS; AdsrNum++)
   {
      for (i=0;((i < INAM_LEN-1) && (i < (ChunkSize - 4))); i++)
         InstName[i] = tolower(Inst->name[i]);
      InstName[i] = NULL;
      for (i=0;((i < INAM_LEN-1) &&
                ((adsrch = adsrname[(AdsrNum*INAM_LEN)+i]) != NULL)); i++)
         AdsrNam[i] = tolower(adsrch);
      AdsrNam[i] = NULL;
      if (strncmp(&InstName[0],&AdsrNam[0],INAM_LEN-1) == 0)
         Tracks[Inst->registr].Colors =
                  assign(Tracks[Inst->registr].Colors,AdsrNum);
   } /* for each adsr entry */

} /* Ins1ToMS */


MemMove(s,d,c)
   char *s,*d;
   long c;
{
   while (c-- > 0)
      *d++ = *s++;
}

/*
 * Read a SMUS TRAK chunk from the input file
 *  and place it in the internal track buffer
 *  for the given track number
 */
ReadTrack(ChunkSize,TrackChunk,TrkNum)
   long  ChunkSize;
   SEvent *TrackChunk;
   int   TrkNum;
{
   char *MyMem;

   MyMem = (char *) ExtAlloc(ChunkSize);    /* allocate some RAM */
   MemMove((char *) TrackChunk,MyMem,ChunkSize);  /* copy chunk data */
   Tracks[TrkNum].TrackData = (SEvent *) MyMem;    /* save ptr to data */
   Tracks[TrkNum].TrackSize = ChunkSize;
}


/*
 * Set up "Setup Frame" of MS Song
 */
InitSong()
{
   int i;

   for (i = 0; i < 0x64B; i++)
      mshead[i] = (char) msinit[i];
   cursng = &(song[11]);             /* point cursor to start of song */
}

WriteSong(IFFName,DstDir)
   char *IFFName;
   char *DstDir;
{
   long  songlen;
   LONG  MyFile;
   char  *MSName;

   *cursng++ = 0xFF;
   songlen = cursng - mshead;
   MSName = MakeName(IFFName,DstDir,".song");
   MyFile = Open(MSName,MODE_NEWFILE);
   if (MyFile == 0L) {
      printf("\nError opening file '%s'\n",MSName);
   } else
      if ((Write(MyFile,mshead,songlen)) <= 0)
         printf("Write failed on file '%s'\n",MSName);
  Close(MyFile);
} /* WriteSong */

/*
 * Set up initial values for all tracks before program starts
 */
InitTracks()
{
   int i;

   NumTracks = 0;                   /* no tracks read yet */
   for (i=0; i < MAXITRACKS; i++) {
      Tracks[i].TrackData = NULL;   /* no chunk yet */
      Tracks[i].TrackSize = 0;      /* so zero size */
      Tracks[i].Finished = FALSE;   /* true when no events left on track */
      Tracks[i].EventPos = 0;       /* start with the first event.. */
      Tracks[i].TimeToGo = 0;       /* all tracks kick in at start */
      Tracks[i].Colors = 0;         /* no color assignments yet */
   }
}

FreeTracks()
{
   int   i;
   for (i = 0; i < NumTracks; i++)
      RemFree((UBYTE *) Tracks[i].TrackData);
}

