在 Delphi 下使用 DirectSound (14): 测试镶边效果器 IDirectSoundFXFlanger8


{相关结构:}
TDSFXFlanger = packed recordfWetDryMix: Single; //  0 .. 100  : 50  (%)fDepth: Single;     //  0 .. 100  : 100 (%)fFeedback: Single;  //-99 .. 99   : -50 (%)fFrequency: Single; //  0 .. 10   : 0.25lWaveform: Longint; //  0 .. 1    : 1fDelay: Single;     //  0 .. 4    : 2   (ms)lPhase: Longint;    //  0 .. 4    : 2
end;//该结构相关常量:
DSFXFLANGER_WETDRYMIX_MIN = 0.0;
DSFXFLANGER_WETDRYMIX_MAX = 100.0;DSFXFLANGER_DEPTH_MIN     = 0.0;
DSFXFLANGER_DEPTH_MAX     = 100.0;DSFXFLANGER_FEEDBACK_MIN  = -99.0;
DSFXFLANGER_FEEDBACK_MAX  = 99.0;DSFXFLANGER_FREQUENCY_MIN = 0.0;
DSFXFLANGER_FREQUENCY_MAX = 10.0;DSFXFLANGER_WAVE_TRIANGLE = 0;
DSFXFLANGER_WAVE_SIN      = 1;DSFXFLANGER_PHASE_MIN     = 0;
DSFXFLANGER_PHASE_MAX     = 4;DSFXFLANGER_DELAY_MIN     = 0.0;
DSFXFLANGER_DELAY_MAX     = 4.0;DSFXFLANGER_PHASE_NEG_180 = 0;
DSFXFLANGER_PHASE_NEG_90  = 1;
DSFXFLANGER_PHASE_ZERO    = 2;
DSFXFLANGER_PHASE_90      = 3;
DSFXFLANGER_PHASE_180     = 4;


