用Delphi写扬声器音乐

简介: 一、窗体   二、代码 窗体代码: unit Unit2; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls,Bl...

一、窗体

 

二、代码

窗体代码:

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,BleepInt;

type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  Bleep(bOk);
end;

 

procedure TForm2.Button2Click(Sender: TObject);
begin
  Bleep(bInterrupt);
end;

 

procedure TForm2.Button3Click(Sender: TObject);
var
  i:Integer;
begin
  for I := 100 to 150 do DoBleep(I*10,10);
  for I := 150 downto 100 do DoBleep(I*10,10); 
end;

 

procedure TForm2.Button4Click(Sender: TObject);
begin
  Bleep(bError);
end;

 

procedure TForm2.Button5Click(Sender: TObject);
begin
  DoBleep(146,250);
  DoBleep(123,250);
  DoBleep(164,500);
  DoBleep(123,500);
  DoBleep(138,125);
  DoBleep(146,250);
  DoBleep(123,250);
  DoBleep(138,500);
  DoBleep(146,500);
  DoBleep(195,500);
  DoBleep(184,500);
  DoBleep(195,500);
  DoBleep(164,500);
  DoBleep(146,250);
  DoBleep(123,250);
  DoBleep(164,250);
  DoBleep(164,250);
  DoBleep(123,1000);
end;

 

procedure TForm2.Button6Click(Sender: TObject);
begin
  if Button6.Caption='噪音' then
  begin
    Button6.Caption:='停止';
    DoBleep(1000,-1);
  end
  else
  begin
    Button6.Caption:='噪音';
    ShutUp;
  end; 
end;

 

end.

 

其中BleepInt.pas(发声的核心函数)代码为:

unit BleepInt;

interface

type
  TBleepType=(bOk,bInterrupt,bError);

  procedure ShutUp;
  procedure DoBleep(Freq:Word;MSecs:Integer);
  procedure Bleep(BleepType:TBleepType);

 

implementation


uses
  Windows,Forms;

  procedure AsmShutUp;
  begin
    asm
      in AL,$61
      and AL,$FC
      out $61,AL
    end;
  end;

 

  procedure AsmBeep(Freq:Word);{$IFDEF WIN32}pascal;{$ENDIF}
  label
    Skip;
  begin
    asm
      push BX
      IN AL,$61
      Mov BL,AL
      and AL,3
      Jne Skip
      Mov AL,BL
      or AL,3
      out $61,AL
      mov AL,$B6
      out $43,AL
    Skip:
      mov AX,Freq
      out $42,AL
      mov AL,AH
      out $42,AL
      pop BX
    end;
  end;

 

  procedure HardBleep(Freq:Word;MSecs:Integer);
  var
    FirstTickCount:{$IFDEF WIN32}Dword{$ELSE}LongInt{$ENDIF};
  begin
    if (Freq>=20) and (Freq<=5000) then
    begin
      AsmBeep(Word(1193181 Div LongInt(Freq)));
      if MSecs>=0 then
      begin
        FirstTickCount :=GetTickCount;
        repeat
          {$IFDEF CONSOLE}if MSecs>1000 then
            Application.ProcessMessages; {$ENDIF}
        until ((GetTickCount-FirstTickCount)>LongInt(MSecs));
        AsmShutUp;
      end;
    end;
  end;

 

  procedure Bleep(BleepType:TBleepType);
  begin
    case BleepType of
      bOk:
        begin
          DoBleep(1047,100);
          DoBleep(1109,100);
          DoBleep(1175,100);
        end;
      bInterrupt:
        begin
          DoBleep(1047,100);
          DoBleep(1109,100);
          DoBleep(1175,100);
        end;
      bError: DoBleep(40,500); 
    end;
  end;

 

  {$IFDEF WIN32}var SysWinnt:Boolean;{$ENDIF}

  procedure DoBleep(Freq:Word;MSecs:Integer);
  begin
    {$IFDEF WIN32}if Syswinnt then
      Windows.Beep(Freq,MSecs)
    else {$ENDIF}
      HardBleep(Freq,MSecs);
  end;

 

  procedure ShutUp;
  begin
    {$IFDEF WIN32}if Syswinnt then
      Windows.Beep(1,0)
    else {$ENDIF}
      AsmShutUp;
  end;

 

  {$IFDEF WIN32}
  procedure InitSysType;
  var
    VersionInfo:TOSVersionInfo;
  begin
    VersionInfo.dwOSVersionInfoSize:=SizeOf(VersionInfo);
    GetVersionEx(VersionInfo);
    SysWinnt:=VersionInfo.dwPlatformId=VER_PLATFORM_WIN32_NT;
  end;

 

  initialization
    InitSysType;

  {$ENDIF} 

end.

 

相关文章
Axure实战18:创建一个PRD产品需求文档生成器
Axure实战18:创建一个PRD产品需求文档生成器
1245 0
Axure实战18:创建一个PRD产品需求文档生成器
|
Dubbo Java 应用服务中间件
Spring Boot、 Spring Cloud 基于Filter 的Dubbo服务权限控制
Spring Boot、 Spring Cloud 基于Filter 的Dubbo服务权限控制
3987 0
|
存储
antd为Tree组件标题附加操作按钮功能
antd为Tree组件标题附加操作按钮功能
783 0
antd为Tree组件标题附加操作按钮功能
|
缓存 编解码 前端开发
阿里云服务器计算网络增强型sn1ne与通用网络增强型sn2ne实例介绍
阿里云在活动中增加了计算网络增强型sn1ne和通用网络增强型sn2ne实例,很多新手用户对这两个实例规格并不是很了解,下面简单介绍下这两个实例的特点、适用场景及网络带宽、网络收发包PPS等指标数据,来了解下这两个实例,以便大家参考选择。
964 0
阿里云服务器计算网络增强型sn1ne与通用网络增强型sn2ne实例介绍
|
算法 Android开发 UED
|
运维 负载均衡 监控
Nacos负载均衡方案
Nacos负载均衡方案
2070 0
Nacos负载均衡方案
|
缓存 资源调度 前端开发
electron踩坑系列之一
以electron作为基础框架,已经开发两个项目了。第一个项目,我主要负责用react写页面,第二项目既负责electron部分又负责UI部分。
2185 0
electron踩坑系列之一
|
安全 网络安全 数据安全/隐私保护
okcc呼叫中心 SIP安全的设置
okcc呼叫中心 SIP安全的设置
|
弹性计算 缓存 监控
云原生体系下 Serverless 弹性探索与实践
SAE 通过对弹性组件和应用全生命周期的不断优化以达到秒级弹性,并在弹性能力,场景丰富度,稳定性上具备核心竞争力,是传统应用 0 改造上 Serverless 的最佳选择。