Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

BEEP音を長時間鳴らしつづける方法

1,712 views
Skip to first unread message

Toshi

unread,
May 16, 1999, 3:00:00 AM5/16/99
to
 Windows NT,98,95が混在する環境で、Oracle+VBを用いたC/S型 業務ソフトウ
ェアの開発をしています。
 作業の準備が整った、エラーが発生したときなど、ユーザーがキーを押下する

まで長時間ビープ音を鳴らしつづけたいと考えています。サウンドカードを持っ

ていないDOS/V PCにてどの様に実現すべきかどなたか教えてください。

 PC電源投入時にMBが発するビープ音を任意のタイミングで鳴らしたり止めたり

出来れば良いのですが…。
 どなたか、よろしくお願いいたします。

Toshi.


Kazuo Watanabe

unread,
May 18, 1999, 3:00:00 AM5/18/99
to
Win32APIのヘルプに以下の記述があります。

BOOL Beep(dwFreq, dwDuration)
DWORD dwDuration; /* ビープ音の周期 (ミリ秒) */
特別な意味を持つ値が1つあります。dwDurationが-1ならば、 関数は非同期的に動
作し、 関数をもう一度呼び出すまで音を出力し続けます。

shinsaka

unread,
May 18, 1999, 3:00:00 AM5/18/99
to
Kazuo Watanabeさんの<7hpel5$l9c$4...@nntp.tiki.ne.jp>から
>Win32APIのヘルプに以下の記述があります。
>
>BOOL Beep(dwFreq, dwDuration)

VC++4.2付属のヘルプ(?)によると
Windows 95:
The Beep function ignores the dwFreq and dwDuration parameters.On
computers with a sound card, the function plays the default sound even
t.On computers without a sound card, the function plays the standard
system beep.

ということでWindows95ではパラメータは無効のようですよ。以前、富士通FM
V+Win95で試したときは、か細く“ビッ”と鳴るだけで長く鳴らしたり音程を
変えたりはできませんでした。

--
新坂(shinsaka) sh...@sancom.co.jp


河合 清二

unread,
May 18, 1999, 3:00:00 AM5/18/99
to

Kazuo Watanabe wrote in message <7hpel5$l9c$4...@nntp.tiki.ne.jp>...

これ、NT4.0SP3+VB5SP3で試してみたけど、なぜかだめなんですよねぇ。
VBのインタプリタが止めてるのかなぁ?

--
かわい ka...@yokohama.grape.co.jp


Takeharu Masuda

unread,
May 18, 1999, 3:00:00 AM5/18/99
to

河合 清二 wrote:
> これ、NT4.0SP3+VB5SP3で試してみたけど、なぜかだめなんですよねぇ。
> VBのインタプリタが止めてるのかなぁ?

 というか、-1000 も 1000 も、同じ(絶対値)に取られているような……

 今の Win32API リファレンスだと、dwDuration = -1 の規定はないですね。
--
Takeharu 'tac' Masuda

Kazuo Watanabe

unread,
May 18, 1999, 3:00:00 AM5/18/99
to
ほう、Win95(98)/NTではだめなようですね。
それならBeepを継続するスレッドを作るぐらいしかないかもしれませんね。
Takeharu Masuda wrote in message <3740D1AF...@kk.iij4u.or.jp>...

Toshi

unread,
May 18, 1999, 3:00:00 AM5/18/99
to

 強引にループを使って Beepを発行しつづけると
 びょろろろろ って具合に頼りない音に…。

 これで我慢するほか無いのでしょうか?

Toshi.

Kazuo Watanabe wrote:
> ほう、Win95(98)/NTではだめなようですね。
> それならBeepを継続するスレッドを作るぐらいしかないかもしれませんね。

Kazuo Watanabe

unread,
May 18, 1999, 3:00:00 AM5/18/99
to
センスの問題ですが、わざと断続音にしてしまうのも1つの手段だと思い
ますよ。
周波数が指定できるので救急車のサイレンとか、工夫すれば音楽も流せ
るんじゃないですか?(昔なつかしのゲームのピコピコ音とか・・・)