测试代码:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;LabeledEdit1: TLabeledEdit;LabeledEdit2: TLabeledEdit;LabeledEdit3: TLabeledEdit;LabeledEdit4: TLabeledEdit;LabeledEdit5: TLabeledEdit;RadioGroup1: TRadioGroup;RadioGroup2: TRadioGroup;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure RadioGroup1Click(Sender: TObject);procedure LabeledEdit1Change(Sender: TObject);procedure FormDestroy(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}uses DirectSound, ReadWave2;varmyDSound: IDirectSound8;buf8: IDirectSoundBuffer8;fxFlanger: IDirectSoundFXFlanger8; //IDirectSoundFXFlanger8 效果器procedure TForm1.FormCreate(Sender: TObject);
beginSystem.ReportMemoryLeaksOnShutdown := True;DirectSoundCreate8(nil, myDSound, nil);myDSound.SetCooperativeLevel(Handle, DSSCL_NORMAL);Button1.Caption := '打开并播放';Button2.Caption := '停止播放';LabeledEdit1.EditLabel.Caption := 'fWetDryMix: 0.0 - 100.0';LabeledEdit1.Text := '50.0';LabeledEdit1.Tag := 1;LabeledEdit2.EditLabel.Caption := 'fDepth: 0.0 - 100.0';LabeledEdit2.Text := '100.0';LabeledEdit2.Tag := 2;LabeledEdit3.EditLabel.Caption := 'fFeedback: -99.0 - 99.0';LabeledEdit3.Text := '-50.0';LabeledEdit3.Tag := 3;LabeledEdit4.EditLabel.Caption := 'fFrequency: 0.0 - 10.0';LabeledEdit4.Text := '1.0';LabeledEdit4.Tag := 4;LabeledEdit5.EditLabel.Caption := 'ffDelay: 0.0 - 4.0';LabeledEdit5.Text := '2.0';LabeledEdit5.Tag := 5;RadioGroup1.Caption := 'lWaveform:';RadioGroup1.Items.CommaText := 'WAVE_TRIANGLE, WAVE_SIN';RadioGroup1.ItemIndex := 1;RadioGroup2.Caption := 'lPhase:';RadioGroup2.Items.CommaText := '-180,-90,0,90,180';RadioGroup2.ItemIndex := 2;LabeledEdit2.OnChange := LabeledEdit1.OnChange;LabeledEdit3.OnChange := LabeledEdit1.OnChange;LabeledEdit4.OnChange := LabeledEdit1.OnChange;LabeledEdit5.OnChange := LabeledEdit1.OnChange;RadioGroup2.OnClick := RadioGroup1.OnClick;
end;procedure TForm1.Button1Click(Sender: TObject);
varbuf: IDirectSoundBuffer;bufDesc: TDSBufferDesc;rEffect: TDSEffectDesc;wav: TReadWave;p1: Pointer;n1: DWORD;
beginwav := TReadWave.Create;if not wav.OpenDialog then begin wav.Free; Exit; end;ZeroMemory(@bufDesc, SizeOf(TDSBufferDesc));bufDesc.dwSize := SizeOf(TDSBufferDesc);bufDesc.dwFlags := DSBCAPS_CTRLFX;bufDesc.dwBufferBytes := wav.Size;bufDesc.lpwfxFormat := @wav.Format;myDSound.CreateSoundBuffer(bufDesc, buf, nil);buf.QueryInterface(IID_IDirectSoundBuffer8, buf8);buf8.Lock(0, 0, @p1, @n1, nil, nil, DSBLOCK_ENTIREBUFFER);wav.Read(p1, n1);wav.Free;buf8.Unlock(p1, n1, nil, 0);ZeroMemory(@rEffect, SizeOf(TDSEffectDesc));rEffect.dwSize := SizeOf(TDSEffectDesc);rEffect.dwFlags := 0;rEffect.guidDSFXClass := GUID_DSFX_STANDARD_FLANGER;buf8.SetFX(1, @rEffect, nil);buf8.GetObjectInPath(GUID_DSFX_STANDARD_FLANGER, 0, IID_IDirectSoundFXFlanger8, fxFlanger);buf8.Play(0, 0, DSBPLAY_LOOPING);
end;procedure TForm1.Button2Click(Sender: TObject);
beginif Assigned(buf8) then buf8.Stop;
end;procedure TForm1.RadioGroup1Click(Sender: TObject);
varrFlanger: TDSFXFlanger;
beginif buf8 = nil then Exit;rFlanger.fWetDryMix := StrToFloat(LabeledEdit1.Text);rFlanger.fDepth     := StrToFloat(LabeledEdit2.Text);rFlanger.fFeedback  := StrToFloat(LabeledEdit3.Text);rFlanger.fFrequency := StrToFloat(LabeledEdit4.Text);rFlanger.lWaveform  := RadioGroup1.ItemIndex;rFlanger.fDelay     := StrToFloat(LabeledEdit5.Text);rFlanger.lPhase     := RadioGroup2.ItemIndex;fxFlanger.SetAllParameters(rFlanger);
end;procedure TForm1.LabeledEdit1Change(Sender: TObject);
varf: Single;obj: TLabeledEdit;
beginobj := Sender as TLabeledEdit;if obj.Text = '-' then Exit;f := StrToFloatDef(obj.Text, MaxInt);case obj.Tag of1: if (f < 0)   or (f > 100) then obj.Text := '50.0';2: if (f < 0)   or (f > 100) then obj.Text := '100.0';3: if (f < -99) or (f > 99)  then obj.Text := '-50.0';4: if (f < 0)   or (f > 10)  then obj.Text := '0.25';5: if (f < 0)   or (f > 20)  then obj.Text := '2';end;RadioGroup1.OnClick(nil);
end;procedure TForm1.FormDestroy(Sender: TObject);
beginbuf8 := nil;myDSound := nil;
end;end.


