让pc speaker美妙动听

2008-04-09 04:18:27来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折


  在个人电脑上没有声卡、操作系统为16位DOS的时代,用PC SPEAKER(主板上的喇叭)发音曾经是唯一的选择。现在,时光已经进入32位的WINDOWS时代,几乎每台电脑上都装有声卡并且输出的声音也几近完美,人们渐渐将PC SPEAKER遗忘……。不过,当我们为了节省能源或不需要操作高品质声音而将音箱关掉时,是否可以请老古董PC SPEAKER 重出江湖,为我们做些有益的事情呢?比如,本人就用DELPHI写了一个让PC SPEAKER奏出不同的音调,模拟海关钟报时的小程序(当然在32位的视窗环境中)。下面就简述其发音原理及源程序的核心部分:

  发音原理 : 在16位DOS环境中,用当时流行的开发工具(如FOXBASE,TC等)均能轻而易举地写出让PC SPEAKER发出不同音调的程序,不过在WIN32下,似乎有些小问题:翻遍WINAPI,只能找到唯一的一个能让PC SPEAKER发音的函数—Beep( dwFreq, dwDuration)其中,dwfreq为声音频率,单位为赫兹,dwDuration为声音长度,单位为毫秒。这两个参数仅在WINDOWS NT环境下有效,在WINDOWS 9X 下只能让PC SPEAKER发一声标准的beep音,毫无音调变化。怎么办? 经过努力,本人在网上找到了一个由英国人John Atkins用汇编写的操纵底层资源的发音函数:

  function _GetPort(address:word):word;//获取端口

   var

    bValue: byte;

   begin

    asm

     mov dx, address

     in al, dx

     mov bValue, al

   end;

   Result := bValue;

  end;

  procedure _SetPort(address, Value:Word);//设置端口

   var

    bValue: byte;

   begin

    bValue := Trunc(Value and 255);

    asm

     mov dx, address

     mov al, bValue

     out dx, al

    end;

   end;

  procedure StartBeep(Freq : Word);//开始发音,Freq为频率

   var

    B: Byte;

   begin

    if Freq >18 then

     begin

      Freq := Word(1193181 div LongInt(Freq));

      B := Byte(_GetPort($61));

    if (B and 3) = 0 then

     begin

      _SetPort($61, Word(B or 3));

      _SetPort($43, $B6);

     end;

     _SetPort($42, Freq);

     _SetPort($42, Freq shr 8);

   end;

   end;

  procedure StopBeep;//停止发音

    var

     Value: Word;

    begin

     value := _GetPort($61) and $FC;

     _SetPort($61, Value);

  end;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Delphi中MsComm控件的安装使用

下一篇:自编扫雷程序详解(Delphi版)

热门词条
热门标签