home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / taropyon / he386 / ccisrc / gs.c < prev    next >
Text File  |  1995-06-20  |  11KB  |  414 lines

  1. /*************************************************************************
  2. *    GS音源制御
  3. *************************************************************************/
  4.  
  5. #define    MODEL_ID_SC55    (0x45)
  6. #define    MODEL_ID_GS        (0x42)
  7.  
  8. int        GsDeviceID = 16;
  9.  
  10. char    *GsFuncTbl[32] =
  11. {
  12.     "GS_setDeviceNumber" , 
  13.     "sysEx_gs"           , 
  14.     "sysEx_sc55"         , 
  15.  
  16.     "exGs_reset"         , 
  17.     "exGs_masterVolume"  , 
  18.     "exGs_partialReserve", 
  19.     "exGs_reverbMacro"   , 
  20.     "exGs_reverbPara"    , 
  21.     "exGs_chorusMacro"   , 
  22.     "exGs_chorusPara"    , 
  23.  
  24.     "exGs_rxChannel"     , 
  25.     "exGs_assignMode"    , 
  26.     "exGs_rymMap"        , 
  27.  
  28.     "exGs_mod"           , 
  29.     "exGs_bend"          , 
  30.     "exGs_caf"           , 
  31.     "exGs_paf"           , 
  32.     "exGs_cc1number"     , 
  33.     "exGs_cc2number"     , 
  34.     "exGs_cc1control"    , 
  35.     "exGs_cc2control"    , 
  36.  
  37.     "exSC55_msgSet"      , 
  38.     "exSC55_dotSet"      , 
  39.     "SC55_initDotBuffer" , 
  40.     "SC55_setDotBuffer"  , 
  41.     "exSC55_dotBuffer"   , 
  42.  
  43.     NULL
  44. };
  45.  
  46. int        GS_macroInit( char *sqr )
  47. {
  48.     int            i;
  49.  
  50.     GsDeviceID = 17 - 1;
  51.     for ( i = 0; GsFuncTbl[i] != NULL; ++i )
  52.         MMac_extDefine( sqr, GsFuncTbl[i], GsFuncTbl[i], MMAC_ATT_EXT, NULL );
  53.     MMac_extDefine( sqr, "_GS_MACRO_DEFINED", "", MMAC_ATT_NORMAL , NULL );
  54.     return (NORMAL);
  55. }
  56.  
  57. /*************************************************************************
  58. *    デバイス番号の設定
  59. *-------------------------------------------------------------------------
  60. *    GS_setDeviceNumber(n)
  61. *    n    …    1~32
  62. *************************************************************************/
  63.  
  64. int        GS_setDeviceNumber( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  65. {
  66.     int        n;
  67.  
  68.     if ( argc < 1 )
  69.     {
  70. _ERR:    MM_setErrMsg(sqr,"[GS] device number error!");
  71.         return (ERR);
  72.     }
  73.     n = atoi(argv[0]) - 1;
  74.     if ( n < 1 || n > 32 )
  75.         goto _ERR;
  76.     GsDeviceID = n - 1;
  77.     return (0);
  78. }
  79.  
  80. /*************************************************************************
  81. *    ローランドのエクスクルーシブメッセージを生成する
  82. *************************************************************************/
  83.  
  84. int        roland_excl( UCHAR *buf, int deviceID, int modelID, UINT adr, size_t siz, UCHAR *dat )
  85. {
  86.     int        i, sum;
  87.  
  88.     buf[0] = 0xF0;
  89.     buf[1] = 0x41;        /* maker ID   */
  90.     buf[2] = deviceID;    /* device ID  */
  91.     buf[3] = modelID;    /* model ID   */
  92.     buf[4] = 0x12;        /* command ID */
  93.     buf[5] = (adr>>16);    buf[6] = (adr>>8);    buf[7] = (adr);
  94.     sum = buf[5] + buf[6] + buf[7];
  95.     for ( i = 0; i < siz; ++i )
  96.     {
  97.         buf[8+i] = dat[i];
  98.         sum += dat[i];
  99.     }
  100.     sum = (0x80 - (sum & 0x7F)) & 0x7F;
  101.     buf[8+siz] = sum;
  102.     buf[9+siz] = 0xF7;
  103.  
  104.     return (siz + 10);
  105. }
  106.  
  107. int        gs_genMML( char *sqr, size_t bufSiz, char *buf, size_t adr, size_t siz, char *dat)
  108. {
  109.     int        ret;
  110.     char    excl[256], tmp[1024];
  111.  
  112.     ret = roland_excl( excl, GsDeviceID, MODEL_ID_GS, adr, siz, dat );
  113.     ret = make_sysEx( tmp, ret, excl );
  114.     if ( ret >= bufSiz )
  115.     {
  116.         MM_setErrMsg(sqr,_OUT_OF_STRING_SPACE);
  117.         return (ERR);
  118.     }
  119.     memcpy( buf, tmp, ret );
  120.     return (ret);
  121. }
  122.  
  123. int        sc55_genMML( char *sqr, size_t bufSiz, char *buf, size_t adr, size_t siz, char *dat)
  124. {
  125.     int        ret;
  126.     char    excl[256], tmp[1024];
  127.  
  128.     ret = roland_excl( excl, GsDeviceID, MODEL_ID_SC55, adr, siz, dat );
  129.     ret = make_sysEx( tmp, ret, excl );
  130.     if ( ret >= bufSiz )
  131.     {
  132.         MM_setErrMsg(sqr,_OUT_OF_STRING_SPACE);
  133.         return (ERR);
  134.     }
  135.     memcpy( buf, tmp, ret );
  136.     return (ret);
  137. }
  138.  
  139.  
  140. /*************************************************************************
  141. *    GSのエクスクルーシブメッセージMML を生成する
  142. *-------------------------------------------------------------------------
  143. *    (<adr(hex)>,<siz>,<p1>,...<pn>
  144. *************************************************************************/
  145.  
  146. int        sysEx_gs( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  147. {
  148.     char    dat[128];
  149.     UINT    adr, siz;
  150.     int        i, ret;
  151.  
  152.     if ( argc < 3 )
  153.     {
  154.         MM_setErrMsg(sqr,"GS system exclusive error!");
  155.         return (ERR);
  156.     }
  157.     sscanf(argv[0],"%x",&adr);
  158.     siz = atoi(argv[1]);
  159.     if ( siz < 1 || argc < 2 + siz )
  160.         return (ERR);
  161.     for ( i = 0; i < siz; ++i )
  162.         dat[i] = atoi(argv[2+i]);
  163.  
  164.     return gs_genMML( sqr, bufSiz, buf, adr, siz, dat );
  165. }
  166.  
  167. /*************************************************************************
  168. *    SC55のエクスクルーシブメッセージMML を生成する
  169. *-------------------------------------------------------------------------
  170. *    (<adr(hex)>,<siz>,<p1>,...<pn>
  171. *************************************************************************/
  172.  
  173. int        sysEx_sc55( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  174. {
  175.     char    dat[128];
  176.     UINT    adr, siz;
  177.     int        i, ret;
  178.  
  179.     if ( argc < 3 )
  180.     {
  181.         MM_setErrMsg(sqr,"SC-55 system exclusive error!");
  182.         return (ERR);
  183.     }
  184.     sscanf(argv[0],"%x",&adr);
  185.     siz = atoi(argv[1]);
  186.     if ( siz < 1 || argc < 2 + siz )
  187.         return (ERR);
  188.     for ( i = 0; i < siz; ++i )
  189.         dat[i] = atoi(argv[2+i]);
  190.  
  191.     return sc55_genMML( sqr, bufSiz, buf, adr, siz, dat );
  192. }
  193.  
  194. /*************************************************************************
  195. *    GS音源の初期化
  196. *************************************************************************/
  197.  
  198. int        exGs_reset( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  199. {
  200.     char    dat[4];
  201.     int        ret;
  202.  
  203.     if ( argc != 0 )
  204.     {
  205.         MM_setErrMsg(sqr,"[GS] \"reset\" error!");
  206.         return(ERR);
  207.     }
  208.     dat[0] = 0x00;
  209.     return gs_genMML( sqr, bufSiz, buf, 0x40007F, 1, dat );
  210. }
  211.  
  212.  
  213. /*************************************************************************
  214. *    マスターボリューム
  215. *-------------------------------------------------------------------------
  216. *    (<vol>)
  217. *************************************************************************/
  218.  
  219. int        exGs_masterVolume( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  220. {
  221.     char    dat[4];
  222.     int        ret;
  223.  
  224.     if ( argc != 1 )
  225.     {
  226.         MM_setErrMsg(sqr,"[GS] Master volume error!");
  227.         return(ERR);
  228.     }
  229.  
  230.     dat[0] = atoi(argv[0]);
  231.     return gs_genMML( sqr, bufSiz, buf, 0x400004, 1, dat );
  232. }
  233.  
  234. /*************************************************************************
  235. *    パーシャルリザーブ
  236. *-------------------------------------------------------------------------
  237. *    (<p10>,<p1>,<p2>,<p3>,<p4>,<p5>,<p6>,<p7>,<p8>,<p9>,<p11>,..<p16>)
  238. *************************************************************************/
  239.  
  240. int        exGs_partialReserve( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  241. {
  242.     int        i;
  243.     char    dat[32];
  244.     int        ret;
  245.  
  246.     if ( argc != 16 )
  247.     {
  248.         MM_setErrMsg(sqr,"[GS] Partial reserve error!");
  249.         return(ERR);
  250.     }
  251.  
  252.     for ( i = 0; i < 16; ++i )
  253.         dat[i] = atoi(argv[i]);
  254.     return gs_genMML( sqr, bufSiz, buf, 0x400110, 16, dat );
  255. }
  256.  
  257. /*************************************************************************
  258. *    リバーブマクロ
  259. *-------------------------------------------------------------------------
  260. *    (<typ>)
  261. *************************************************************************/
  262.  
  263. int        exGs_reverbMacro( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  264. {
  265.     char    dat[4];
  266.     int        ret;
  267.  
  268.     if ( argc != 1 )
  269.     {
  270.         MM_setErrMsg(sqr,"[GS] Reverb macro error!");
  271.         return(ERR);
  272.     }
  273.  
  274.     dat[0] = atoi(argv[0]);
  275.     return gs_genMML( sqr, bufSiz, buf, 0x400130, 1, dat );
  276. }
  277.  
  278. /*************************************************************************
  279. *    リバーブパラメータ
  280. *-------------------------------------------------------------------------
  281. *    (<charactor>,<pre-lpf>,<level>,<time>,<delay feedback>,<send to chorus>)
  282. *************************************************************************/
  283.  
  284. int        exGs_reverbPara( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  285. {
  286.     int        i;
  287.     char    dat[8];
  288.     int        ret;
  289.  
  290.     if ( argc != 6 )
  291.     {
  292.         MM_setErrMsg(sqr,"[GS] Reverb parameter error!");
  293.         return(ERR);
  294.     }
  295.  
  296.     for ( i = 0; i < 6; ++i )
  297.         dat[i] = atoi(argv[i]);
  298.     return gs_genMML( sqr, bufSiz, buf, 0x400131, 6, dat );
  299. }
  300.  
  301. /*************************************************************************
  302. *    コーラスマクロ
  303. *-------------------------------------------------------------------------
  304. *    (<typ>)
  305. *************************************************************************/
  306.  
  307. int        exGs_chorusMacro( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  308. {
  309.     char    dat[4];
  310.     int        ret;
  311.  
  312.     if ( argc != 1 )
  313.     {
  314.         MM_setErrMsg(sqr,"[GS] Chorus macro error!");
  315.         return(ERR);
  316.     }
  317.  
  318.     dat[0] = atoi(argv[0]);
  319.     return gs_genMML( sqr, bufSiz, buf, 0x400138, 1, dat );
  320. }
  321.  
  322. /*************************************************************************
  323. *    コーラスパラメータ
  324. *-------------------------------------------------------------------------
  325. *    (<pre-lpf>,<level>,<feedback>,<delay>,<rate>,<depth>,<send to reverb>)
  326. *************************************************************************/
  327.  
  328. int        exGs_chorusPara( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  329. {
  330.     int        i;
  331.     char    dat[8];
  332.     int        ret;
  333.  
  334.     if ( argc != 7 )
  335.     {
  336.         MM_setErrMsg(sqr,"[GS] Chorus parameter error!");
  337.         return(ERR);
  338.     }
  339.  
  340.     for ( i = 0; i < 7; ++i )
  341.         dat[i] = atoi(argv[i]);
  342.     return gs_genMML( sqr, bufSiz, buf, 0x400139, 7, dat );
  343. }
  344.  
  345. int        GsPartTbl[16] = {1,2,3,4,5,6,7,8,9,0,10,11,12,13,14,15};
  346.  
  347. int        gs_getpart_n( int part )
  348. {
  349.     if ( part < 1 || part > 16 )
  350.         return (-1);
  351.     return (GsPartTbl[part-1]);
  352. }
  353. #define    GS_PARTADR(_part,_adr)    ((_adr)+((_part)<<8))
  354.  
  355. /*************************************************************************
  356. *    MIDIチャンネル
  357. *-------------------------------------------------------------------------
  358. *    (<part>,<ch>)
  359. *************************************************************************/
  360.  
  361. int        exGs_rxChannel( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  362. {
  363.     int        i, part, ch;
  364.     char    dat[4];
  365.     int        ret;
  366.  
  367.     if ( argc != 2 )
  368.     {
  369. _PARA_ERR:
  370.         MM_setErrMsg(sqr,"[GS] 'Rx.channel' error!");
  371.         return(ERR);
  372.     }
  373.  
  374.     if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
  375.         goto _PARA_ERR;
  376.     ch = atoi(argv[1]);
  377.     if ( ch < 0 || ch > 16 )
  378.         goto _PARA_ERR;
  379.     if ( ch > 0 )
  380.         --ch;
  381.     else
  382.         ch = 0;    /* OFF */
  383.     dat[0] = ch;
  384.     return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x401002), 1, dat );
  385. }
  386.  
  387. /*************************************************************************
  388. *    アサインモード
  389. *-------------------------------------------------------------------------
  390. *    (<part>,<mode>)
  391. *************************************************************************/
  392.  
  393. int        exGs_assignMode( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
  394. {
  395.     int        i, part;
  396.     char    dat[4];
  397.     int        ret;
  398.  
  399.     if ( argc != 2 )
  400.     {
  401. _PARA_ERR:
  402.         MM_setErrMsg(sqr,"[GS] 'Assign mode' error!");
  403.         return(ERR);
  404.     }
  405.  
  406.     if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
  407.         goto _PARA_ERR;
  408.     dat[0] = atoi(argv[1]);
  409.     return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x401014), 1, dat );
  410. }
  411.  
  412. #include    "gs_cc.c"
  413. #include    "gs_drum.c"
  414.