home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / pao / t_os / sound / src / fmb.c < prev    next >
Text File  |  1980-01-02  |  23KB  |  815 lines

  1. /*
  2. **    < High C V1.4  &  386ASM V2.0 >
  3. **
  4. **    FMBファイルで音を出します。
  5. **
  6. **    1990.08.29 : CREATE
  7. **    1990.08.31 : FINISH
  8. **
  9. **    < HISTORY >
  10. **    1990.08.29 : CREATE
  11. **
  12. **    < note > : TABS = 4
  13. **
  14. **    Programed by Y.Hirata ( Nifty ID : NAB03321 )
  15. **
  16. */
  17.  
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include <snd.h>
  22. #include <fmc.h>
  23. #include "fmb.h"
  24.  
  25. #define        SworkSize    16384                        /*  サウンド用作業域サイズ    */
  26. char    Swork[SworkSize];                            /*  サウンド用作業域        */
  27.  
  28. char    Fmbfile[128] ;                                /*  FM 音色ファイル            */
  29.  
  30. #define        FmbSize        6152                        /*  FM 音色データサイズ        */
  31. char    Fmbdata[FmbSize] ;                            /*  FM 音色格納領域        */
  32. char    Fmbflg = FALSE ;                            /*  FM 音色 READ フラグ    */
  33.  
  34. int        Inst1 = 0 ;                                    /*  キーボード上段用        */
  35. int        Inst2 = 0 ;                                    /*  キーボード下段用        */
  36.  
  37. int        Pan1 = 64 ;                                    /*  キーボード上段            */
  38. int        Pan2 = 64 ;                                    /*  キーボード下段            */
  39.  
  40. int        ValNote1 = 0 ;                                /*  キーボード上段音程用    */
  41. int        ValNote2 = 0 ;                                /*  キーボード下段音程用    */
  42.  
  43. /***************************  FMB DATA の読込み  *****************************/
  44. void fmb_load()
  45. {
  46.     FILE *fp;
  47.  
  48.     fp = fopen( Fmbfile,"rb" );
  49.     fread( Fmbdata,1,FmbSize,fp );
  50.     fclose( fp );
  51. }
  52.  
  53. /******************************************************************************
  54.     KEY_test : マトリクスからキーが押されているかどうかをチェックする。
  55. ******************************************************************************/
  56. int        KEY_test( char *matrix, char keyadrs )
  57. /*    *matrix : キーマトリクス情報( 16 バイト )                                        */
  58. /*    keyadrs : キーアドレス                                                        */
  59. {
  60.     unsigned char    testbit ;
  61.     int        c ;
  62.  
  63.     testbit = 0x01 ;
  64.     for ( c=0; c<(keyadrs%8); c++ ) testbit <<= 1 ;
  65.     if ( (matrix[keyadrs/8] & testbit) == testbit ) return( TRUE ) ;
  66.  
  67.     return( 0 ) ;
  68. }
  69.  
  70. /****************************  1つ上の音色に変更  ****************************/
  71. void inst_change_up( int kyb1, int kyb2 )
  72. /*    kyb  : キーボードの上/下段フラグ                                                */
  73. {
  74.     char    matrix[16] ;                            /*  キーマトリクス取得用        */
  75.     char    keyrepflg ;                                /*  キーリピート用フラグ        */
  76.     char    name[9] ;                                /*  FMBインスト名            */
  77.  
  78.     if ( !Fmbflg ) {
  79.         printf("\x1b[33m") ;
  80.         printf("☆☆☆  音色の変更はできません!  ☆☆☆") ;
  81.         printf("\x1b[m\n") ;
  82.         return ;
  83.     }
  84.  
  85.     keyrepflg = FALSE ;                                /*  キーリピートフラグ・クリア        */
  86.     do {
  87.  
  88.         if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) {        /*  キーボード上段    */
  89.             if ( Inst1 == 127 )
  90.                 Inst1 = 0 ;
  91.             else
  92.                 Inst1 ++ ;
  93.             SND_inst_change( 0,Inst1 ) ;
  94.             SND_inst_change( 1,Inst1 ) ;
  95.             SND_inst_change( 2,Inst1 ) ;
  96.             printf("キーボード上段の音色を変更しました。") ;
  97.             printf("(INST:%03d)",Inst1) ;
  98.             strncpy( name,&Fmbdata[8+Inst1*48],8 ) ;
  99.             name[8] = '\0' ;
  100.             printf(" < %s >\n",name) ;
  101.         }
  102.  
  103.         if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) {        /*  キーボード下段    */
  104.             if ( Inst2 == 127 )
  105.                 Inst2 = 0 ;
  106.             else
  107.                 Inst2 ++ ;
  108.             SND_inst_change( 3,Inst2 ) ;
  109.             SND_inst_change( 4,Inst2 ) ;
  110.             SND_inst_change( 5,Inst2 ) ;
  111.             printf("キーボード下段の音色を変更しました。") ;
  112.             printf("(INST:%03d)",Inst2) ;
  113.             strncpy( name,&Fmbdata[8+Inst2*48],8 ) ;
  114.             name[8] = '\0' ;
  115.             printf(" < %s >\n",name) ;
  116.         }
  117.  
  118.         if ( keyrepflg ) {
  119.             SOFT_timer( KEY_repeat ) ;
  120.         } else {
  121.             SOFT_timer( KEY_wait ) ;
  122.             keyrepflg = TRUE ;
  123.         }
  124.  
  125.          KYB_clrbuf() ;                                /*  キーバッファ・クリア            */
  126.         KYB_matrix( matrix ) ;                        /*  キーマトリクス取得            */
  127.  
  128.     } while ( KEY_test( matrix,KEY_UP ) ) ;
  129.  
  130.     printf("\n") ;
  131. }
  132.  
  133. /****************************  1つ下の音色に変更  ****************************/
  134. void inst_change_down( int kyb1, int kyb2 )
  135. /*    kyb  : キーボードの上/下段フラグ                                                */
  136. {
  137.     char    matrix[16] ;                            /*  キーマトリクス取得用        */
  138.     char    keyrepflg ;                                /*  キーリピート用フラグ        */
  139.     char    name[9] ;                                /*  FMBインスト名            */
  140.  
  141.     if ( !Fmbflg ) {
  142.         printf("\x1b[33m") ;
  143.         printf("☆☆☆  音色の変更はできません!  ☆☆☆") ;
  144.         printf("\x1b[m\n") ;
  145.         return ;
  146.     }
  147.  
  148.     keyrepflg = FALSE ;                                /*  キーリピートフラグ・クリア        */
  149.     do {
  150.  
  151.         if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) {        /*  キーボード上段    */
  152.             if ( Inst1 == 0 )
  153.                 Inst1 = 127 ;
  154.             else
  155.                 Inst1 -- ;
  156.             SND_inst_change( 0,Inst1 ) ;
  157.             SND_inst_change( 1,Inst1 ) ;
  158.             SND_inst_change( 2,Inst1 ) ;
  159.             printf("キーボード上段の音色を変更しました。") ;
  160.             printf("(INST:%03d)",Inst1) ;
  161.             strncpy( name,&Fmbdata[8+Inst1*48],8 ) ;
  162.             name[8] = '\0' ;
  163.             printf(" < %s >\n",name) ;
  164.         }
  165.  
  166.         if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) {        /*  キーボード下段    */
  167.             if ( Inst2 == 0 )
  168.                 Inst2 = 127 ;
  169.             else
  170.                 Inst2 -- ;
  171.             SND_inst_change( 3,Inst2 ) ;
  172.             SND_inst_change( 4,Inst2 ) ;
  173.             SND_inst_change( 5,Inst2 ) ;
  174.             printf("キーボード下段の音色を変更しました。") ;
  175.             printf("(INST:%03d)",Inst2) ;
  176.             strncpy( name,&Fmbdata[8+Inst2*48],8 ) ;
  177.             name[8] = '\0' ;
  178.             printf(" < %s >\n",name) ;
  179.         }
  180.  
  181.         if ( keyrepflg ) {
  182.             SOFT_timer( KEY_repeat ) ;
  183.         } else {
  184.             SOFT_timer( KEY_wait ) ;
  185.             keyrepflg = TRUE ;
  186.         }
  187.  
  188.          KYB_clrbuf() ;                                /*  キーバッファ・クリア            */
  189.         KYB_matrix( matrix ) ;                        /*  キーマトリクス取得            */
  190.  
  191.     } while ( KEY_test( matrix,KEY_DOWN ) ) ;
  192.  
  193.     printf("\n") ;
  194. }
  195.  
  196. /***************************  1つ右に音源定位変更  ***************************/
  197. void pan_change_right( int kyb1, int kyb2 )
  198. /*    kyb  : キーボードの上/下段フラグ                                                */
  199. {
  200.     char    matrix[16] ;                            /*  キーマトリクス取得用        */
  201.     char    keyrepflg ;                                /*  キーリピート用フラグ        */
  202.  
  203.     keyrepflg = FALSE ;                                /*  キーリピートフラグ・クリア        */
  204.     do {
  205.  
  206.         if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) {        /*  キーボード上段    */
  207.             if ( Pan1 < 127 ) {
  208.                 if ( Pan1 == 64 ) {
  209.                     Pan1 = 127 ;
  210.                 } else if ( Pan1 == 0 ) {
  211.                     Pan1 = 64 ;
  212.                 }
  213.                 /*  FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない    */
  214.                 SND_pan_set( 0,Pan1 ) ;
  215.                 SND_pan_set( 1,Pan1 ) ;
  216.                 SND_pan_set( 2,Pan1 ) ;
  217.                 if ( Pan1 == 64 ) {
  218.                     printf("\x1b[36m") ;
  219.                     printf("キーボード上段の音源定位を中央に変更しました。  ") ;
  220.                     printf("\x1b[m") ;
  221.                 } else {
  222.                     printf("キーボード上段の音源定位を右端に変更しました。") ;
  223.                 }
  224.                 printf("(PAN:%d)\n",Pan1) ;
  225.             } else {
  226.                 printf("\x1b[33m") ;
  227.                 printf("キーボード上段の音源定位は、右いっぱいです。") ;
  228.                 printf("\x1b[m") ;
  229.                 printf("(PAN:%d)\n",Pan1) ;
  230.             }
  231.         }
  232.  
  233.         if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) {        /*  キーボード下段    */
  234.             if ( Pan2 < 127 ) {
  235.                 if ( Pan2 == 64 ) {
  236.                     Pan2 = 127 ;
  237.                 } else if ( Pan2 == 0 ) {
  238.                     Pan2 = 64 ;
  239.                 }
  240.                 /*  FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない    */
  241.                 SND_pan_set( 3,Pan2 ) ;
  242.                 SND_pan_set( 4,Pan2 ) ;
  243.                 SND_pan_set( 5,Pan2 ) ;
  244.                 if ( Pan2 == 64 ) {
  245.                     printf("\x1b[36m") ;
  246.                     printf("キーボード下段の音源定位を中央に変更しました。  ") ;
  247.                     printf("\x1b[m") ;
  248.                 } else {
  249.                     printf("キーボード下段の音源定位を右端に変更しました。") ;
  250.                 }
  251.                 printf("(PAN:%d)\n",Pan2) ;
  252.             } else {
  253.                 printf("\x1b[33m") ;
  254.                 printf("キーボード下段の音源定位は、右いっぱいです。") ;
  255.                 printf("\x1b[m") ;
  256.                 printf("(PAN:%d)\n",Pan2) ;
  257.             }
  258.         }
  259.  
  260.         if ( keyrepflg ) {
  261.             SOFT_timer( KEY_repeat ) ;
  262.         } else {
  263.             SOFT_timer( KEY_wait ) ;
  264.             keyrepflg = TRUE ;
  265.         }
  266.  
  267.          KYB_clrbuf() ;                                /*  キーバッファ・クリア            */
  268.         KYB_matrix( matrix ) ;                        /*  キーマトリクス取得            */
  269.  
  270.     } while ( KEY_test( matrix,KEY_RIGHT ) ) ;
  271.  
  272.     printf("\n") ;
  273. }
  274.  
  275. /***************************  1つ左に音源定位変更  ***************************/
  276. void pan_change_left( int kyb1, int kyb2 )
  277. /*    kyb  : キーボードの上/下段フラグ                                                */
  278. {
  279.     char    matrix[16] ;                            /*  キーマトリクス取得用        */
  280.     char    keyrepflg ;                                /*  キーリピート用フラグ        */
  281.  
  282.     keyrepflg = FALSE ;                                /*  キーリピートフラグ・クリア        */
  283.     do {
  284.  
  285.         if ( kyb1 == KYB_UPPER || kyb2 == KYB_UPPER ) {        /*  キーボード上段    */
  286.             if ( Pan1 > 0 ) {
  287.                 if ( Pan1 == 127 ) {
  288.                     Pan1 = 64 ;
  289.                 } else if ( Pan1 == 64 ) {
  290.                     Pan1 = 0 ;
  291.                 }
  292.                 /*  FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない    */
  293.                 SND_pan_set( 0,Pan1 ) ;
  294.                 SND_pan_set( 1,Pan1 ) ;
  295.                 SND_pan_set( 2,Pan1 ) ;
  296.                 if ( Pan1 == 64 ) {
  297.                     printf("\x1b[36m") ;
  298.                     printf("キーボード上段の音源定位を中央に変更しました。  ") ;
  299.                     printf("\x1b[m") ;
  300.                 } else {
  301.                     printf("キーボード上段の音源定位を左端に変更しました。") ;
  302.                 }
  303.                 printf("(PAN:%d)\n",Pan1) ;
  304.             } else {
  305.                 printf("\x1b[33m") ;
  306.                 printf("キーボード上段の音源定位は、左いっぱいです。") ;
  307.                 printf("\x1b[m") ;
  308.                 printf("(PAN:%d)\n",Pan1) ;
  309.             }
  310.         }
  311.  
  312.         if ( kyb1 == KYB_LOWER || kyb2 == KYB_LOWER ) {        /*  キーボード下段    */
  313.             if ( Pan2 > 0 ) {
  314.                 if ( Pan2 == 127 ) {
  315.                     Pan2 = 64 ;
  316.                 } else if ( Pan2 == 64 ) {
  317.                     Pan2 = 0 ;
  318.                 }
  319.                 /*  FM 音源の場合 : 0 - 64 - 127 の 3段階しか設定できない    */
  320.                 SND_pan_set( 3,Pan2 ) ;
  321.                 SND_pan_set( 4,Pan2 ) ;
  322.                 SND_pan_set( 5,Pan2 ) ;
  323.                 if ( Pan2 == 64 ) {
  324.                     printf("\x1b[36m") ;
  325.                     printf("キーボード下段の音源定位を中央に変更しました。  ") ;
  326.                     printf("\x1b[m") ;
  327.                 } else {
  328.                     printf("キーボード下段の音源定位を左端に変更しました。") ;
  329.                 }
  330.                 printf("(PAN:%d)\n",Pan2) ;
  331.             } else {
  332.                 printf("\x1b[33m") ;
  333.                 printf("キーボード下段の音源定位は、左いっぱいです。") ;
  334.                 printf("\x1b[m") ;
  335.                 printf("(PAN:%d)\n",Pan2) ;
  336.             }
  337.  
  338.         }
  339.  
  340.         if ( keyrepflg ) {
  341.             SOFT_timer( KEY_repeat ) ;
  342.         } else {
  343.             SOFT_timer( KEY_wait ) ;
  344.             keyrepflg = TRUE ;
  345.         }
  346.  
  347.          KYB_clrbuf() ;                                /*  キーバッファ・クリア            */
  348.         KYB_matrix( matrix ) ;                        /*  キーマトリクス取得            */
  349.  
  350.     } while ( KEY_test( matrix,KEY_LEFT ) ) ;
  351.  
  352.     printf("\n") ;
  353. }
  354.  
  355. /*******************************  初期設定  **********************************/
  356. void init()
  357. {
  358.     char    bankname[8] ;
  359.     char    name[9] ;
  360.     int        ret ;
  361.  
  362.     printf("\nキーボードを操作すると、FMB ファイルの音色で演奏できます♪\n") ;
  363.  
  364.     printf("\n6重和音まで対応しています♪\n") ;
  365.     printf("カーソルキーの上下で音色を変更できます♪") ;
  366.     printf(" ( SHIFT+ で上段のみ, CTRL+ で下段のみ )\n") ;
  367.     printf("カーソルキーの右左で定位を変更できます♪") ;
  368.     printf(" ( SHIFT+ で上段のみ, CTRL+ で下段のみ )\n") ;
  369.     printf("PFキーで、音程を変更できます♪ ( PF1 ~ PF9 : PF5 が標準 )\n") ;
  370.     printf("終了は、") ;
  371.     printf("\x1b[36mBREAKキー\x1b[m") ;
  372.     printf(" です!\n") ;
  373.  
  374.     SND_init( Swork ) ;                                /*  サウンド初期化            */
  375.  
  376.     ret = SND_fm_bank_load( Fmbfile,bankname ) ;    /*  FMバンクロード            */
  377.     switch ( ret ) {
  378.         case 0 :
  379.             printf("\nFM 音源の音色は、") ;
  380.             printf("\x1b[36m%s \x1b[m",Fmbfile) ;
  381.             printf("のデータを使用します。\n") ;
  382.             fmb_load() ;
  383.             Fmbflg = TRUE ;
  384.             break ;
  385.         case 1 :
  386.             printf("\nFMBファイル") ;
  387.             printf(" < \x1b[33m%s\x1b[m > ",Fmbfile) ;
  388.             printf("が見つかりません!\n") ;
  389.             printf("\x1b[33m") ;
  390.             printf("☆☆☆  音色の変更はできません!  ☆☆☆") ;
  391.             printf("\x1b[m\n") ;
  392.             break ;
  393.         case 2 :
  394.             printf("\nFMBファイル") ;
  395.             printf(" < \x1b[33m%s\x1b[m > ",Fmbfile) ;
  396.             printf("の読み込みに失敗しました!\n") ;
  397.             printf("\x1b[33m") ;
  398.             printf("☆☆☆  音色の変更はできません!  ☆☆☆") ;
  399.             printf("\x1b[m\n") ;
  400.             break ;
  401.         default :
  402.             printf("\n\x1b[31m") ;
  403.             printf("ERROR \x1b[m: SND_fm_bank_load = %d\n",ret) ;
  404.     }
  405.     printf("\n") ;
  406.  
  407. /*
  408. **    FM 各チャンネルの音色を初期設定する
  409. */
  410.     SND_inst_change( 0,0 ) ;
  411.     SND_inst_change( 1,0 ) ;
  412.     SND_inst_change( 2,0 ) ;
  413.     SND_inst_change( 3,0 ) ;
  414.     SND_inst_change( 4,0 ) ;
  415.     SND_inst_change( 5,0 ) ;
  416.  
  417.     SND_elevol_mute( 0x0002 ) ;                        /*  FM 音源のみミュート解除    */
  418.     SND_elevol_all_mute( -1 ) ;                        /*  全ミュートの解除        */
  419.  
  420.     KYB_clic( 1 ) ;                                    /*  キークリック音なし        */
  421.  
  422.     if ( Fmbflg ) {
  423.         printf("キーボード上段の音色は、") ;
  424.         strncpy( name,&Fmbdata[8],8 ) ;
  425.         name[8] = '\0' ;
  426.         printf(" < %s > ",name) ;
  427.         printf("(INST:000) です♪\n") ;
  428.         printf("キーボード下段の音色は、") ;
  429.         strncpy( name,&Fmbdata[8],8 ) ;
  430.         name[8] = '\0' ;
  431.         printf(" < %s > ",name) ;
  432.         printf("(INST:000) です♪\n") ;
  433.     }
  434.     printf("\n'\x1b[36mド\x1b[m' (C=60) の位置は、") ;
  435.     printf("\x1b[36mW\x1b[m と \x1b[36m>\x1b[m です♪\n") ;
  436.     printf("\n") ;
  437.  
  438. }
  439.  
  440. /*************************  キーボード操作による音制御  *************************/
  441. void key_play( char *matrix, char keyadrs )
  442. /*    *matrix : キーマトリクス情報( 16 バイト )                                        */
  443. /*    keyadrs : キーアドレス                                                        */
  444. {
  445.     /*  FM のチャンネルは 0 ~ 5    */
  446.     static int    chan1=0 ;                            /*  キーボード上段のチャンネル    */
  447.     static int    chan2=3 ;                            /*  キーボード下段のチャンネル    */
  448.     static int    channel[128] ;                        /*  各キーでのON時FMチャンネル    */
  449.     static char    keymake[128] = {                    /*  キー MAKE 状態か?    */
  450.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  451.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  452.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  453.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  454.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  455.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  456.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  457.                             0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  458.                                 } ;
  459.     int        ret ;
  460.  
  461.     if ( chan1 > 2 ) chan1 = 0 ;
  462.     if ( chan2 > 5 ) chan2 = 3 ;
  463.  
  464.     if ( Key_inf[keyadrs] == KYB_UPPER ) {            /*  キーボード 上段        */
  465.         if ( KEY_test( matrix,keyadrs ) ) {            /*  キー MAKE                */
  466.             if ( !keymake[keyadrs] ) {                /*  キー BREAK -> MAKE    */
  467.                 SND_key_off( chan1 ) ;
  468.                 ret = SND_key_on( chan1,Key_note[keyadrs]+ValNote1,127 ) ;
  469.                 if ( ret ) {
  470.                     if ( Key_note[keyadrs]+ValNote1 > 60 ) {
  471.                         printf("音が高すぎて発音できません。(NOTE=%d)\n",
  472.                             Key_note[keyadrs]+ValNote1) ;
  473.                     } else {
  474.                         printf("音が低すぎて発音できません。(NOTE=%d)\n",
  475.                             Key_note[keyadrs]+ValNote1) ;
  476.                     }
  477.                 } else {
  478.                     channel[keyadrs] = chan1 ;
  479.                     chan1 ++ ;
  480.                     keymake[keyadrs] = TRUE ;
  481.                 }
  482.             }
  483.         } else if ( keymake[keyadrs] ) {        /*  キー BREAK        */
  484.             SND_key_off( channel[keyadrs] ) ;
  485.             keymake[keyadrs] = FALSE ;
  486.         }
  487.     } else if ( Key_inf[keyadrs] == KYB_LOWER ) {    /*  キーボード 下段        */
  488.         if ( KEY_test( matrix,keyadrs ) ) {            /*  キー MAKE                */
  489.             if ( !keymake[keyadrs] ) {                /*  キー BREAK -> MAKE    */
  490.                 SND_key_off( chan2 ) ;
  491.                 ret = SND_key_on( chan2,Key_note[keyadrs]+ValNote2,127 ) ;
  492.                 if ( ret ) {
  493.                     if ( Key_note[keyadrs]+ValNote2 > 60 ) {
  494.                         printf("音が高すぎて発音できません。(NOTE=%d)\n",
  495.                             Key_note[keyadrs]+ValNote2) ;
  496.                     } else {
  497.                         printf("音が低すぎて発音できません。(NOTE=%d)\n",
  498.                             Key_note[keyadrs]+ValNote2) ;
  499.                     }
  500.                 } else {
  501.                     channel[keyadrs] = chan2 ;
  502.                     chan2 ++ ;
  503.                     keymake[keyadrs] = TRUE ;
  504.                 }
  505.             }
  506.         } else if ( keymake[keyadrs] ) {        /*  キー BREAK        */
  507.             SND_key_off( channel[keyadrs] ) ;
  508.             keymake[keyadrs] = FALSE ;
  509.         }
  510.     }
  511.  
  512. }
  513.  
  514. /*******************************  音程の変更  ********************************/
  515. void note_change( char *matrix )
  516. /*    *matrix : キーマトリクス情報( 16 バイト )                                        */
  517. {
  518.     if ( KEY_test( matrix,KEY_PF1 ) ) {
  519.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  520.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  521.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  522.             ValNote1 = -48 ;
  523.             printf("キーボード上段の音程を標準より4つ下げました。(C=12)\n") ;
  524.         }
  525.  
  526.         if ( KEY_test( matrix,KEY_CTRL ) ||
  527.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  528.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  529.             ValNote2 = -48 ;
  530.             printf("キーボード下段の音程を標準より4つ下げました。(C=12)\n") ;
  531.         }
  532.  
  533.         printf("\n") ;
  534.  
  535.     } else if ( KEY_test( matrix,KEY_PF2 ) ) {
  536.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  537.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  538.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  539.             ValNote1 = -36 ;
  540.             printf("キーボード上段の音程を標準より3つ下げました。(C=24)\n") ;
  541.         }
  542.  
  543.         if ( KEY_test( matrix,KEY_CTRL ) ||
  544.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  545.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  546.             ValNote2 = -36 ;
  547.             printf("キーボード下段の音程を標準より3つ下げました。(C=24)\n") ;
  548.         }
  549.  
  550.         printf("\n") ;
  551.  
  552.     } else if ( KEY_test( matrix,KEY_PF3 ) ) {
  553.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  554.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  555.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  556.             ValNote1 = -24 ;
  557.             printf("キーボード上段の音程を標準より2つ下げました。(C=36)\n") ;
  558.         }
  559.  
  560.         if ( KEY_test( matrix,KEY_CTRL ) ||
  561.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  562.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  563.             ValNote2 = -24 ;
  564.             printf("キーボード下段の音程を標準より2つ下げました。(C=36)\n") ;
  565.         }
  566.  
  567.         printf("\n") ;
  568.  
  569.     } else if ( KEY_test( matrix,KEY_PF4 ) ) {
  570.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  571.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  572.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  573.             ValNote1 = -12 ;
  574.             printf("キーボード上段の音程を標準より1つ下げました。(C=48)\n") ;
  575.         }
  576.  
  577.         if ( KEY_test( matrix,KEY_CTRL ) ||
  578.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  579.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  580.             ValNote2 = -12 ;
  581.             printf("キーボード下段の音程を標準より1つ下げました。(C=48)\n") ;
  582.         }
  583.  
  584.         printf("\n") ;
  585.  
  586.     } else if ( KEY_test( matrix,KEY_PF5 ) ) {
  587.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  588.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  589.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  590.             ValNote1 = 0 ;
  591.             printf("\x1b[36m") ; 
  592.             printf("キーボード上段の音程を標準にしました♪\x1b[m(C=60)\n") ;
  593.         }
  594.  
  595.         if ( KEY_test( matrix,KEY_CTRL ) ||
  596.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  597.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  598.             ValNote2 = 0 ;
  599.             printf("\x1b[36m") ; 
  600.             printf("キーボード下段の音程を標準にしました♪\x1b[m(C=60)\n") ;
  601.         }
  602.  
  603.         printf("\n") ;
  604.  
  605.     } else if ( KEY_test( matrix,KEY_PF6 ) ) {
  606.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  607.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  608.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  609.             ValNote1 = 12 ;
  610.             printf("キーボード上段の音程を標準より1つ上げました。(C=72)\n") ;
  611.         }
  612.  
  613.         if ( KEY_test( matrix,KEY_CTRL ) ||
  614.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  615.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  616.             ValNote2 = 12 ;
  617.             printf("キーボード下段の音程を標準より1つ上げました。(C=72)\n") ;
  618.         }
  619.  
  620.         printf("\n") ;
  621.  
  622.     } else if ( KEY_test( matrix,KEY_PF7 ) ) {
  623.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  624.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  625.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  626.             ValNote1 = 24 ;
  627.             printf("キーボード上段の音程を標準より2つ上げました。(C=84)\n") ;
  628.         }
  629.  
  630.         if ( KEY_test( matrix,KEY_CTRL ) ||
  631.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  632.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  633.             ValNote2 = 24 ;
  634.             printf("キーボード下段の音程を標準より2つ上げました。(C=84)\n") ;
  635.         }
  636.  
  637.         printf("\n") ;
  638.  
  639.     } else if ( KEY_test( matrix,KEY_PF8 ) ) {
  640.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  641.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  642.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  643.             ValNote1 = 36 ;
  644.             printf("キーボード上段の音程を標準より3つ上げました。(C=96)\n") ;
  645.         }
  646.  
  647.         if ( KEY_test( matrix,KEY_CTRL ) ||
  648.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  649.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  650.             ValNote2 = 36 ;
  651.             printf("キーボード下段の音程を標準より3つ上げました。(C=96)\n") ;
  652.         }
  653.  
  654.         printf("\n") ;
  655.  
  656.     } else if ( KEY_test( matrix,KEY_PF9 ) ) {
  657.         if ( KEY_test( matrix,KEY_SHIFT ) ||
  658.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  659.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  660.             ValNote1 = 48 ;
  661.             printf("キーボード上段の音程を標準より4つ上げました。(C=108)\n") ;
  662.         }
  663.  
  664.         if ( KEY_test( matrix,KEY_CTRL ) ||
  665.             ( !KEY_test( matrix,KEY_SHIFT ) &&
  666.                  !KEY_test( matrix,KEY_CTRL ) ) ) {
  667.             ValNote2 = 48 ;
  668.             printf("キーボード下段の音程を標準より4つ上げました。(C=108)\n") ;
  669.         }
  670.  
  671.         printf("\n") ;
  672.  
  673.     }
  674.  
  675. }
  676.  
  677. /********************************  プレイ開始  *********************************/
  678. void play_start()
  679. {
  680.     char    matrix[16] ;                            /*  キーマトリクス取得用        */
  681.     int        c ;
  682.  
  683. /*
  684. **    キー操作開始
  685. */
  686.     do {
  687.  
  688.          KYB_clrbuf() ;                                /*  キーバッファ・クリア            */
  689.         KYB_matrix( matrix ) ;                        /*  キーマトリクス取得            */
  690.  
  691. /*
  692. **    音色の変更( 1つ上の音色 )
  693. */
  694.         if ( KEY_test( matrix,KEY_UP ) ) {
  695.         
  696.             if ( KEY_test( matrix,KEY_SHIFT ) ) {            /*  キーボード上段    */
  697.                 inst_change_up( KYB_UPPER,KYB_DUMMY ) ;
  698.             }
  699.             if ( KEY_test( matrix,KEY_CTRL ) ) {            /*  キーボード下段    */
  700.                 inst_change_up( KYB_DUMMY,KYB_LOWER ) ;
  701.             }
  702.             if ( !KEY_test( matrix,KEY_SHIFT ) &&
  703.                     !KEY_test( matrix,KEY_CTRL ) ) {        /*  上下段とも    */
  704.                 inst_change_up( KYB_UPPER,KYB_LOWER ) ;
  705.             }
  706.  
  707. /*
  708. **    音色の変更( 1つ下の音色 )
  709. */
  710.         } else if ( KEY_test( matrix,KEY_DOWN ) ) {
  711.  
  712.             if ( KEY_test( matrix,KEY_SHIFT ) ) {            /*  キーボード上段    */
  713.                 inst_change_down( KYB_UPPER,KYB_DUMMY ) ;
  714.             }
  715.             if ( KEY_test( matrix,KEY_CTRL ) ) {            /*  キーボード下段    */
  716.                 inst_change_down( KYB_DUMMY,KYB_LOWER ) ;
  717.             }
  718.             if ( !KEY_test( matrix,KEY_SHIFT ) &&
  719.                     !KEY_test( matrix,KEY_CTRL ) ) {        /*  上下段とも    */
  720.                 inst_change_down( KYB_UPPER,KYB_LOWER ) ;
  721.             }
  722.  
  723. /*
  724. **    定位の変更( 1つ右の定位 )
  725. */
  726.         } else if ( KEY_test( matrix,KEY_RIGHT ) ) {
  727.  
  728.             if ( KEY_test( matrix,KEY_SHIFT ) ) {            /*  キーボード上段    */
  729.                 pan_change_right( KYB_UPPER,KYB_DUMMY ) ;
  730.             }
  731.             if ( KEY_test( matrix,KEY_CTRL ) ) {            /*  キーボード下段    */
  732.                 pan_change_right( KYB_DUMMY,KYB_LOWER ) ;
  733.             }
  734.             if ( !KEY_test( matrix,KEY_SHIFT ) &&
  735.                     !KEY_test( matrix,KEY_CTRL ) ) {        /*  上下段とも    */
  736.                 pan_change_right( KYB_UPPER,KYB_LOWER ) ;
  737.             }
  738.  
  739. /*
  740. **    定位の変更( 1つ左の定位 )
  741. */
  742.         } else if ( KEY_test( matrix,KEY_LEFT ) ) {
  743.  
  744.             if ( KEY_test( matrix,KEY_SHIFT ) ) {            /*  キーボード上段    */
  745.                 pan_change_left( KYB_UPPER,KYB_DUMMY ) ;
  746.             }
  747.             if ( KEY_test( matrix,KEY_CTRL ) ) {            /*  キーボード下段    */
  748.                 pan_change_left( KYB_DUMMY,KYB_LOWER ) ;
  749.             }
  750.             if ( !KEY_test( matrix,KEY_SHIFT ) &&
  751.                     !KEY_test( matrix,KEY_CTRL ) ) {        /*  上下段とも    */
  752.                 pan_change_left( KYB_UPPER,KYB_LOWER ) ;
  753.             }
  754.  
  755. /*
  756. **    キーボード操作で音を出す
  757. */
  758.         } else {
  759.             note_change( matrix ) ;                        /*  音程の変更チェック    */
  760.  
  761.             for ( c=0; c<NKYBINF; c++ ) {
  762.                 key_play( matrix,c ) ;
  763.             }
  764.  
  765.         }
  766.  
  767.     } while ( !KEY_test( matrix,KEY_BREAK ) ) ;    /*  BREAKキーが押されるまで    */
  768.  
  769. }
  770.  
  771. /*********************************  メイン  **********************************/
  772. void main( int ac, char *av[] )
  773. {
  774.     int        endp ;
  775.  
  776.     printf("FMB.EXP  v0.50  (c) パオパオ 1990.            ") ;
  777.     printf("<< Copyright (C) Y.Hirata 1990. >>\n") ;
  778.  
  779.     if ( ac > 1 ) {                                    /*  引数あり            */
  780.         strcpy( Fmbfile,av[1] ) ;
  781.         endp = strlen( Fmbfile ) ;
  782.         if ( strchr( Fmbfile,'.' ) == NULL ) {        /*  ファイル拡張子なし        */
  783.             strcat( Fmbfile,".FMB" ) ;
  784.         } else {
  785.             if ( strcmp( Fmbfile+endp-4,".FMB" ) &&
  786.                     strcmp( Fmbfile+endp-4,".fmb" ) ) {
  787.                 printf("\x1b[31mERROR\x1b[m : FILE NAME ( %s ) - ",Fmbfile) ;
  788.                 printf(".FMB ファイル しか指定できません!\n") ;
  789.                 exit( 1 ) ;
  790.             }
  791.         }
  792.     } else {                                        /*  引数なし            */
  793.         strcpy( Fmbfile,FMB_FILE ) ;
  794.     }
  795.  
  796.     INT23_init() ;                                    /*  ^C マスク設定            */
  797.  
  798.     init() ;                                        /*  各種初期設定        */
  799.  
  800.     play_start() ;                                    /*  プレイ開始            */
  801.  
  802. close:
  803.  
  804.     KYB_clic( 0 ) ;                                    /*  キークリック音あり        */
  805.      KYB_clrbuf() ;                                    /*  キーバッファ・クリア            */
  806.  
  807.     SND_end() ;                                        /*  サウンド終了            */
  808.  
  809.     INT23_end() ;                                    /*  ^C マスク解除            */
  810.  
  811.     printf("\nプログラムを終了します。\n") ;
  812.  
  813. }
  814.  
  815.