Toshi wrote in message <374144D8...@tko.fitweb.or.jp>...

Yamada Junji

unread,
May 19, 1999, 3:00:00 AM5/19/99
to
>強引にループを使って Beepを発行しつづけると
>びょろろろろ って具合に頼りない音に…。
>これで我慢するほか無いのでしょうか?
いまさら、無理に、Beep音を使う必要はないんじゃないでしょうか?wavファイルで
も、midiファイルでも好きな音が出せるわけですから。どうしてもというなら、ハー
ドウェアを自前で制御するしかないでしょうね。


--
/*
山田淳二(Yamada Junji)
mailto:ju...@mail2.wisnet.ne.jp
*/


Kazuo Watanabe

unread,
May 20, 1999, 3:00:00 AM5/20/99
to
Yamada Junji wrote in message <7hs7lr$pfp$1...@newsgw7.odn.ne.jp>...

>いまさら、無理に、Beep音を使う必要はないんじゃないでしょうか?wavファイルで
>も、midiファイルでも好きな音が出せるわけですから。どうしてもというなら、
ハー
>ドウェアを自前で制御するしかないでしょうね。
元記事は
サウンドカードを持っていないDOS/V PCにてどの様に実現すべきかどなたか教えてく
ださい。
なんですが・・・

Takeharu Masuda

unread,
May 21, 1999, 3:00:00 AM5/21/99
to

Toshi wrote:
>
>  強引にループを使って Beepを発行しつづけると
>  びょろろろろ って具合に頼りない音に…。
>
>  これで我慢するほか無いのでしょうか?

 Windows NT では駄目ですが、9x 系だとブザーの I/O ポートを直接操作
して音を鳴らすことは可能です(NT だと特権違反で止められます)

 ただ……ブザーの I/O ポートの仕様が……分からない(^_^;) 単純な周
波数指定じゃなかったのは確かですが……
--
Takeharu 'tac' Masuda

Yamada Junji

unread,
May 21, 1999, 3:00:00 AM5/21/99
to
>元記事は
>サウンドカードを持っていないDOS/V PCにてどの様に実現すべきか
>どなたか教えてください。なんですが・・・
まあ、そうなんですが。
ハードウェアを直接制御すればできますよ。
でも、サウンドカードつけたほうが楽かも。
ってことで。

Yamada Junji

unread,
May 22, 1999, 3:00:00 AM5/22/99
to
>ただ……ブザーの I/O ポートの仕様が……分からない(^_^;) 
>単純な周波数指定じゃなかったのは確かですが……
手持ちの資料によると、8254で1.19318MHzを分周しているようです。

Yamada Yoshinobu

unread,
May 22, 1999, 3:00:00 AM5/22/99
to
 山田@biglobeと言います。

Message-ID: <373E5C18...@tko.fitweb.or.jp>の記事で
Toshi <a...@tko.fitweb.or.jp>さんは書きました。
(引用の際に改行位置を変更してあります)


> Windows NT,98,95が混在する環境で、Oracle+VBを用いた
>C/S型 業務ソフトウェアの開発をしています。
> 作業の準備が整った、エラーが発生したときなど、ユーザーが
>キーを押下するまで長時間ビープ音を鳴らしつづけたいと考えて
>います。サウンドカードを持っていないDOS/V PCにてどの様に実
>現すべきかどなたか教えてください。
> PC電源投入時にMBが発するビープ音を任意のタイミングで鳴ら

