VB.NET实现DirectSound9 (6) 声音特效

关键字: VB.NET DirectSound 9 声音特效 回声Echo 作者:董含君
转载请注明来自:http://blog.csdn.net/a11s

实际上这个就是传说的混音,微软把各种效果添加起来变成了混音程序
严格的讲,这个算作声音的特效.

微软的DirectX的例子还有一个特点,就是爱把简单的问题复杂化,我用了大量的时间搞清出中间的各种对象怎样协作的,明白之后再来考虑各自的用途.虽然相信微软这么做也许是有道理的,但是不适合初学者.经过尝试整理出了以下结果.

首先大体介绍一下步骤
============================================================
加载
1 需要设备以及一个缓冲用于播放声音(具体请参见前文的介绍)

2 描述这个缓冲区的时候,记得加上ControlEffects=true的属性(跟ControlVolume是一个道理)

读取
3 new SecondaryBuffer读取文件,这个文件如果太小,则会出现错误.无法体现效果,需要try catch一下

设置效果
4 设置效果需要介绍一些对象,稍后再说

5 播放,同时可以进行相关属性的操作

6 特效的移除
7 停止播放
=====================================

由此可见,大体步骤跟3D音效类似,只不过中间多了效果设置而已

以下是对象的介绍.

1 首先需要了解,一个声音(Buffer)可以同时应用多种效果
这样就产生了一个问题,如何才能设置我们的SecondaryBuffer有这些效果

DirectSound是用一个数组来表示的,添加一个效果,这个数组就有一个元素.两个效果,这个数组就有两个元素.
依次类推.

我们的SecondaryBuffer应用的时候,是直接将这个数组一同传递给SecondaryBuffer的.
SB.SetEffects(effd)

2 不要以为什么特效都要自己做(天!千万别这么想,否则需要专门研究计算机声学的)
微软DirectSound内置了几种特效,可以参见微软SDK最后的那个例子,也可以用
DSoundHelper.StandardEchoGuid 类似的这种形式列出

3 每种特效的属性都是一个结构体(也可以理解为对象).我们有很多特效的对象
比如 Dim echo As EchoEffect

4 每种特效对象的属性是一个结构体(需要跟上面区分开来)
比如RchoEffect对象不能直接用这种方法修改echo.WetDryMix属性
需要利用一个结构体来完成echo属性的存储,这个结构体叫做
EffectsEcho (微软真是作孽啊,名字取得都这么像,很难区分的)
Dim eff As New EffectsEcho '''结构
eff = echo.AllParameters
eff.WetDryMix = 0
eff.Feedback = 0
eff.LeftDelay = 1
eff.RightDelay = 1
eff.PanDelay = 0
设置完成之后,一次性传给特效对象echo
echo.AllParameters = eff

5 Buffer播放的时候可以可以调整特效属性的,只要修改echo.allparameters就可以了

知道中间怎么做的了,然后看代码

代码分为几个部分,主要还是为了容易理解
第一步,初始化设备(实在太经典了,就不用看了)
第二步,加载wav(就是多了一个controlEffect,别的都一样)
第三步,设置音效(单独看)
第四步,播放(简单一个play)
第五步,停止播放

Imports Microsoft.DirectX.DirectSound

Public Class Form1

Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()

MyBase.New()

'该调用是 Windows 窗体设计器所必需的。

InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化

End Sub

'窗体重写 dispose 以清理组件列表。

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

If disposing Then

If Not (components Is Nothing) Then

components.Dispose()

End If

End If

MyBase.Dispose(disposing)

End Sub

'Windows 窗体设计器所必需的

Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的

'可以使用 Windows 窗体设计器修改此过程。

'不要使用代码编辑器修改它。

Friend WithEvents TextBox1 As System.Windows.Forms.TextBox

Friend WithEvents Button1 As System.Windows.Forms.Button

Friend WithEvents Button2 As System.Windows.Forms.Button

Friend WithEvents Button3 As System.Windows.Forms.Button

Friend WithEvents Button4 As System.Windows.Forms.Button

Friend WithEvents Button5 As System.Windows.Forms.Button

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

Me.TextBox1 = New System.Windows.Forms.TextBox

Me.Button1 = New System.Windows.Forms.Button

Me.Button2 = New System.Windows.Forms.Button

Me.Button3 = New System.Windows.Forms.Button

Me.Button4 = New System.Windows.Forms.Button

Me.Button5 = New System.Windows.Forms.Button

Me.SuspendLayout()

'

'TextBox1

'

Me.TextBox1.Location = New System.Drawing.Point(104, 40)

Me.TextBox1.Name = "TextBox1"

Me.TextBox1.Size = New System.Drawing.Size(160, 21)

Me.TextBox1.TabIndex = 2

Me.TextBox1.Text = "g:\media\wav\rod2.wav"

'

'Button1

'

Me.Button1.Location = New System.Drawing.Point(16, 8)

Me.Button1.Name = "Button1"

Me.Button1.Size = New System.Drawing.Size(80, 24)

Me.Button1.TabIndex = 3

Me.Button1.Text = "init"

'

'Button2

'

Me.Button2.Location = New System.Drawing.Point(16, 40)

Me.Button2.Name = "Button2"

Me.Button2.Size = New System.Drawing.Size(80, 24)

Me.Button2.TabIndex = 4

Me.Button2.Text = "load"

'

'Button3

'

Me.Button3.Location = New System.Drawing.Point(16, 72)

Me.Button3.Name = "Button3"

Me.Button3.Size = New System.Drawing.Size(80, 24)

Me.Button3.TabIndex = 5

Me.Button3.Text = "play"

'

'Button4

'

Me.Button4.Location = New System.Drawing.Point(16, 104)

Me.Button4.Name = "Button4"

Me.Button4.Size = New System.Drawing.Size(80, 24)

Me.Button4.TabIndex = 6

Me.Button4.Text = "stop"

'

'Button5

'

Me.Button5.Location = New System.Drawing.Point(280, 40)

Me.Button5.Name = "Button5"

Me.Button5.Size = New System.Drawing.Size(88, 24)

Me.Button5.TabIndex = 7

Me.Button5.Text = "Echo"

'

'Form1

'

Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)

Me.ClientSize = New System.Drawing.Size(400, 269)

Me.Controls.Add(Me.Button5)

Me.Controls.Add(Me.Button4)

Me.Controls.Add(Me.Button3)

Me.Controls.Add(Me.Button2)

Me.Controls.Add(Me.Button1)

Me.Controls.Add(Me.TextBox1)

Me.Name = "Form1"

Me.Text = "Form1"

Me.ResumeLayout(False)

End Sub

#End Region

Dim Dev As Device

Dim PB As Buffer

Dim SB As SecondaryBuffer

Dim Desc1 As BufferDescription

Dim desc2 As BufferDescription

Dim eff As EffectDescription

Private Structure EffectInfo

Public description As EffectDescription

Public EffectSettings As Object

Public Effect As Object

End Structure

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

'''加载DirectSound

