谈论音效

今天工作完成得很好。
我是系统开发部的松山。

虽然音频滤波器有很多种,但我只用过混响,所以我决定
意识到,

音频滤波器

首先,我们来看看有哪些筛选器可用。
官方文档在这里。

低通滤波器

由于它是低通滤波器,它会滤除高频信号。
这会导致在诸如隔着墙壁或其他障碍物聆听,或者从扬声器后面聆听时,声音会被衰减。

高通滤波器

与低通滤波器不同,这种滤波器会滤除低频信号。
从物理角度来说,它应该从高频向上衰减,因此使用廉价耳机时,可能会出现低频
失真或声音断断续续的情况。

回声滤波器

这是回声效果。它会重复播放同一个声音,同时减弱它的音量。
想象一下在卡拉OK包厢里唱歌,同时加上回声效果。
如果你拉大音程,听起来可能就像回声一样。

失真滤波器

无论音量设置如何,这都会增加音量。
由于音质低劣,它会导致声音失真,几乎就像削波一样。

混响滤波器

就我个人而言,这是我最常用的滤波器。
它能营造出封闭空间(例如大厅或地下通道)的混响效果,
听起来也像是麦克风收音。它的
可调节参数最多,但作为业余爱好者,我觉得自己无法完全利用所有设置。

合唱滤波器

这是一个能播放调制音频的滤波器,效果类似合唱。
我用一个采样试了一下,但效果不太好。
如果有人知道怎么解决,请告诉我……

要求

和往常一样,我们将在 Unity 中创建一个示例并进行测试。①
在音频监听器上设置各种滤波器
② 使用复选框打开/关闭每个滤波器
③ 使用滑块指定低通和高通滤波器的频率
④ 分别播放背景音乐、音效和铃声
⑤ 尝试显示类似音频频谱的内容

大概是这样的。
每个滤波器的参数都设置为默认值。
我打算创建一个播放几首音频的界面。
如果音频频谱显示效果还不错,我就很满意了。

在音频监听器上设置过滤器

MainCamera 组件自带音频监听器,所以我们会将每个滤镜添加到它下方。
除了低通/高通滤镜之外,其他滤镜都可以通过复选框切换,因此默认情况下保持关闭状态。

每个过滤器都可以通过复选框打开/关闭。

使用 UI.Toggle 创建。(像这样↓)

准备触发方法,

// 切换过滤器 public void OnClickToggleFilter(int no) { switch ((FilterNo)no) { case FilterNo.Chorus: fltChorus.enabled = tglChorus.isOn; break; case FilterNo.Distortion: fltDistortion.enabled = tglDistortion.isOn; break; case FilterNo.Echo: fltEcho.enabled = tglEcho.isOn; break; case FilterNo.Reverv: fltReverb.enabled = tglReverv.isOn; break; } }

只需在 OnValueChanged 中设置即可。

低通滤波器和高通滤波器都有滑块可以指定频率。

低通滤波器和高通滤波器将通过滑块进行调节。
同时,我们还会添加音量和音调控制。

滑块的 j 反射看起来像这样。

① 设置事件监听器

// 低音通道 sldLoPass.onValueChanged.AddListener((value) => { setLoPass(value); });

② 设置过滤器的值

// 低通滤波器设置 private void setLoPass(float val) { var loPassHz = ExpHz(val); fltLoPass.cutoffFrequency = loPassHz; txtLoPass.text = string.Format("{0:#}", loPassHz); }

* ExpHz 将 0.0 到 1.0 到 10 到 22000 Hz 的值进行转换。

float ExpHz(float logHz) { var t = Mathf.Log(LowHz) - Mathf.Log(HighHz); return Mathf.Exp(logHz * t) * 10f; }

允许您分别播放背景音乐、音效和铃声。

使用 UI.Button 播放声音。

设置一个事件监听器来切换播放/停止。
使用 AudioSource.Play() 和 Stop()。

// BGM播放/停止 btnBgmPlay.onClick.AddListener(() => { if (!bgmSource.isPlaying) bgmSource.Play(); else bgmSource.Stop(); });

显示类似音频频谱的内容。

最后,我们来展示波形数据。
就是标题图片中显示的那个波形。

AudioListener 的GetSpectrumData() 使用

我以此为参考进行实现。(谢谢!)
我想在真实的智能手机上查看声音频谱分析结果。

GetSpectrumData() 获取的音频样本被分成 512 个频段,用于 UI 显示。

AudioListener.GetSpectrumData(spectrumData, 0, FFTWindow.Hanning); var outputF = AudioSettings.outputSampleRate; // 初始化所有频段 for (int i=0; i <bins.Length; i++) { bins[i] = 0f; } var logMaxF = Mathf.Log(graphMaxFrequency); // 上のbinの周波数のlog var logMinF = Mathf.Log(graphMinFrequency); var logRange = logMaxF - logMinF; if (logRange <= 0f) { logRange = 8f; } // まず周波数分類 for (int i=0; i<spectrumData.Length; i++) { var f = outputF * 0.5f * (float)i / (float)spectrumData.Length; if (f == 0f) { f = float.Epsilon; } // 対数を取ってどのビンに入るか確定 float binValue = (float)bins.Length * (Mathf.Log(f) - logMinF) / logRange; int binIndex = Mathf.FloorToInt(binValue); if ((binIndex > = 0) && (binIndex < bins.Length)) { // 将数据添加到该 bin bins[binIndex] += spectrumData[i]; } }

创建一个用于显示每个方块的基础预制件。
这是一个宽度为 3、高度为 0 的 UI.Image 对象。
将这些方块从左到右排列在屏幕上,并根据其值设置高度。

// 反映在条形图中 for(int i=0; i

现在播放音频时,波形数据应该看起来类似。

概括

我试用了所有音频滤波器。
合唱滤波器对我来说效果不太好(叹气)
。看来只有混响和低通滤波器真正好用。Unity
自带音频混音器 ,如果你想进行更精细的设置,可以试试它。
说实话,我觉得这方面不太适合新手……
总之,今天就到这里吧。

我也把它上传到了 Git。
希望它能有所帮助。Unity
示例

此外,音频数据来自以下来源:
OtoLogic 和
Oto no Mori

最后

我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

谢谢。

如果您觉得这篇文章对您有帮助,请点个“赞”!
2
加载中...
2票,平均分:1.00/12
1,325
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

我曾在一家游戏开发公司工作多年,负责编程和项目管理等工作。
2019年,我加入Beyond Inc.,在横滨办公室工作。
我主要负责服务器端开发的项目管理(偶尔也参与编程)。
我的爱好是公路自行车赛和观看赛马。