home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / taropyon / he386 / ccisrc / tg300vm.c < prev   
C/C++ Source or Header  |  1995-06-20  |  5KB  |  207 lines

  1. /*************************************************************************
  2. *    TG300 VOICE MEMORY
  3. *************************************************************************/
  4.  
  5. int        _tg300_readVoiceData( char *fp, char *common, char *e1buf, char *e2buf );
  6. int        my_isxdigit(int ch);
  7.  
  8. #ifndef        SKIP_SPACE
  9. #    define    SKIP_SPACE(_s)    while(isspace(*(_s))) ++(_s)
  10. #endif
  11.  
  12. /*************************************************************************
  13. *    VOICE DATA SET
  14. *-------------------------------------------------------------------------
  15. *    exTG300_voiceDataSet(vno,filename)
  16. *        type    …    0~7
  17. *************************************************************************/
  18.  
  19. int        exTG300_voiceDataSet( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  20. {
  21.     int            ret, vno, retsiz;
  22.     char       *fp;
  23.     char       *fn, excl[256], tmp[1024];
  24.     char        common[16], e1buf[0x80], e2buf[0x80];
  25.  
  26.     if ( argc != 2 )
  27.     {
  28. _ERR:    MM_setErrMsg(sqr,"TG300 \"VOICE DATA SET\" error!");
  29.         return(ERR);
  30.     }
  31.     vno = atoi(argv[0]) - 1;
  32.     if ( vno < 0 || vno > 127 )
  33.         goto _ERR;
  34.     fn = argv[1];
  35.     if ( (fp = MM_fopen(sqr,fn,"r")) == NULL )
  36.     {
  37.         MM_setErrMsg(sqr,"TG300 \"VOICE DATA SET\" file open eror! (%s)", fn);
  38.         return(ERR);
  39.     }
  40.     ret = _tg300_readVoiceData( fp, common, e1buf, e2buf );
  41.     fclose(fp);
  42.     if ( ret )
  43.         goto _ERR;
  44.  
  45.     retsiz = 0;
  46.  
  47.     /* COMMON VOICE DATA    */
  48.     ret = tg300_excl( excl, 0x040000 + (vno<<8), 0x0B, common);
  49.     ret = make_sysEx( tmp, ret, excl);
  50.     if ( ret >= bufSiz )
  51.     {
  52. _STR_ERR:
  53.         MM_setErrMsg(sqr,_OUT_OF_STRING_SPACE);
  54.         return (ERR);
  55.     }
  56.     memcpy( buf, tmp, ret );
  57.     bufSiz -= ret;
  58.     buf    += ret;
  59.     retsiz += ret;
  60.  
  61.     /* ELEMENT 1    */
  62.     ret = tg300_excl( excl, 0x050000 + (vno<<8), 0x50, e1buf);
  63.     ret = make_sysEx( tmp, ret, excl);
  64.     if ( ret >= bufSiz )
  65.         goto _STR_ERR;
  66.     memcpy( buf, tmp, ret );
  67.     bufSiz -= ret;
  68.     buf    += ret;
  69.     retsiz += ret;
  70.  
  71.     /* ELEMENT 2    */
  72.     if ( common[1] == 1 )
  73.     {
  74.         ret = tg300_excl( excl, 0x060000 + (vno<<8), 0x50, e2buf);
  75.         ret = make_sysEx( tmp, ret, excl);
  76.         if ( ret >= bufSiz )
  77.             goto _STR_ERR;
  78.         memcpy( buf, tmp, ret );
  79.         bufSiz -= ret;
  80.         retsiz += ret;
  81.         buf    += ret;
  82.     }
  83.     return (retsiz);
  84. }
  85.  
  86. int        _tg300_readVoiceData( char *fp, char *common, char *e1buf, char *e2buf )
  87. {
  88.     char       *s, buf[512];
  89.     int            siz, ret, dat, c1, c2, len, mode;
  90.     unsigned    adr;
  91.     char        name[12];
  92.     char        flgCommon, flgEle1, flgEle2;
  93.  
  94.     ret       = NORMAL;
  95.     flgCommon = 0;
  96.     flgEle1   = 0;
  97.     flgEle2   = 0;
  98.     mode = -1;
  99.     while ( fgets(buf,512,fp) != NULL )
  100.     {
  101.         s = buf;
  102.         SKIP_SPACE(s);
  103.         if ( *s == '#' || *s == '\0' )
  104.             goto _NEXT_LINE;
  105.         if ( *s == '.' )
  106.         {    /* コマンド    */
  107.             if ( mode >= 0 )
  108.                 break;    /* error */
  109.             ++s;
  110.             SKIP_SPACE(s);
  111.             if ( strncmp(s,"voice",5) == 0 )
  112.             {
  113.                 s += 5;
  114.                 SKIP_SPACE(s);
  115.                 strncpy( name, s, 8 );    name[8] = '\0';
  116.                 mode = 0;
  117.                 siz  = 0;
  118.             } else if ( strncmp(s,"element",7) == 0 )
  119.             {
  120.                 s += 7;
  121.                 SKIP_SPACE(s);
  122.                 mode = atoi(s);
  123.                 if ( mode < 1 || mode > 2 )
  124.                 {
  125.                     ret = ERR;
  126.                     break;    /* error */
  127.                 }
  128.                 siz = 0;
  129.             }
  130.         } else if ( mode >= 0 )
  131.         {
  132.             for (;;)
  133.             {
  134.                 if ( *s == '#' )
  135.                     goto _NEXT_LINE;
  136.                 c1 = my_isxdigit(s[0]);
  137.                 c2 = my_isxdigit(s[1]);
  138.                 if ( c1 >= 0 && c2 >= 0 )
  139.                 {
  140.                     s += 2;
  141.                     dat = (c1<<4) | c2;
  142.                     switch ( mode )
  143.                     {
  144.                         case 0:    /* common */
  145.                             common[siz++] = dat;
  146.                             if ( siz == 3 )
  147.                             {
  148.                                 len = strlen(name);
  149.                                 memcpy(&common[3],"        ",8  );
  150.                                 memcpy(&common[3],name      ,len);
  151.                                 flgCommon = 1;    /* OK */
  152.                                 mode = -1;
  153.                                 goto _NEXT_LINE;
  154.                             }
  155.                             break;
  156.  
  157.                         case 1:
  158.                             e1buf[siz++] = dat;
  159.                             if ( siz == 0x50 )
  160.                             {
  161.                                 flgEle1 = 1;    /* OK */
  162.                                 mode = -1;
  163.                                 goto _NEXT_LINE;
  164.                             }
  165.                             break;
  166.  
  167.                         case 2:
  168.                             e2buf[siz++] = dat;
  169.                             if ( siz == 0x50 )
  170.                             {
  171.                                 flgEle2 = 1;    /* OK */
  172.                                 mode = -1;
  173.                                 goto _NEXT_LINE;
  174.                             }
  175.                             break;
  176.                     }
  177.                 } else
  178.                     ++s;
  179.             }
  180.         }
  181. _NEXT_LINE:
  182.         ;
  183.     }
  184.     if ( ret != NORMAL )
  185.         return (ERR);
  186.  
  187.     if ( flgCommon == 0 || flgEle1 == 0 )
  188.         return (ERR);
  189.     if ( common[1] == 1 && flgEle2 ==0 )
  190.         return (ERR);
  191.  
  192.     return (NORMAL);
  193. }
  194.  
  195. int        my_isxdigit(int ch)
  196. {
  197.     if ( ch >= '0' && ch <= '9' )
  198.         return (ch - '0');
  199.     else if ( ch >= 'A' && ch <= 'Z' )
  200.         return (ch - 'A' + 10);
  201.     else if ( ch >= 'a' && ch <= 'z' )
  202.         return (ch - 'a' + 10);
  203.     else
  204.         return (-1);
  205. }
  206.  
  207.