Dev = New Device

Dev.SetCooperativeLevel(Me, CooperativeLevel.Priority)

Me.Text = "init ok"

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

'''读取wav

Desc1 = New BufferDescription

Desc1.ControlEffects = True

SB = New SecondaryBuffer(TextBox1.Text, Desc1, Dev)

Me.Text = "load ok"

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

'''播放啊播放

If SB Is Nothing Then Exit Sub

SB.Play(0, BufferPlayFlags.Default)

Me.Text = "playing"

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

'''停止播放,释放当前的wav

SB.Stop()

SB.Dispose()

Me.Text = "disposed"

End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

'''主要看这个

''' 我的数组声明了一个元素,看起来没有必要,但是设置的时候要求必须是数组,哪怕元素只有一个

''' 如果需要更多的效果,设置相应的元素个数

Dim effd(0) As EffectDescription ''描述集合

Dim eff As New EffectsEcho '''结构,由于对象不能单独设置属性,只能用它间接修改

'''关键步骤,指定特效的类型

effd(0).GuidEffectClass = DSoundHelper.StandardEchoGuid '''说明第一种效果是回声

'''软件,你要是用硬件,我也不反对

effd(0).LocateInSoftware = True

'''直接一次性提交给Buffer,提交的是一个数组

SB.SetEffects(effd)

'''声明一个特效对象,别忘了我们需要修改参数滴

Dim echo As EchoEffect

'''得到当前Buffer的效果

''' 这个后面的0,正是你一次性传递过去的效果的index,忘了?就是刚才那个数组

echo = SB.GetEffects(0)

'''对象不能直接修改,所以用它来间接改

eff = echo.AllParameters

eff.WetDryMix = 50

eff.Feedback = 50

eff.LeftDelay = 500

eff.RightDelay = 500

eff.PanDelay = 0

'''OK,就这样,你可以尝试用其他数据代替里面的数值,其中LeftDelay跟RightDelay的定义域在1~2000,

