お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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