home *** CD-ROM | disk | FTP | other *** search
/ Audio 4.94 - Over 11,000 Files / audio-11000.iso / amiga / midi / obrst103.lha / OberSuite-1.03 / SourceCode / frommidi.c < prev    next >
C/C++ Source or Header  |  1993-01-23  |  3KB  |  110 lines

  1. /**************************************************************************
  2. * frommidi.c:    Functions for reading patch data from the MIDI stream.
  3. *        A part of OberSuite for the Commodore Amiga.
  4. *
  5. * Author:    Daniel Barrett, barrett@cs.umass.edu.
  6. * Version:    1.0.
  7. * Copyright:    None!  This program is in the Public Domain.
  8. *        Please share it with others.
  9. ***************************************************************************/
  10.  
  11. #include "decl.h"
  12.  
  13. /*
  14.  * Request one or more patches from the MIDI stream, and store them in the
  15.  * supplied PATCHINFO structure.  Return TRUE on success (else FALSE).
  16.  * If a data transfer fails, retry the transfer up to NUM_RETRIES times.
  17.  * Possible things that can go wrong:
  18.  *
  19.  *    The user could press ^C.
  20.  *    A transfer could fail NUM_RETRIES times or more.
  21.  */
  22.  
  23. BOOL GetPatchFromMidi(PATCHINFO *pi)
  24. {
  25.     int patchesGotten = 0;    /* How many patches have arrived safely? */
  26.     int numTries = 0;    /* How many times have we retried 1 patch? */
  27.     long offset = 0L;    /* Where in the patch data are we? */
  28.  
  29.     ResetSerialPort();
  30.     while ((patchesGotten < pi->numPatches) && (numTries < NUM_RETRIES))
  31.     {
  32.  
  33.    /* Did the user press ^C? */
  34.  
  35.         if (CtrlcCheck())
  36.         {
  37.                 ErrorMsg(ERROR_CTRLC);
  38.             return(FALSE);
  39.         }
  40.  
  41.    /* Request and obtain the data for 1 patch. */
  42.  
  43.         RequestTheRightPatch(pi, patchesGotten);
  44.         pi->actualSize = GetFromMidi(pi, offset);
  45.  
  46.    /* If the user pressed ^C during the transfer, goodbye! */
  47.  
  48.         if (pi->actualSize == CTRL_C_NO_BYTES)
  49.         {
  50.             ErrorMsg(ERROR_CTRLC);
  51.             return(FALSE);
  52.         }
  53.  
  54.    /* If the patch data is OK, tell the user, and get ready to obtain
  55.     * the next patch. */
  56.  
  57.         else if (VerifyPatch(pi, offset))
  58.         {
  59.             patchesGotten++;
  60.             if (OUTPUT_ALLOWED)
  61.                     PrintPatchInfo(pi, offset);
  62.             numTries = 0;
  63.             offset += pi->rightSize;
  64.         }
  65.  
  66.    /* The patch data is not OK.  If we haven't done too many retries yet,
  67.     * try again. */
  68.  
  69.         else if (++numTries < NUM_RETRIES)
  70.         {
  71.             if (ERR_OUTPUT_ALLOWED)
  72.                 fprintf(stderr, "  <%d> Retry #%d...\n", 
  73.                     patchesGotten, numTries);
  74.             ResetSerialPort();
  75.         }
  76.     }
  77.  
  78.    /* Did we successfully get the data in fewer than NUM_RETRIES attempts? */
  79.  
  80.     return((BOOL)(numTries < NUM_RETRIES));
  81. }
  82.  
  83.  
  84. /*
  85.  * Get one patch from MIDI.  Return the number of bytes read, or
  86.  * CTRL_C_NO_BYTES if the user pressed ^C during the transfer.
  87.  */
  88.  
  89. long GetFromMidi(PATCHINFO *pi, long offset)
  90. {
  91.     PrepareToReadMidi(pi->data + offset, pi->rightSize);
  92.     return(DoTheIO());
  93. }
  94.  
  95.  
  96. /*
  97.  * Request 1 patch from the synth.
  98.  * If the user has requested ALL patches, use their original patch numbers.
  99.  * Otherwise, use the new patch number that the user specified on the
  100.  *  command line.
  101.  */
  102.  
  103. void RequestTheRightPatch(PATCHINFO *pi, int relativeNum)
  104. {
  105.     if (pi->patchNum == ALL_PATCHES_NUM)
  106.         RequestOnePatch(relativeNum, pi->mode);
  107.     else
  108.         RequestOnePatch(pi->patchNum, pi->mode);
  109. }
  110.