まで長時間ビープ音を鳴らしつづけたいと考えています。サウンドカードを持っ
ていないDOS/V PCにてどの様に実現すべきかどなたか教えてください。
PC電源投入時にMBが発するビープ音を任意のタイミングで鳴らしたり止めたり
出来れば良いのですが…。
どなたか、よろしくお願いいたします。
Toshi.
BOOL Beep(dwFreq, dwDuration)
DWORD dwDuration; /* ビープ音の周期 (ミリ秒) */
特別な意味を持つ値が1つあります。dwDurationが-1ならば、 関数は非同期的に動
作し、 関数をもう一度呼び出すまで音を出力し続けます。
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
これ、NT4.0SP3+VB5SP3で試してみたけど、なぜかだめなんですよねぇ。
VBのインタプリタが止めてるのかなぁ?
--
かわい ka...@yokohama.grape.co.jp
河合 清二 wrote:
> これ、NT4.0SP3+VB5SP3で試してみたけど、なぜかだめなんですよねぇ。
> VBのインタプリタが止めてるのかなぁ?
というか、-1000 も 1000 も、同じ(絶対値)に取られているような……
今の Win32API リファレンスだと、dwDuration = -1 の規定はないですね。
--
Takeharu 'tac' Masuda
これで我慢するほか無いのでしょうか?
Toshi.
Kazuo Watanabe wrote:
> ほう、Win95(98)/NTではだめなようですね。
> それならBeepを継続するスレッドを作るぐらいしかないかもしれませんね。
Toshi wrote in message <374144D8...@tko.fitweb.or.jp>...
--
/*
山田淳二(Yamada Junji)
mailto:ju...@mail2.wisnet.ne.jp
*/
Toshi wrote:
>
> 強引にループを使って Beepを発行しつづけると
> びょろろろろ って具合に頼りない音に…。
>
> これで我慢するほか無いのでしょうか?
Windows NT では駄目ですが、9x 系だとブザーの I/O ポートを直接操作
して音を鳴らすことは可能です(NT だと特権違反で止められます)
ただ……ブザーの I/O ポートの仕様が……分からない(^_^;) 単純な周
波数指定じゃなかったのは確かですが……
--
Takeharu 'tac' Masuda
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