人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: キチョー id:Kityo
●カテゴリ:コンピュータ
✍キーワード:BASIC Beep Borland C++ DLL
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ToMmY
●10ポイント

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のコンポーネントを検討するものとして、続報を待ちます。


2 ● aki73ix
●300ポイント

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とで挙動が違うのもあまり嬉しくない…)

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


3 ● ohmix1
●30ポイント ベストアンサー

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

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

まず、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()を呼び出したスレッドを殺せば、ビープが止まる!

目からウロコです。

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


4 ● i_kumagoro
●30ポイント

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