窗体设计:
object Form1: TForm1Left = 0Top = 0Caption = 'Form1'ClientHeight = 287ClientWidth = 314Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'Tahoma'Font.Style = []OldCreateOrder = FalseOnCreate = FormCreateOnDestroy = FormDestroyPixelsPerInch = 96TextHeight = 13object Button1: TButtonLeft = 24Top = 18Width = 75Height = 25Caption = 'Button1'TabOrder = 0OnClick = Button1Clickendobject Button2: TButtonLeft = 120Top = 18Width = 75Height = 25Caption = 'Button2'TabOrder = 1OnClick = Button2Clickendobject LabeledEdit1: TLabeledEditLeft = 24Top = 72Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit1'TabOrder = 2OnChange = LabeledEdit1Changeendobject LabeledEdit2: TLabeledEditLeft = 24Top = 115Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit2'TabOrder = 3endobject LabeledEdit3: TLabeledEditLeft = 24Top = 160Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit3'TabOrder = 4endobject LabeledEdit4: TLabeledEditLeft = 24Top = 208Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit4'TabOrder = 5endobject LabeledEdit5: TLabeledEditLeft = 24Top = 253Width = 138Height = 21EditLabel.Width = 61EditLabel.Height = 13EditLabel.Caption = 'LabeledEdit5'TabOrder = 6endobject RadioGroup1: TRadioGroupLeft = 177Top = 56Width = 129Height = 64Caption = 'RadioGroup1'TabOrder = 7OnClick = RadioGroup1Clickendobject RadioGroup2: TRadioGroupLeft = 176Top = 136Width = 129Height = 138Caption = 'RadioGroup2'TabOrder = 8end
end


运行效果图:

o_20111023_3.png

转载于:https://www.cnblogs.com/del/archive/2011/01/23/1942732.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410744.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 说说如果a链接href=““(空)时点击时会有什么表现?

[html] 说说如果a链接href""&#xff08;空&#xff09;时点击时会有什么表现&#xff1f; 不会进行跳转&#xff0c;会刷新当前页面个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

html判断是否在页面,html判断当前页面是否在iframe中的实例

html判断当前页面是否在iframe中的实例在做HTML页面的时候&#xff0c;经常会遇到“如果当前页面显示在iframe中&#xff0c;我们就相应的处理”判断方法为&#xff1a;//判断是否在iframe中if(self!top){parent.window.location.replace(window.location.href);}以上这篇html判…

一种用户体验-显示对话框时灰化你的主窗体