>したり止めたり出来れば良いのですが…。
 私も似た内容の問い合わせを今年の3月くらいにfjに出しまし
 た。その時よせられた回答および自分で調べた結果をまとめると、
 95/98でしたら、I/Oポートを直接制御することによって
 ご希望の動作をさせることができます。以下に方法を記述します。
 当時の記事<7d3dc8$2mc$1...@meshsv230.tk.mesh.ad.jp>もアーカイ
 ブサービスなどで検索可能ならばご参照ください。

 なお、NTで行うにはWin32APIのBeep()を使用するしか
 ありません。私が試した環境では、dwDurationの値にある程度長
 めの値(0.1秒程度=100milsec)を指定し、Beep()を繰り返し呼
 び出すことでほぼ連続したビープ音を得ることができました。た
 だし、私が使用した環境はVC++でしたので、VBでも切れ目無く音
 が出るかはわかりません。Beep()の呼び出しの切れ目で音が途切
 れるため、CPU性能などによっては、呼び出しと呼び出しの間が
 間延びして、音が途切れるかもしれません。またBeep()は、指定
 したdwDurationが経過するまでは、呼び出し元へ戻ってこないの
 で、キー入力チェックなどを行う場合には、あまり長い値を指定
 すると、反応が悪くなります。

 <スピーカービープの制御方法on95/98>
 PC/AT互換機の場合
 1)初期化
   ポート番号0x43に対して値0xb6を出力する。
   これによりタイマーIC(8254)に動作モード3を設定する。
 2)周波数の設定
   ポート番号0x42に対して、タイマーIC(8254)のタイマ値
  (2バイト)を下位/上位の順に出力することによって
   ビープ音の発信周波数を設定する。
   出力する値と発信周波数の関係は次の通り。
    タイマ値 = 基本周波数 / 発信周波数(Hz)
   基本周波数はPC/AT互換機の場合、1193180Hzです。
   従って具体的なロジックは、
    counter = 1193180L / nFreq ;
    outp(0x42,counter % 256) ;
    outp(0x42,counter / 256) ;
   となります。
 3)鳴動開始
   ポート番号0x61から1バイトの値を読み出し、この下2ビットを
   onにして、ポート0x61にセットし直すことによってスピーカが
   鳴動し始める。(システムIC(8255)の制御)
    portdata = inp(0x61) ;
    outp(0x61 , portdata | 0x03) ;
 4)鳴動停止
   ポート番号0x61から1バイトの値を読み出し、この下2ビットを
   offにして、ポート0x61にセットし直すことによってスピーカ鳴動
   が停止する。
    portdata = inp(0x61) ;
    outp(0x61 , portdata & 0xfc) ;

 NEC98の場合(除くNX)
 1)初期化
   ポート番号0x3fdfに対して値0x76を出力する。
   これによりタイマーIC(8253A)に動作モード3を設定する。
 2)周波数の設定
   ポート番号0x3fdbに対して、タイマーIC(8253A)のタイマ値
  (2バイト)を下位/上位の順に出力することによって
   ビープ音の発信周波数を設定する。
   出力する値と発信周波数の関係は次の通り。
    タイマ値 = 基本周波数 / 発信周波数(Hz)
   基本周波数は8MHz系/5MHzの2種類のマシンがあり
    8MHz系:1996800Hz
    5MHz系:2457600Hz
   となっています。
   両者の区別は、ポート番号0x42の値(1バイト)読み出し、
   このビット2(MSBをビット7、LSBをビット0とした場合)
   が1の時8MHz系、0の時5MHz系と判断します。
   具体的なロジックは以下の通り。
    portdata = inp(0x42) ;
    if(portdata&0x04)
     basicfreq = 1996800L ;
    else
     basicfreq = 2457600L ;
    counter = basicfreq / nFreq ;
    outp(0x3fdb,counter % 256) ;
    outp(0x3fdb,counter / 256) ;
 3)鳴動開始
   ポート番号0x37に値0x06を出力することによってスピーカが
   鳴動し始める。
 4)鳴動停止
   ポート番号0x37に値0x07を出力することによってスピーカが
   停止する。

                         以上

Toshi

unread,
May 28, 1999, 3:00:00 AM5/28/99
to

スレッドの皆さん。回答ありがとうございました。
I/Oポートを直接触ることで、目的の動作が実現できました。
WinNTでは実現できない点が悔やまれます。が、NTで行わせる作業と 95/98で行
わせる作業に線が引けるので、NT側はWin32API、Win95/98側はI/Oと使い分けた
いと思います。

まずはお礼まで。

Toshi

0 new messages