1989年開業 技術士 佐伯英子(情報工学部門) 文部科学省登録番号 第22082号 日本技術士会会員 東大阪商工会議所会員

≫サンプルプログラム一覧 

オープンソース/C言語サンプルプログラム キーボードピアノ(Beep音)

●キーボードを押すとBeep音が鳴ります。
●各キーにはちがう音が割り当てられているので、曲を演奏することができます。
●画面にキーの配列と対応する音を、ピアノのAA風に表示します。
●Beep音は音源が1つなので、和音の演奏はできません。
●キーを押し続けるとキーボードバッファに情報がたまります。
 たまった数だけ順次Beep音が200ミリ秒鳴ると、演奏に支障が出るので、
 同じキーが押し続けられているときはBeep音を鳴らさないようにしています。

        ≫ソースファイルのダウンロード: piano02.c

【練習問題】
●Beep音を鳴らす時間を変更して、キー
 タッチがどのように変わるか調べてみ
 よう。
●プログラム中のswitch文の最後の部分
   default : Hz= 0;
 をなくすとどうなるか考察しなさい。
●実際に試してみて考察が正しいか確認
 しなさい。
 ※行の前に//を付けてコメントにする

/*******************************/
/*  キーボードピアノ(Beep音) */
/*******************************/
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

void  main( )
{
  int   n,nO=-1;   // キー番号
  int   Hz;        // Beep音周波数

    system("cls");                        // 画面消去

    printf(" \n");
    printf(" |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
    printf(" |                 キーボードピアノ(Beep音)                  |\n");
    printf(" |          ※Shiftキーを押すと1オクターブ上がります          |\n");
    printf(" |          ※長押しはできません                               |\n");
    printf(" |                                                             |\n");
    printf(" *:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*~*:._.:*\n");
    printf("  |                                                           | \n");
    printf("  |----,----,----,----,----,----,----,----,----,----,----,----| \n");
    printf("  |ソ#|ラ#|    |ド#|レ#|    |ファ#|ソ#|ラ#|    |ド#|レ#| \n");
    printf("  | A | S | D | F | G | H | J | K | L | ; | : | ] | \n");
    printf("  '----'----'----'----'----'----'----'----'----'----'----'----' \n");
    printf("    | ラ | シ | ド | レ | ミ | ファ | ソ | ラ | シ | ド | レ |    \n");
    printf("    | Z | X | C | V | B | N | M | , | . | / | \ |    \n");
    printf("    '----'----'----'----'----'----'----'----'----'----'----'    \n");

    while ( 1 )
      {
        if ( kbhit( )==0 )               // キーが押されてない
          { n=-1; continue; }            // キー番号を無効にする

        nO=n;                            // 前のキー番号保存
        n=getch( );                      // 1文字読む(キーボードバッファクリア)
        if ( n==27 ) break;              // ESCで終了
        if ( n==nO ) continue;           // 同じキーを押したまま

        switch (n)
          {
            case  97: Hz= 208; break;    // a ソ#
            case 115: Hz= 233; break;    // s ラ#
            case 102: Hz= 277; break;    // f ド#
            case 103: Hz= 311; break;    // g レ#
            case 106: Hz= 370; break;    // j ファ#
            case 107: Hz= 415; break;    // k ソ#
            case 108: Hz= 466; break;    // l ラ#
            case  58: Hz= 554; break;    // ; ド#
            case  93: Hz= 622; break;    // ] レ#

            case 122: Hz= 220; break;    // z ラ
            case 120: Hz= 247; break;    // x シ
            case  99: Hz= 262; break;    // c ド
            case 118: Hz= 294; break;    // v レ
            case  98: Hz= 330; break;    // b ミ
            case 110: Hz= 349; break;    // n ファ
            case 109: Hz= 392; break;    // m ソ
            case  44: Hz= 440; break;    // , ラ
            case  46: Hz= 494; break;    // . シ
            case  47: Hz= 523; break;    // / ド
            case  92: Hz= 587; break;    // \ レ

            //--Shift--
            case  65: Hz= 415; break;    // A ソ#
            case  83: Hz= 466; break;    // S ラ#
            case  70: Hz= 554; break;    // F ド#
            case  71: Hz= 622; break;    // G レ#
            case  72: Hz= 740; break;    // J ファ#
            case  74: Hz= 831; break;    // K ソ#
            case  76: Hz= 932; break;    // L ラ#
            case  43: Hz=1109; break;    // + ド#
            case 125: Hz=1245; break;    // ] レ#

            case  90: Hz= 440; break;    // Z ラ
            case  88: Hz= 494; break;    // X シ
            case  67: Hz= 523; break;    // C ド
            case  86: Hz= 587; break;    // V レ
            case  66: Hz= 659; break;    // B ミ
            case  78: Hz= 698; break;    // N ファ
            case  77: Hz= 784; break;    // M ソ
            case  60: Hz= 880; break;    // < ラ
            case  62: Hz= 988; break;    // > シ
            case  63: Hz=1047; break;    // ? ド
            case  95: Hz=1175; break;    // _ レ

            default : Hz=   0;
          }

        Beep(Hz,200);                    // 200ミリ秒鳴らす
      }
}
   

※SSL暗号化通信対応

佐伯英子技術士事務所 〒542-0073 大阪市中央区日本橋 1-14-13 サンオフィス日本橋601  E-mail: yfb22332@nifty.com