袁永福 ( http://www.xdesigner.cn ) 2007&#xff0d;8&#xff0d;10 程序全部源代码下载(工程文件使用VS.NET2003格式):/Files/xdesigner/DisableMask.rar 在一些Web程序中,有一种页面效果,当弹出一个模拟的对话框时,主页面就整体灰化了,其他的元素不能动弹,只有这个对话框能…

sql经典语句

一、基础 1、说明&#xff1a;创建数据库 CREATE DATABASE database-name 2、说明&#xff1a;删除数据库 drop database dbname 3、说明&#xff1a;备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.d…

[html] html元素哪些标签是不可替换元素?哪些是可替换元素?

[html] html元素哪些标签是不可替换元素&#xff1f;哪些是可替换元素&#xff1f; 可替换元素&#xff08;replaced element&#xff09;的展现效果不是由 CSS 来控制的。这些元素是一种外部对象&#xff0c;它们外观的渲染&#xff0c;是独立于 CSS 的。也就是说&#xff0c…

html文档中用于表示页面标题的标记对是,汽车发动机拆装与检修实训超星尔雅答案...

摘要&#xff1a;汽车生活事件也称为应激源( )在教师的直接领导下整个班级的学生一起进行的学习&#xff0c;机拆检修称为( )实训教学二字连用最早出自( )...汽车生活事件也称为应激源( )发动下列不属于课程与教学关系观的是( )在教师的直接领导下整个班级的学生一起进行的学习…

一些类的概念

1、异常处理 try: pass except: pass2、面向对象 怎么用类 面向过程#1、4s店#2、保险公司&#xff0c;上保险#3、税务局交税#4、车管所 面向对象1&#xff1a;买车处 #1、4s店 #2、保险公司&#xff0c;上保险 #3、税务局交税…

[html] 请使用canvas画一个椭圆

[html] 请使用canvas画一个椭圆 <script> var cdocument.getElementById("myCanvas"); var ctxc.getContext("2d"); ctx.beginPath(); ctx.arc(95,50,40,0,2*Math.PI); ctx.stroke(); </script> 个人简介 我是歌谣&#xff0c;欢迎和大家一起…

html 跟随鼠标移动线条,canvas跟随鼠标移动的随机线条

/** type {HTMLCanvasElement} */let canvas document.querySelector(#canvas);let cxt canvas.getContext(2d);let w canvas.width window.innerWidth;let h canvas.height window.innerHeight;mousePosition {x: Number,y: Number}//随机颜色function ranColor() {ret…

go 优秀文档

go语言资料汇总 &#xff1a; https://blog.zhnytech.com/articles/2016/07/15/Golang%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E6%94%B6%E9%9B%86.html github资料基础&#xff1a;https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/directory.md k8s国外镜像 …

Python 程序 运行过程

一. Python 解释器 Python 是一门编程语言&#xff0c;同时也是一个解释器的软件包。 解释器是一种让其他程序运行起来的程序。 当你编写了一段Python 程序&#xff0c;Python 解释器将读取程序&#xff0c;并按照其中的命令执行&#xff0c;得出结果。解释器是代码与计算机硬…

[html] 在H5中如何预加载音频?

[html] 在H5中如何预加载音频&#xff1f; audio标签默认会预加载个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

H5|web移动前端自适应适配布局解决方案

方案&#xff1a; 固定一个某些宽度&#xff0c;使用一个模式&#xff0c;加上少许的媒体查询方案使用flexbox解决方案使用百分比加媒体查询使用rem1. 简单问题简单解决 我觉得有些web app并一定很复杂&#xff0c;比如拉勾网&#xff0c;你看看它的页面在iphone4,iphone6,ipad…

[转] 用Diff和Patch工具维护源码

在Unix系统下&#xff0c;维护源码版本可以使用很多方法&#xff0c;其中最常用的当然是大名鼎鼎的CVS&#xff0c;但实际上&#xff0c;简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具&#xff0c;Unix标配中的diff和patch工具就完全可以完成代码的简单备份和…

[html] 当页面中使用application/xhtml+xml会出现什么问题吗?

[html] 当页面中使用application/xhtmlxml会出现什么问题吗&#xff1f; 要求比较严格&#xff0c;必须有head、body标签且每个元素必须是关闭的。一些老的浏览器不支持&#xff0c;实际上&#xff0c;任何最新的浏览器都将支持application/xhtmlxml媒体类型。大多数浏览器也接…

html5 本地保存大数据库,HTML5本地储存 - jellydd的个人空间 - OSCHINA - 中文开源技术交流社区...

传统方式我们用document.cookie来储存&#xff0c;但是储存大小较小&#xff0c;而且解析复杂&#xff0c;HTML5提出新的解决方案&#xff0c;使用sessionStorage和localStorage存储数据。localStorage&#xff1a;1. 永久生效2. 多窗口共享3. 容量大约为20M◆window.localStor…

[html] H5的Web Storage带来什么好处?

[html] H5的Web Storage带来什么好处&#xff1f; 存储的数据量更大&#xff0c;可以达到 5M&#xff1b;减少不必要的数据请求&#xff0c;不会自动把数据发送给服务器localStorage 可以把数据永久保存在本地&#xff0c;除非显示的清除或删除数据支持事件通知机制API 更加方便…

「BZOJ2654」tree

「BZOJ2654」tree 最小生成树二分答案。 最开始并没有觉得可以二分答案&#xff0c;因为答案并不单调啊。 其实根据题意&#xff0c;白边的数目肯定大于need条&#xff0c;而最小生成树的白边数并不等于need&#xff08;废话&#xff09;&#xff0c;可以二分将每条白边的权值m…

jQuery 结合 Json 提交数据到Webservice,并接收从Webservice返回的Json数据

简单的Json数据提交 jQuery ajax webservice&#xff1a;get 和 post 一、GET 方式客户端代码vardata { classCode: "0001"}; //这里要直接使用JOSN对象$.ajax({ type: "GET", contentType: "application/json; chars…

html服务器框架,一种类似http/html的分布式GUI程序设计框架

笔者构想了一种类似http/html的分布式GUI程序设计框架&#xff0c;适用于WIndows、桌面Linux、Mac OS以及C&#xff0c;Java&#xff0c;Python等多种支持GUI编程的程序设计系统。但是对于手机小屏幕&#xff0c;可能不合适。本系统包括窗口描述规则;gui.exe -- 一个命令行程序…