×

DirectX与VB.NET编程(八)*EQ均衡器

Kalet Kalet 发表于2009-03-20 12:00:14 浏览245 评论0

抢沙发发表评论

(扩展学习)
好久没有更新文章了,最近在收集EQ均衡器的知识,顺便做最后的DEMO,所以时间比较推迟。
通过DirectSound播出的一段声音,并不是由一个固定频率的声波引起的,而是由成千上万不同频率的声波组合而成,每个频率都有自己的强度和宽度。DirectX与VB.NET编程(八)*EQ均衡器
EQ均衡器是能够调节声音在各频率上的强度和扩散宽度,如果此时用户需要实现重低音的效果,那么只要将低频率的声音强度加强,高频率的声音减弱,就可以听到重低音的效果了,同样道理,EQ还可以模拟各种现场效果、突出主题声音等,在音频方面具有举足轻重的地位。图1是Winamp中的均衡器模型。



 

图1

这次的例题是一个EQ均衡器,同样也是采用DirectSound实现。

===============华丽的分割线===============


学习要点
·了解EQ均衡器的基本原理;
·了解DirectSound操作EQ均衡器的原理;
·能过适用DirectSound实现基本的均衡器。


===============华丽的分割线===============


EQ均衡器的基本原理上面已经概述过了,这里首先需要说明的是DirectSound操作EQ均衡器的原理。
DirectSound操作EQ均衡器使用的是使用声音特效中的ParamEQ特效来实现,ParamEQ特效拥有Center Freq(中心频率)、Bandwidth(扩散宽度)和Gain(强度)范围,我们只要改变这个特效的效果,就可以实现EQ均衡器。
Center Freq(中心频率):由于声音是由许多不同频率的声音混合播出的,因此,如果需要改变强度,首先必须指定需要改变轻度的频率,这个频率就是中心频率。通常人耳所能听到的频率范围是20Hz-20kHz,因此,没有必要将中心频率超过这个范围。
Bandwidth(扩散宽度):请看图2,图2中有一个频率的强度已经被改变,但是请注意,这个频率强度被改变时,它周围频率的强度也发生了曲折,也就是说,一个频率的强度被改变时,它周围频率的强度也会发生变化,而这个变化的影响范围就是扩散宽度,由此可以推出,宽度越小,图中的弧线将越陡峭,强度改变的范围越小。在DirectSound中,扩散宽度的取值范围是1-36(Hz)。


 

图2

Gain(强度):前面已经数次提到强度这个概念,大家应该很容易明白,强度就是指定频率的声音强度。在DirectSound中,强度的取值范围是-15-15(dB)。


===============华丽的分割线===============


本例在这里使用的频率是100Hz、200Hz、400Hz、600Hz、1kHz、3kHz、6kHz、12kHz、14kHz、16kHz,扩散宽度为36Hz,强度范围为-12dB12dB


===============华丽的分割线===============


请在窗口上放置13个标签(Lable)和10个滑槽(TrackBar),窗口设计请参考图3。


 

图3

===============华丽的分割线===============


首先声明设备的缓冲区的变量:
Dim Dev As Device
Dim SB As SecondaryBuffer

然后初始化声音缓冲区和特效,本例创建了10个ParamEQ特效,每个特效用于控制所在频率的强度。由于特效之前已经讲过,这里不再熬述:
Dev = New Device
Dev.SetCooperativeLevel(Me, CooperativeLevel.Normal)
SB = New SecondaryBuffer("D:\魔兽争霸2\DRIVERS\DIGTEST.wav", Dev)
Dim EDes(9) As EffectDescriptionDirectX与VB.NET编程(八)*EQ均衡器
For i As Integer = 0 To 9
       '声明为EQ特效
       EDes(i).GuidEffectClass = DSoundHelper.StandardParamEqGuid
Next
SB.SetEffects(EDes)
'初始化频率表
Dim FreqDur() As Integer = {100, 200, 400, 600, 1000, 3000, 6000, 12000, 14000, 16000}
'初始化特效的中心频率和扩散宽度
For i As Integer = 0 To 9
       Dim EQEffect As ParamEqEffect
       Dim EffectsOfEQ As EffectsParamEq
       EQEffect = SB.GetEffects(i)
       EffectsOfEQ = EQEffect.AllParameters
       '设置中心频率
       EffectsOfEQ.Center = FreqDur(i)
       '设置扩散范围
       EffectsOfEQ.Bandwidth = 36
       EQEffect.AllParameters = EffectsOfEQ
Next
'初始化完毕,播放声音
SB.Play(0, BufferPlayFlags.Looping)

为了方便改变强度值,这里写了个子程序,滑动滑槽时只要调用这个子程序就可以了。
Private Sub ChangeGain(ByVal FreqIndex As Integer, ByVal Value As Integer)
       Dim EQEffect As ParamEqEffect
       Dim EffectsOfEQ As EffectsParamEq
       EQEffect = SB.GetEffects(FreqIndex)
       EffectsOfEQ = EQEffect.AllParameters
       '设置强度
       EffectsOfEQ.Gain = Value
       EQEffect.AllParameters = EffectsOfEQ
End Sub


===============华丽的分割线===============
DirectX与VB.NET编程(八)*EQ均衡器
后面的代码就比较简单了,大家应该也知道了,我就不熬述了(其实是该死的百度增加了字数限制,原代码发不上来,我发到了GAMERES的论坛里面,大家要看的可以点击http://bbs.gameres.com/showthread.asp?threadid=91079查看)。



群贤毕至

访客