''' 你可以用echo的属性得到最大最小数值(方便了很多)

echo.AllParameters = eff

Me.Text = "echo ok"

End Sub

End Class

好了,复制过去直接运行就可.

我用了Echo作为例子来说明问题(估计这个用的也是最多,效果最明显的)还有很多,你参照微软的例子,再改改上面的代码就能轻松实现,我就不废话了.

下一步.录音

时间: 2024-11-03 03:23:23

VB.NET实现DirectSound9 (6) 声音特效的相关文章

VB.NET 实现DirectSound9 (5) DS3D2

关键字: VB .NET DirectX DirectSound 3D 作者:董含君 经过一下午的奋战,走了若干弯路,终于可以播放3D声音效果了 感动 ~ ~ 大体按照下列的步骤来: 1 关联设备 SetCooperativeLevel2 设置3D硬件效果 DSoundHelper.Guid3DAlgorithmHrtfFull3 格式要求 SoundFormat 必须是单声道,不能是立体声4 主要缓冲区描述5 创建Listenner6 辅助缓冲区读取wav7 创建3D缓冲区8 播放9 控制空间

用VB.Net实现DirectSound9 (4) DS3D

关键字:VB DirectX9 DirectSound 3D 作者:董含君 昨天去百度搜索DirectSound3D的资料,真是一点都没有.惊讶啊. google有一些,还是微软的.看来真的要填补国内空白了. 高手门看来都很忙啊. ========以上是废话================ 一开始看微软DSound3D的例子很困难,主要是术语太多,如果准备工作做的不够,可以说几乎看不懂. 从家里翻出一本DirectX的速成教材,看来有解释的必要. =========以下是正文==========

VB.NET实现DirectSound9 (7) 录音

关键字: VB.NET DirectX 9 DirectSound 录音 riff文件格式 作者:董含君 下午看了微软提供的例子,居然把录音定位成Beginner级别晕哦,虽说我认为这个例子是微软提供的最"直接"的例子,但是步骤超多.而且还牵扯到多线程开辟缓冲区回调riff文件格式 IO 输出等等.由于录音的复杂性,以及微软这个例子的直接性,坚持原创的我最终还是复制了大量的代码.(希望不要骂我....) OK,先来说录音的步骤,里面牵扯到riff或者使用技巧的地方,有注释.我仅仅说步骤

flash声音特效实例精选--声道的控制

左右声道的调节,我们在日常生活中经常遇到,但如果用Flash来实现,岂不更好,其实这也非常简单,在Flash中可以轻松实现,在制作过程中主要使用了ActionScript脚本进行控制,最终播放效果如图1所示,要实现这一效果,具体操作步骤如下: 图1 声道控制效果 1.新建一影片,设置其尺寸为200xpX200px(单位为像素),设置其背景色为#CCCCCC, 当然用户可以根据需要自行设置.按"Ctrl+R",快捷键打开导入对话框,导入一声音文件. 2.新建一影片剪辑"drum

flash声音特效实例精选--音量调节

该实例实现的是使用Flash控制音量的效果,可以向文本框中输入音量的值来调节音量,最终效果及界面如图1所示,要实现这一效果,具体操作步骤如下 图1 "音量控制"界面 在制作过程中使用的动态文本框,以及ActionScript脚本,如attachSound().getVolume()等函数,具体操作步骤如下: 1.新建一影片,设置其尺寸为300xpX250px(单位为像素),设置其背景色为#009900, 当然用户可以根据需要自行设置.按"Ctrl+R",快捷键打开导

flash声音特效实例精选--架子鼓

架子鼓,在乐器中算得上是操作比较复杂的一中乐器,在很多场合中都要用到这一乐器,现在,我们可以使用Flash制作属于自己的架子鼓了,只需要滑动鼠标就可以轻松演凑出动听的音乐来,最终效果如图1所示. 图1 架子鼓 架子鼓看似很复杂,其实制作起来还是比较简单的,按钮的应用在这节里可以说是发挥到了极至,基制作过程中,只使用了一些简单的脚本,如"Stop()"等,主要是制作按钮,以鼠标滑过时发出声音,同时在按某些指定的数字键时也会发出对应的声音来,为了在制作过程中便于操作,我们先为图中的各部分标

flash声音特效实例精选--声音开关按钮

该实例实现的是一声音开关按钮效果,用鼠标点击即可实现声音开关控制,最终效果如图1所示,要实现这一效果,具体操作步骤如下: 图1 声音按钮 1.新建一影片,设置其尺寸为200xpX200px(单位为像素),设置其背景色为#0099CC, 当然用户可以根据需要自行设置.按"Ctrl+R",快捷键打开导入对话框,导入一声音文件. 2.新建一图形元件"circle",在时间轴中选中第1帧插入一关键帧,按下"Shift"键,使用椭圆工具在工作区中绘制一圆,

js变形金刚文字特效代码分享_javascript技巧

为大家分享的js变形金刚文字特效代码如下 -----------------------------------------------效果演示----------------------------------------------- <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>js变形金刚文字特效&l

(DirectX系列01)DirectSound 3D语音特效

       近日正在学习DirectX,主要用于视频监控和流媒体方面应用,学习<Visual C++音视频处理技术和工程实践>已经有大半,一直想写些感受,兴趣所致,今天重新学习了下DirectSound 3D语音特效,并编写一些代码,在此分享出来,希望对大家能有所帮助.        大家都有这种感觉,当我们离发声源越来越远的时候,声音越来越小.DirectSound就是模仿这些现象,从数学理论角度加以描述.当然,影响音效的因素不光只有这些,还有如Doppler效应等,但是DirectSou