ターゲットは32bitコンソールアプリケーションで、C++言語でソースを書いています。
ライブラリに求めている要件は、次のような感じです。
・ビープを鳴らしっ放しに出来る、止められる
・ビープ音の周波数をHz単位で指定出来る
・どの関数も、直ちに制御を戻す
・Windows XPで動作する/可能であれば、Windows 9xでも動作する
その昔の(DOS向けの)Borland C++で利用可能だったsound()/nosound()関数と同様な使い勝手の関数が欲しいのです。(N88-BASICなどのBEEP ON/BEEP OFFコマンドのようなイメージ)
http://www.vector.co.jp/soft/win95/art/se104889.htmlにある「ビープ音制御ソフトウェア」を実際に利用していましたが、これは残念ながらWindows XPでは使えなかったので代わりのものを探しています。
フリーのDLLをイメージしていますが、所望の使い勝手が得られればDLL以外の形態でも構いません。ライブラリの入手に多少の(数万円以内程度の)コストがかかっても、僕が作成したターゲットとともに追加料金なしで再配布可能であれば、それも構いません。
お知恵を貸して下さい。
ほんとうにシステムスピーカーから音を鳴らさないといけないのでしょうか?
という疑問はあるのですが、とりあえず分かるところまで回答しておきます。
まず、WinNT系OSにはそのものずばりBeep()関数があります。
http://msdn.microsoft.com/library/ja/default.asp?url=/librar...
ただし、音が鳴り終わるまで制御は返ってきません。
ここから未確認ですが、
このBeepをCreateThread()で別スレッドで実行し、
終了はTerminateThread()で停止するクラスを作るといけるのではないかと思います。
※TerminateThread()が不安定要素です
補足
Beep関数はBeep.sysというドライバが動いてないと鳴らないと思います。
※もちろん本体にシステムスピーカーがないとだめ。
http://www.alles.or.jp/~torutk/oojava/maneuver/2000/5-1.html...
または、
> net start beep
> net stop beep
で開始/終了できるので、これでBeep関数を中断できるかも。
未確認が多くてすみません。
以上
http://www.torry.net/pages.php?id=186
これのようです?
http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200402_04...
このサイトに乗ってたのですが。
回答ありがとうございます。
Delphiのコンポーネントは(はてなに質問を出す前に自力で調べた時点で)何種類かヒットしていたのですが、主に「C++から呼び出す方法がよく分からない」と言う理由でスルーしていました。(もちろん、調べれば呼べそうですが…)
加えて、紹介して頂いた「Beeper」のReadMeには「System Beeper for win95/98」とあり、残念ながらXPでは使えないような予感がします。
他に僕にとって気軽に試せそうなものがなければDelphiのコンポーネントを検討するものとして、続報を待ちます。
Kityoさん先日はありがとうございました
http://www.vector.co.jp/soft/winnt/prog/se078684.html
一応シェアウェアでこういうものはあります(ちょっと高価です)
例題としてBeepのコントロールというものがあるので、42/43/61ポートを直接操作すれば御希望の機能をNT系OSでは実現できるでしょう(9xでは分岐処理が必要)
御存知だとは思いますが、Windows9xの場合はVXDを作らなくても、IOポートの管理が厳しくなかったために直接アセンブラでPort入出力をすることが出来ました
ところが、WinNTではBeep音はSystemデバイスドライバのシステムスピーカーとシステムタイマに制御が厳格に握られていますから、大抵のIO制御ソフトはNT系OSでは使えないわけです(ちなみにBeeperは9xオンリーです)
そこで、Beep音を内蔵サウンドでエミュレーションできないかと考えてみました
http://nifberry.727.net/tool.htm
Beep制御のエミュレーションを行うライブラリ[DL Ver 0.10]
というのが、これを実現したソフトです
周波数の切り替えとON/OFF、音源のバックグラウンド制御、ボリュームのコントロールが実行できるだけでなく、Windows全OSで共通に利用できます
用途が分からないので趣旨から離れている可能性がありますが、プログラム上でBeepを鳴らして何か確認したいということでしたら十分だと思います
再配布の条件は添付のテキストに詳しく書いていますが自由です・・・思いつきで作ったばかりのものですがどうぞ
回答ありがとうございます。
ご紹介頂いた第1のURLの品(サンリツオートメイションさんの品)は、以前に別件の調べ物をしていたときに見たような覚えがあります。
今回の目的に対しては、技術的な敷居が高いのと料金の設定が高いですね。(ざっと読んだ感じで、僕のexeを1コピー配布につき1登録必要な気配)
第2のURLの品は、aki73ixさんが作って下さった…と言うことですね!
わざわざ恐れ入ります。
はてなに質問登録してから身近な者とも相談していて「サウンドカードを触りに行くほうがむしろ簡単では?」との意見も拾っており、aki73ixさんの“BeepEmu.dll”の方法が最良のソリューションかなぁ…とも考えています。
今日、残業が必要な事態にでもならなければ、業務終了後に試させて頂こうかと思います。
>用途が分からないので趣旨から離れている可能性がありますが、
最初から質問の文面に織り混ぜたほうが良かったですよね?
職場で、同僚や部下と休憩時間に遊ぶためのゲームを作っています。(以前に作ったものを最近のPCでも動くように改造しようとしています。)
ピッ、ブー、程度の音があれば充分なのですが、長い音(ブーの類)を停止するタイミングをゲーム本体の進行に同期させたいので、予め鳴音時間を指定するMessageBeep() APIでは目的に合わないのでした。(同APIは、Win9xとNT/XPとで挙動が違うのもあまり嬉しくない…)
そんな感じです。ありがとうございます。
ほんとうにシステムスピーカーから音を鳴らさないといけないのでしょうか?
という疑問はあるのですが、とりあえず分かるところまで回答しておきます。
まず、WinNT系OSにはそのものずばりBeep()関数があります。
http://msdn.microsoft.com/library/ja/default.asp?url=/librar...
ただし、音が鳴り終わるまで制御は返ってきません。
ここから未確認ですが、
このBeepをCreateThread()で別スレッドで実行し、
終了はTerminateThread()で停止するクラスを作るといけるのではないかと思います。
※TerminateThread()が不安定要素です
補足
Beep関数はBeep.sysというドライバが動いてないと鳴らないと思います。
※もちろん本体にシステムスピーカーがないとだめ。
http://www.alles.or.jp/~torutk/oojava/maneuver/2000/5-1.html...
または、
> net start beep
> net stop beep
で開始/終了できるので、これでBeep関数を中断できるかも。
未確認が多くてすみません。
以上
回答ありがとうございます。
Beep()を呼び出したスレッドを殺せば、ビープが止まる!
目からウロコです。
何せ反射神経を問うゲームなので、結構な頻度でそれをやって大丈夫か?って懸念はありますが、大いに参考になります。
WIN32のAPIでは制御を取られるものしかないようなので、おそらく直接I/Oポートを制御する必要があると思います。
ftp://ftp.nsk.su/.3/magazins/ddj/1996/1996.05/directio.zip
に入っているgiveio.sysを使えばXPからでも直接IOポートにアクセスが可能になります(多分Administrator権限が必要です。)。
さらに、これを使ってPCのinternal speakerを鳴らすというそのまんまなサンプルも(Cですが)入っています。
また、beep専用threadを作るとかして頑張ればAPIの範疇でご希望に近い事は可能かもしれませんが、これに関しては申し訳ありませんがよく分かりません。
特に目新しいご意見ではなかったのは、回答して頂いたタイミングと僕が開いた順番に拠る結果でした。
しかし意見の方向が揃うと言った事実もまた、貴重な情報です。
回答ありがとうございます。
回答ありがとうございます。
Beep()を呼び出したスレッドを殺せば、ビープが止まる!
目からウロコです。
何せ反射神経を問うゲームなので、結構な頻度でそれをやって大丈夫か?って懸念はありますが、大いに参考になります。