プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

ビープ音を鳴らす

2007年09月12日 13時10分00秒 | マルチメディア関連

単純なビープ音を鳴らすには Beep 関数を使います。
この関数の第一引数に音の周波数を指定して、第二引数に持続時間を指定します。
この関数は同期実行されるため、音が鳴り終わるまでは呼び出し側へ制御を返しません。(戻る)

音の周波数

  1. ド……440(Hz)
  2. レ……494(Hz)
  3. ミ……554(Hz)
  4. ファ…587(Hz)
  5. ソ……659(Hz)
  6. ラ……740(Hz)
  7. シ……830(Hz)
  8. ド……880(Hz)

プロトタイプ宣言

BOOL Beep(
    DWORD   dwFreq,         // 音の周波数(Hz)
    DWORD   dwDuration      // 音の持続時間(ms)
);

サンプル

#include <conio.h>
#include <stdio.h>
#include <windows.h>

// break付きのキーワード
#define CASE        break;case
#define DEFAULT     break;default

// 記号定数
#define ESC         (0x1B)

// メイン関数
int main( void )
{
    int ch;
    
    printf( TEXT("[1].....音階(ド)\n") );
    printf( TEXT("[2].....音階(レ)\n") );
    printf( TEXT("[3].....音階(ミ)\n") );
    printf( TEXT("[4].....音階(ファ)\n") );
    printf( TEXT("[5].....音階(ソ)\n") );
    printf( TEXT("[6].....音階(ラ)\n") );
    printf( TEXT("[7].....音階(シ)\n") );
    printf( TEXT("[8].....音階(ド)\n") );
    printf( TEXT("[ESC]...終了\n") );
    
    while ( (ch = _getch()) != ESC ){
        switch ( ch ){
            CASE TEXT('1'):     Beep( 440, 200 );       // ド
            CASE TEXT('2'):     Beep( 494, 200 );       // レ
            CASE TEXT('3'):     Beep( 554, 200 );       // ミ
            CASE TEXT('4'):     Beep( 587, 200 );       // ファ
            CASE TEXT('5'):     Beep( 659, 200 );       // ソ
            CASE TEXT('6'):     Beep( 740, 200 );       // ラ
            CASE TEXT('7'):     Beep( 830, 200 );       // シ
            CASE TEXT('8'):     Beep( 880, 200 );       // ド
            DEFAULT:            break;
        }
    }
    return 0;
}

関連記事



コメント (7)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 警告音を鳴らす | トップ | タスクトレイ・アイコンの追加 »
最新の画像もっと見る

7 コメント

コメント日が  古い順  |   新しい順
Unknown (Unknown)
2012-07-04 16:33:01
440Hzは「ラ」ですよ。絶対音感があるので気付きました
返信する
ありがとう (ブログ管理人)
2012-07-05 02:41:06
> 440Hzは「ラ」ですよ。絶対音感があるので気付きました
ご指摘ありがとうございます。

http://www.max.hi-ho.ne.jp/nvcc/TR4.HTM
http://panna.dyndns.org/etc/onritu.html

「ド 周波数」検索したら「ラ」でしたね。440Hz。
時間がある時に直します。
返信する
BEEPでモールス信号 (momkuma)
2013-04-30 09:52:25
ここにあるbeepでモールス信号を発生させてみました。

通常モールス(CW)での交信は、一分間に100文字以上で行われますので、モールス信号の短点の持続時間は短い時は30m秒が必要となります。その場合beepの発生音の立ち上り・下がりが余りに早すぎて、いわゆるクリック音が発生し聞きにくくなり、実用上使用は難しくなります。

その対策として、立ち上がり(0-5mS)をスムースにする方がないでしょうか? C#でsoundPlay()などで発生させても、やはり高速CW(100文字/秒以上)になるとクリック音が大きくてNGです。

随分とこの問題で悩んでおります。大分時間が過ぎての書き込みなので、上手く主さんのお目に留まればうれしいです。
返信する
不可能な気が… (ブログ管理人)
2013-05-02 00:07:32
はじめまして。

> その対策として、立ち上がり(0-5mS)をスムースにする方がないでしょうか?
基本的に Windows OS で10ミリ秒以下の指定は無理だと思います。
そもそもマルチタスク OS で俊敏な処理は行えません。
組み込み系のマイコンならばマイクロ秒単位で処理が行えるでしょうね。

> C#でsoundPlay()などで発生させても、やはり高速CW(100文字/秒以上)になるとクリック音が大きくてNGです。
Windows OS の問題なので言語の関数命令は関係が無いと思います。

> 随分とこの問題で悩んでおります。
> 大分時間が過ぎての書き込みなので、上手く主さんのお目に留まればうれしいです。
3日に1度はコメントを確認してます。
返信する
C#でCW発生器作成 (momkuma)
2013-10-20 11:14:16
管理人さん

本件を解決するために、四苦八苦していて書込んだのを忘れており大変失礼しました。

巷にはA1ABreakerとかCW Maniaとか立ち上がりを、数mSでスムースに立ち上げているソフトがありますので、単に自分の能力が不足しているのは理解しております。なんせC#歴6ケ月ですのでやむを得ないところはあります。

未だにこの窓関数みたいな使い方は分かりませんので、対応策としては先のソフトで発生させた綺麗な信号をwaveファイルにして急場を凌ぎました。 

もし管理人さんがこの綺麗な信号を作る仕組みをご存知でしたら、是非ご教授お願い致します。

返信する
Re:C#でCW発生器作成 (ブログ管理人)
2013-10-22 00:57:22
> もし管理人さんがこの綺麗な信号を作る仕組みをご存知でしたら、是非ご教授お願い致します。
残念ですが WAVE などの知識は全くありません。
返信する
Unknown (Unknown)
2013-11-08 13:14:19
> 基本的に Windows OS で10ミリ秒以下の指定は無理だと思います。
単純にMultimediaTimerではダメですか?
色々と注意点はありますが。
返信する

コメントを投稿

マルチメディア関連」カテゴリの最新記事