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 / obput.c < prev    next >
C/C++ Source or Header  |  1993-01-23  |  5KB  |  226 lines

  1. /**************************************************************************
  2. * obput.c:    Main program for ObPut.
  3. *        Send Oberheim patch data from a file to the synth.
  4. *        A part of OberSuite for the Commodore Amiga.
  5. *
  6. * Author:    Daniel Barrett, barrett@cs.umass.edu.
  7. * Version:    1.0.
  8. * Copyright:    None!  This program is in the Public Domain.
  9. *        Please share it with others.
  10. ***************************************************************************/
  11.  
  12. #include "decl.h"
  13. #include "obput.h"
  14.  
  15. char *version = "$VER: ObPut "  VERSION " " VERDATE;
  16.  
  17. /***************************************************************************
  18. * The main program.
  19. ***************************************************************************/
  20.  
  21. main(argc, argv)
  22. int argc; char *argv[];
  23. {
  24.     Enable_Abort = 0;            /* Disable ^C aborts. */
  25.     strcpy(programName, BaseName(argv[0]));    /* Global variable. */
  26.     thePrintStyle = VERBOSE;        /* Global variable. */
  27.  
  28.  
  29.     if (argc == 1)
  30.     {
  31.         ShortUsageMsg();
  32.         BegForUsage();
  33.     }
  34.     else if ((argc == 2) && (!strcmp(argv[1], "?")))
  35.         DetailedUsage();
  36.     else if (!HandleOptions(argc, argv))
  37.         BegForUsage();
  38.     else if (optind == argc-1)
  39.         ObPut(NULL, argv[optind]);
  40.     else if (optind == argc-2)
  41.         ObPut(argv[optind], argv[optind+1]);
  42.     else
  43.         ErrorMsg(ERROR_NUMARGS);
  44.  
  45.     exit(0);
  46. }
  47.  
  48.  
  49. /*
  50.  * Send the data in the given file to the given patch location (specified
  51.  * in patchString).
  52.  */
  53.  
  54. void ObPut(char *patchString, char *filename)
  55. {
  56.     PATCHINFO pi;
  57.  
  58.     InitPatchInfo(&pi);
  59.     pi.source = PI_SOURCE_FILE;
  60.     if (!SerialSetup())
  61.         return;
  62.  
  63.     if (BreakUp(patchString, &pi))
  64.     {
  65.         if (!LookAtFileSize(&pi, filename))
  66.             ;
  67.         else if (!TransmitPatchInfo(&pi, filename))
  68.             ErrorMsg(ERROR_FAILED);
  69.         else
  70.             ;
  71.     }
  72.  
  73.     SerialShutdown();
  74.     FreePatchInfo(&pi);
  75. }
  76.  
  77.  
  78. /*
  79.  * Interpret the string "patchString" and store the appropriate data in
  80.  *  the given PATCHINFO structure.
  81.  * If the patchString is empty, we will send the data to the patch whose
  82.  *  number is already embedded in the patch data in the file.
  83.  * Otherwise, patchString MUST be an integer between FIRST_PATCH and 
  84.  * LAST_PATCH, inclusive.  Store the integer in the patchNum field.
  85.  * Return TRUE on success (else FALSE).
  86.  */
  87.  
  88. BOOL BreakUp(char *patchString, PATCHINFO *pi)
  89. {
  90.     if (!patchString)
  91.     {
  92.         pi->patchNum = DEFAULT_PATCH_NUM;
  93.         return(TRUE);
  94.     }
  95.     else if (AllDigits(patchString))
  96.     {
  97.         pi->patchNum = (UBYTE)(atoi(patchString));
  98.         if (!Between(pi->patchNum, FIRST_PATCH, LAST_PATCH))
  99.         {
  100.             ErrorMsg(ERROR_PATCHNUM);
  101.             return(FALSE);
  102.         }
  103.         else
  104.             return(TRUE);
  105.     }
  106.     else
  107.     {
  108.         ErrorMsg(ERROR_PATCHNUM);
  109.         return(FALSE);
  110.     }
  111. }
  112.  
  113.  
  114. /***************************************************************************
  115. * Handle the command-line options.
  116. ***************************************************************************/
  117.  
  118. BOOL HandleOptions(int argc, char *argv[])
  119. {
  120.     int c;
  121.         short printed = 0;    /* How many print options were chosen? */
  122.  
  123.     while ((c = getopt(argc, argv, options)) != EOF)
  124.     {
  125.         switch (c)
  126.         {
  127.             case OPT_SILENT:
  128.                 thePrintStyle = SILENT;
  129.                 printed++;
  130.                 break;
  131.             case OPT_VERBOSE:
  132.                 thePrintStyle = VERBOSE;
  133.                 printed++;
  134.                 break;
  135.             case OPT_DEADQUIET:
  136.                 thePrintStyle = DEADQUIET;
  137.                 printed++;
  138.                 break;
  139.             default:
  140.                 return(FALSE);
  141.         }
  142.     }
  143.  
  144.     if (printed > 1)        /* Can't choose >1 print option. */
  145.         ErrorMsg(ERROR_TWOPRINTS);
  146.  
  147.     return(printed <= 1);
  148. }
  149.  
  150.  
  151. /***************************************************************************
  152. * Transmit the patch data from the given file to MIDI.
  153. * Return success or failure.
  154. ***************************************************************************/
  155.  
  156. BOOL TransmitPatchInfo(PATCHINFO *pi, char *filename)
  157. {
  158.     BOOL result = TRUE;
  159.  
  160.     if (! (result = AllocPatchInfo(pi)) )
  161.         ErrorMsg(ERROR_MALLOC);
  162.     else if (! (result = GetPatchFromFile(pi, filename)) )
  163.         ErrorMsg(ERROR_GETFAILED);
  164.     else if (! (result = PutPatchToMidi(pi)) )
  165.         ErrorMsg(ERROR_PUTFAILED_SEND);
  166.  
  167.     return(result);
  168. }
  169.  
  170.     
  171. /***************************************************************************
  172. * Usage information.
  173. ***************************************************************************/
  174.  
  175.  
  176. void ShortUsageMsg(void)
  177. {
  178.     if (!ERR_OUTPUT_ALLOWED)
  179.         return;
  180.  
  181.     fprintf(stderr, "Usage: %s [options] [PatchNumber] filename\n",
  182.         programName);
  183. }
  184.  
  185.  
  186. void UsageMsg(void)
  187. {
  188.     if (!ERR_OUTPUT_ALLOWED)
  189.         return;
  190.  
  191.     fprintf(stderr, "%s sends Xpander/Matrix-12 patch data from a"
  192.             " file to the synthesizer.\n",
  193.         programName);
  194.  
  195.     ShortUsageMsg();
  196.  
  197.     fprintf(stderr, "\nLegal options are:\n");
  198.     fprintf(stderr, "\t-%c:\tQuiet output; error messages only.\n",
  199.         OPT_SILENT);
  200.     fprintf(stderr, "\t-%c:\tNo output; not even error messages.\n",
  201.         OPT_DEADQUIET);
  202.     fprintf(stderr, "\t-%c:\tLong output.       (DEFAULT)\n",
  203.         OPT_VERBOSE);
  204.  
  205.     fprintf(stderr, "\nIf you specify a patch number (%d-%d),"
  206.             " your data is sent to that patch\n"
  207.             "location.  Otherwise, the data is sent to its"
  208.             " original patch location.\n",
  209.         FIRST_PATCH, LAST_PATCH);
  210.  
  211.     fprintf(stderr, "If the file contains more than 1 patch, "
  212.             "any \"PatchNumber\" parameter will\nbe ignored.\n");
  213.  
  214.     fprintf(stderr, "\nExamples:\n");
  215.     fprintf(stderr, "\t%s -%c 23 myPatchFile\n", programName,
  216.         OPT_VERBOSE);
  217.     fprintf(stderr, "\t%s myPatchFile\n", programName);
  218. }
  219.  
  220.  
  221. char *Version(void)
  222. {
  223.     static char v[] = VERSION;
  224.     return(v);
  225. }
  226.