DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: snarv
今日帖子: 12
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 hbqckzj (醉里寻欢) ★☆☆☆☆ -
盒子活跃会员
2003/12/9 12:35:00
标题:
请教高手,如何让PC喇叭发声? 浏览:2868
加入我的收藏
楼主: 我在别的网站上见到过一些代码,不过用起来总是出错,
听说好像要用汇编吧,有哪位高手能给出完整而有效的代码吗?
谢谢了!
----------------------------------------------
秋风清 秋月明,几上闲琴黯生尘。
夜来忽忆少年事,陌上柳绿草青青。
相逢一笑言未语,携手相看自倾心。
二十二载云烟里,云含风韵烟含情。
风尘渺落风霜浸,但闻长空雁长鸣。
姿容如花颜如玉,只在平生梦里寻。
秋风清 秋月明,秋灯秋雨愁煞人。
天涯路远人何在,午夜梦回空扰惊。
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/12/9 15:01:28
1楼: 关注
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 dfw@107866 (jacky_shen) ★☆☆☆☆ -
普通会员
2003/12/9 15:06:56
2楼: procedure TForm1.Button1Click(Sender: TObject);
begin
  Windows.Beep(800, 500);
end;
----------------------------------------------
----
VCL
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/12/9 15:14:54
3楼: 试试看行不?
原程序:
{ By Wan Changsheng No:99080049 }
{ Play - (C)opyright 2002 Version 0.01Bata
Autor : Wan Changsheng
eMail : s2k@163.net
Internet : http://www.lovend.com ;}

program play(input,output,list);
uses CRT,dos;
const
key:array [0..21,0..1] of integer=((131,122),(147,120),(165,99),(175,118),(196,98),
(220,110),(247,109),(262,97),(294,115),(330,100),(349,102),(392,103),(440,104),
(494,106),(524,113),(587,119),(659,101),(698,114),(784,116),(880,121),(998,117),(-1,32));
var
inpu:char;
list:text;
i:integer;
filename:string;
begin
if paramcount=0 then
begin
writeln ('Program By Wan Changsheng No:99080049');
writeln ('Play music:music only for PCM 8bit!');
writeln ('Useage:');
writeln (' play [filename]');
writeln ('EXAMPLE:play deom.wav');
end
else if paramcount=1 then
begin
filename:=paramstr(1);
{$i-}
assign (list,filename);
reset (list);
{$i+}
if (ioresult<>0) then writeln ('File not find!')
else
begin
clrscr;
repeat
read (list,inpu);
for i:=0 to 20 do
if (key[i][1]=ord(inpu)) then
begin
nosound;
delay (1); {Sound speed}
sound (key[i][0]);
end
else if (inpu>='0')and(inpu<='9') then
delay ((ord(inpu)-48)*10); {Sound delay}
until (eof(list)) or (keypressed);
nosound;
close (list);
clrscr;
end;
end;
end.
----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 bios (阿贡) ★☆☆☆☆ -
盒子中级会员
2003/12/9 15:22:37
4楼: 在试试看这个,2楼很好用:(学习)

在个人电脑上没有声卡、操作系统为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;
 

----------------------------------------------
按此在新窗口浏览图片
按此在新窗口浏览图片
作者:
男 hbqckzj (醉里寻欢) ★☆☆☆☆ -
盒子活跃会员
2003/12/9 20:39:57
5楼: 二楼的兄弟的windows.beep函数在2000下很好用,在win xp中就不行了

晕,难道WIN XP中就真的不行了吗?
----------------------------------------------
秋风清 秋月明,几上闲琴黯生尘。
夜来忽忆少年事,陌上柳绿草青青。
相逢一笑言未语,携手相看自倾心。
二十二载云烟里,云含风韵烟含情。
风尘渺落风霜浸,但闻长空雁长鸣。
姿容如花颜如玉,只在平生梦里寻。
秋风清 秋月明,秋灯秋雨愁煞人。
天涯路远人何在,午夜梦回空扰惊。
作者:
男 hbqckzj (醉里寻欢) ★☆☆☆☆ -
盒子活跃会员
2003/12/9 20:46:09
6楼: 俺把这个函数反复试了,还写了几行代码专门测试这个函数的效果

以下代码可以实现用PC喇叭发声:

procedure TForm1.Button1Click(Sender: TObject);
begin
windows.Beep(strtoint(edit1.Text),strtoint(edit2.Text));
end;


上述代码运行时,在edit1和edit2中输入参数,就可以听到不同频率下的PC喇叭声音了。
第一个参数越大,声音越尖锐,不过最大到了8000时就没有声音了;第二个参数越大,发声时间越长。
例程在windows xp不能发声,在win2000中正常,我个人调试之后,觉得windows.Beep(2000,200)时声音最好听哈。
多日来困绕的问题总算解决了一半,谢谢楼上的两位热心兄弟哈!

另外,哪位高手可以指教在WIN XP下用PC喇叭发声的方法啊?
----------------------------------------------
秋风清 秋月明,几上闲琴黯生尘。
夜来忽忆少年事,陌上柳绿草青青。
相逢一笑言未语,携手相看自倾心。
二十二载云烟里,云含风韵烟含情。
风尘渺落风霜浸,但闻长空雁长鸣。
姿容如花颜如玉,只在平生梦里寻。
秋风清 秋月明,秋灯秋雨愁煞人。
天涯路远人何在,午夜梦回空扰惊。
作者:
男 bryan (bao) ★☆☆☆☆ -
盒子活跃会员
2003/12/9 22:51:38
7楼: 我用的就是英文版的XP,用beep可以发声的.
----------------------------------------------
-
作者:
男 xinhua (傻林) ★☆☆☆☆ -
盒子活跃会员
2003/12/29 8:13:36
8楼: 十分谢谢了。
----------------------------------------------
愿和所有喜欢DELPHI的人成为朋友!!
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS