単純なビープ音を鳴らすには Beep 関数を使います。
この関数の第一引数に音の周波数を指定して、第二引数に持続時間を指定します。
この関数は同期実行されるため、音が鳴り終わるまでは呼び出し側へ制御を返しません。(戻る)
音の周波数
- ド……440(Hz)
- レ……494(Hz)
- ミ……554(Hz)
- ファ…587(Hz)
- ソ……659(Hz)
- ラ……740(Hz)
- シ……830(Hz)
- ド……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; }
ご指摘ありがとうございます。
http://www.max.hi-ho.ne.jp/nvcc/TR4.HTM
http://panna.dyndns.org/etc/onritu.html
↑
「ド 周波数」検索したら「ラ」でしたね。440Hz。
時間がある時に直します。
通常モールス(CW)での交信は、一分間に100文字以上で行われますので、モールス信号の短点の持続時間は短い時は30m秒が必要となります。その場合beepの発生音の立ち上り・下がりが余りに早すぎて、いわゆるクリック音が発生し聞きにくくなり、実用上使用は難しくなります。
その対策として、立ち上がり(0-5mS)をスムースにする方がないでしょうか? C#でsoundPlay()などで発生させても、やはり高速CW(100文字/秒以上)になるとクリック音が大きくてNGです。
随分とこの問題で悩んでおります。大分時間が過ぎての書き込みなので、上手く主さんのお目に留まればうれしいです。
> その対策として、立ち上がり(0-5mS)をスムースにする方がないでしょうか?
基本的に Windows OS で10ミリ秒以下の指定は無理だと思います。
そもそもマルチタスク OS で俊敏な処理は行えません。
組み込み系のマイコンならばマイクロ秒単位で処理が行えるでしょうね。
> C#でsoundPlay()などで発生させても、やはり高速CW(100文字/秒以上)になるとクリック音が大きくてNGです。
Windows OS の問題なので言語の関数命令は関係が無いと思います。
> 随分とこの問題で悩んでおります。
> 大分時間が過ぎての書き込みなので、上手く主さんのお目に留まればうれしいです。
3日に1度はコメントを確認してます。
本件を解決するために、四苦八苦していて書込んだのを忘れており大変失礼しました。
巷にはA1ABreakerとかCW Maniaとか立ち上がりを、数mSでスムースに立ち上げているソフトがありますので、単に自分の能力が不足しているのは理解しております。なんせC#歴6ケ月ですのでやむを得ないところはあります。
未だにこの窓関数みたいな使い方は分かりませんので、対応策としては先のソフトで発生させた綺麗な信号をwaveファイルにして急場を凌ぎました。
もし管理人さんがこの綺麗な信号を作る仕組みをご存知でしたら、是非ご教授お願い致します。
残念ですが WAVE などの知識は全くありません。
単純にMultimediaTimerではダメですか?
色々と注意点はありますが。