Windows用の再配布可能なライブラリを探しています。

 ターゲットは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以外の形態でも構いません。ライブラリの入手に多少の(数万円以内程度の)コストがかかっても、僕が作成したターゲットとともに追加料金なしで再配布可能であれば、それも構いません。
 お知恵を貸して下さい。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2006/04/03 23:43:17
  • 終了:2006/04/06 02:05:05

ベストアンサー

id:ohmix1 No.3

ohmix1回答回数235ベストアンサー獲得回数142006/04/04 21:24:15

ポイント30pt

ほんとうにシステムスピーカーから音を鳴らさないといけないのでしょうか?

という疑問はあるのですが、とりあえず分かるところまで回答しておきます。

まず、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関数を中断できるかも。

未確認が多くてすみません。

以上

id:Kityo

 回答ありがとうございます。

 Beep()を呼び出したスレッドを殺せば、ビープが止まる!

 目からウロコです。

 何せ反射神経を問うゲームなので、結構な頻度でそれをやって大丈夫か?って懸念はありますが、大いに参考になります。

2006/04/05 05:19:34

その他の回答(3件)

id:ToMmY No.1

ToMmY回答回数656ベストアンサー獲得回数192006/04/04 00:17:27

ポイント10pt

http://www.torry.net/pages.php?id=186

これのようです?

http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200402_04...

このサイトに乗ってたのですが。

id:Kityo

 回答ありがとうございます。

 Delphiのコンポーネントは(はてなに質問を出す前に自力で調べた時点で)何種類かヒットしていたのですが、主に「C++から呼び出す方法がよく分からない」と言う理由でスルーしていました。(もちろん、調べれば呼べそうですが…)

 加えて、紹介して頂いた「Beeper」のReadMeには「System Beeper for win95/98」とあり、残念ながらXPでは使えないような予感がします。

 他に僕にとって気軽に試せそうなものがなければDelphiのコンポーネントを検討するものとして、続報を待ちます。

2006/04/04 00:41:34
id:aki73ix No.2

aki73ix回答回数5224ベストアンサー獲得回数272006/04/04 19:49:48

ポイント300pt

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を鳴らして何か確認したいということでしたら十分だと思います

再配布の条件は添付のテキストに詳しく書いていますが自由です・・・思いつきで作ったばかりのものですがどうぞ

id:Kityo

 回答ありがとうございます。

 ご紹介頂いた第1のURLの品(サンリツオートメイションさんの品)は、以前に別件の調べ物をしていたときに見たような覚えがあります。

 今回の目的に対しては、技術的な敷居が高いのと料金の設定が高いですね。(ざっと読んだ感じで、僕のexeを1コピー配布につき1登録必要な気配)

 第2のURLの品は、aki73ixさんが作って下さった…と言うことですね!

 わざわざ恐れ入ります。

 はてなに質問登録してから身近な者とも相談していて「サウンドカードを触りに行くほうがむしろ簡単では?」との意見も拾っており、aki73ixさんの“BeepEmu.dll”の方法が最良のソリューションかなぁ…とも考えています。

 今日、残業が必要な事態にでもならなければ、業務終了後に試させて頂こうかと思います。

>用途が分からないので趣旨から離れている可能性がありますが、

 最初から質問の文面に織り混ぜたほうが良かったですよね?

 職場で、同僚や部下と休憩時間に遊ぶためのゲームを作っています。(以前に作ったものを最近のPCでも動くように改造しようとしています。)

 ピッ、ブー、程度の音があれば充分なのですが、長い音(ブーの類)を停止するタイミングをゲーム本体の進行に同期させたいので、予め鳴音時間を指定するMessageBeep() APIでは目的に合わないのでした。(同APIは、Win9xとNT/XPとで挙動が違うのもあまり嬉しくない…)

 そんな感じです。ありがとうございます。

2006/04/05 05:10:05
id:ohmix1 No.3

ohmix1回答回数235ベストアンサー獲得回数142006/04/04 21:24:15ここでベストアンサー

ポイント30pt

ほんとうにシステムスピーカーから音を鳴らさないといけないのでしょうか?

という疑問はあるのですが、とりあえず分かるところまで回答しておきます。

まず、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関数を中断できるかも。

未確認が多くてすみません。

以上

id:Kityo

 回答ありがとうございます。

 Beep()を呼び出したスレッドを殺せば、ビープが止まる!

 目からウロコです。

 何せ反射神経を問うゲームなので、結構な頻度でそれをやって大丈夫か?って懸念はありますが、大いに参考になります。

2006/04/05 05:19:34
id:i_kumagoro No.4

i_kumagoro回答回数170ベストアンサー獲得回数582006/04/05 00:28:48

ポイント30pt

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の範疇でご希望に近い事は可能かもしれませんが、これに関しては申し訳ありませんがよく分かりません。

id:Kityo

 特に目新しいご意見ではなかったのは、回答して頂いたタイミングと僕が開いた順番に拠る結果でした。

 しかし意見の方向が揃うと言った事実もまた、貴重な情報です。

 回答ありがとうございます。

2006/04/05 05:32:19
  • id:Kityo
     皆さん、回答ありがとうございました!
     aki73ixさんの“BeepEmu.dll”を試してみて、手軽で良好だったので、今回直接にはこれを利用させて頂こうかと考えています。
     別スレッドでBeep()-APIを使わせておいてそのスレッドを殺す案は、技術的チャレンジとしては面白そうなので、そのうちに試してみようかなぁ…と思います。

     “BeepEmu.dll”ですが、初回のBeepONの時だけワンテンポ鳴り始めが遅いような気がするのは気のせいでしょうか?>aki73ixさん
     LoadLibraryの時間は差し引いているつもりですが真剣に測定した訳ではないので言いがかりかも知れませんが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません