|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"Beep音で音階を鳴らす(Win95)"
■概要
IBM PC/AT互換機のBeep音で音階を鳴らします。
Windows 95/98 専用です。
■注意
・IOポートに直接アクセスしていますので、PC98(NEC)では動作しません。
・Windows NTでは特権命令違反になり動作しません。
・uses に Windows を追加して下さい。
■サンプルコード
SpeakerOnOff関数では大変大雑把に時間管理してますので、ご了承ください。
var
Form1: TForm1;
implementation
//************************************************************************
function OnkaiTickLo(OnkaiLo:Integer): Byte;
{// 【各音階ごとの周波数データ】}
{音階の下位バイトの値}
begin
case OnkaiLo of
260: Result:= 95; // 110.00hz A3 ra2_lo
261: Result:= 254; // 116.54hz A#3 ra2_loshp
270: Result:= 191; // 123.47hz B3 si2_lo
310: Result:= 161; // 130.81hz C3 do3_lo
311: Result:= 161; // 138.59hz C#3 do3_loshp
320: Result:= 190; // 146.83hz D3 re3_lo
321: Result:= 14; // 155.06hz D#3 re3_loshp
330: Result:= 71; // 164.81hz E3 mi3_lo
340: Result:= 177; // 174.61hz F3 fa3_lo
341: Result:= 49; // 185.00hz F#3 fa3_loshp
350: Result:= 199; // 196.00hz G3 so3_lo
351: Result:= 114; // 207.65hz G#3 so3_loshp
360: Result:= 47; // 220.00hz A3 ra3_lo
361: Result:= 255; // 233.08hz A#3 ra3_loshp
370: Result:= 223; // 246.94hz B3 si3_lo
410: Result:= 208; // 261.63hz C4 do_lo
411: Result:= 208; // 277.18hz C#4 do_loshp
420: Result:= 223; // 293.66hz D4 re_lo
421: Result:= 250; // 311.13hz D#4 re_loshp
430: Result:= 35; // 329.63hz E4 mi_lo
440: Result:= 88; // 349.23hz F4 fa_lo
441: Result:= 152; // 369.99hz F#4 fa_loshp
450: Result:= 227; // 392.00hz G4 so_lo
451: Result:= 57; // 415.30hz G#4 so_loshp
460: Result:= 151; // 440.00hz A4 ra_lo
461: Result:= 255; // 466.16hz A#4 ra_loshp
470: Result:= 111; // 493.88hz B4 si_lo
510: Result:= 232; // 523.25hz C5 do5_lo
511: Result:= 104; // 554.37hz C#5 do5_loshp
520: Result:= 239; // 587.33hz D5 re5_lo
521: Result:= 125; // 622.25hz D#5 re5_loshp
530: Result:= 17; // 659.26hz E5 mi5_lo
540: Result:= 172; // 698.46hz F5 fa5_lo
541: Result:= 76; // 739.99hz F#5 fa5_loshp
550: Result:= 241; // 783.99hz G5 so5_lo
551: Result:= 156; // 830.61hz G#5 so5_loshp
560: Result:= 65; // 880.00hz A5 ra5_lo
561: Result:= 255; // 932.33hz A#5 ra5_loshp
570: Result:= 183; // 987.77hz B5 si5_lo
610: Result:= 116; // 1046.50hz C6 do6_lo
611: Result:= 52; // 1108.73hz C#6 do6_loshp
620: Result:= 247; // 1174.66hz D6 re6_lo
621: Result:= 200; // 1244.51hz D#6 re6_loshp
630: Result:= 130; // 1328.51hz E6 mi6_lo
640: Result:= 86; // 1396.91hz F6 fa6_lo
else Result:= 208;
end;
end;
//************************************************************************
function OnkaiTickHi(OnkaiHi:Integer): Byte;
{音階の上位バイトの値}
begin
case OnkaiHi of
260: Result:= 42; // ra2_hi
261: Result:= 39; // ra2_hishp
270: Result:= 37; // si2_hi
310: Result:= 35; // do3_hi
311: Result:= 33; // do3_hishp
320: Result:= 31; // re3_hi
321: Result:= 30; // re3_hishp
330: Result:= 28; // mi3_hi
340: Result:= 26; // fa3_hi
341: Result:= 25; // fa3_hishp
350: Result:= 23; // so3_hi
351: Result:= 22; // so3_hishp
360: Result:= 21; // ra3_hi
361: Result:= 19; // ra3_hishp
370: Result:= 18; // si3_hi
410: Result:= 17; // do_hi
411: Result:= 16; // do_hishp
420: Result:= 15; // re_hi
421: Result:= 14; // re_hishp
430: Result:= 14; // mi_hi
440: Result:= 13; // fa_hi
441: Result:= 12; // fa_hishp
450: Result:= 11; // so_hi
451: Result:= 11; // so_hishp
460: Result:= 10; // ra_hi
461: Result:= 9; // ra_hishp
470: Result:= 9; // si_hi
510: Result:= 8; // do5_hi
511: Result:= 8; // do5_hishp
520: Result:= 7; // re5_hi
521: Result:= 7; // re5_hishp
530: Result:= 7; // mi5_hi
540: Result:= 6; // fa5_hi
541: Result:= 6; // fa5_hishp
550: Result:= 5; // so5_hi
551: Result:= 5; // so5_hishp
560: Result:= 5; // ra5_hi
561: Result:= 4; // ra5_hishp
570: Result:= 4; // si5_hi
610: Result:= 4; // do6_hi
611: Result:= 4; // do6_hishp
620: Result:= 3; // re6_hi
621: Result:= 3; // re6_hishp
630: Result:= 3; // mi6_hi
640: Result:= 3; // fa6_hi
else Result:= 17;
end;
end;
//************************************************************************
function SpeakerOpen :LongInt;
begin
asm
{speaker_redy}
mov ax,0b6h
mov dx,43h {ポート 43h}
out dx,ax {タイマ ヲ レデイ ニ スル}
end;
Result:= 0;
end;
//========================================================================
function SpeakerOnOff(onkai:Integer ;timer:Integer) :LongInt;
var
TickLo, TickHi: Byte;
Start_MiriTime, End_MiriTime: integer;
begin
TickLo:= OnkaiTickLo(onkai);
TickHi:= OnkaiTickHi(onkai);
if (timer < 10) or (timer > 5000) then {5秒以上ならエラーを返す}
begin
Result:= -1;
timer:= 100;
end
else begin
Result:= 0;
end;
asm
{タイマーチックをポートに出力}
xor ah,ah {AHレジスタはクリアしておく}
mov al,TickLo {音階の下位バイト}
mov dx,42h {ポート 42h}
out dx,ax {AX --> ポート ヘ ロード}
mov al,TickHi {音階の上位バイト}
mov dx,42h {ポート 42h}
out dx,ax {AX --> ポート ヘ ロード}
{スピーカを鳴らす}
mov dx,61h {スピーカー ON}
in ax,dx {(1.ポート 61h ヲ ヨム)}
or ax,03h {(2.ビツト 0 ト 1 ヲ ミル)}
mov dx,61h
out dx,ax
end;
Start_MiriTime:= GetTickCount; {Windows起動後のミリ秒}
End_MiriTime := Start_MiriTime;
while Start_MiriTime + timer >= End_MiriTime do
begin {指定時間ループさせる}
End_MiriTime:= GetTickCount;
end;
asm
{スピーカを止める}
mov dx,61h {スピーカー OFF}
in ax,dx {(1.ポート 61h ヲ ヨム)}
and ax,0fch {(2.ビツト 0 ト 1 ヲ ケス)}
mov dx,61h
out dx,ax
end;
end;
//========================================================================
function SpeakerOn(onkai:Integer) :LongInt;
var
TickLo, TickHi: Byte;
begin
Result:= 0;
TickLo:= OnkaiTickLo(onkai);
TickHi:= OnkaiTickHi(onkai);
asm
{タイマーチックをポートに出力}
xor ah,ah {AHレジスタはクリアしておく}
mov al,TickLo {音階の下位バイト}
mov dx,42h {ポート 42h}
out dx,ax {AX --> ポート ヘ ロード}
mov al,TickHi {音階の上位バイト}
mov dx,42h {ポート 42h}
out dx,ax {AX --> ポート ヘ ロード}
{スピーカを鳴らす}
mov dx,61h {スピーカー ON}
in ax,dx {(1.ポート 61h ヲ ヨム)}
or ax,03h {(2.ビツト 0 ト 1 ヲ ミル)}
mov dx,61h
out dx,ax
end;
end;
//========================================================================
function SpeakerOff :LongInt;
begin
asm
{スピーカを止める}
mov dx,61h {スピーカー OFF}
in ax,dx {(1.ポート 61h ヲ ヨム)}
and ax,0fch {(2.ビツト 0 ト 1 ヲ ケス)}
mov dx,61h
out dx,ax
end;
Result:= 0;
end;
//========================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
SpeakerOpen;
SpeakerOnOff(410 ,2000); // ミドルC を2秒鳴らす。
end;
//========================================================================
procedure TForm1.Button2Click(Sender: TObject);
begin
SpeakerOpen;
{「もう逢えないかもしれない」菊池桃子}
{ には聞こえないか...(^^;}
SpeakerOnOff(410, 200);
SpeakerOnOff(421, 200);
SpeakerOnOff(450, 100);
SpeakerOnOff(450, 100);
SpeakerOnOff(450, 100);
SpeakerOnOff(450, 100);
SpeakerOnOff(450, 800);
SpeakerOnOff(410, 500);
SpeakerOnOff(451, 200);
SpeakerOnOff(451, 200);
SpeakerOnOff(450, 200);
SpeakerOnOff(451, 500);
end;
//========================================================================
Original document by 日印(M_Kid) 氏 ID:(KYB02503)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|