从Wwise效果器插件开发到Unity实现样例
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
本文将以一个立体声扩展效果器为例,完整的跑通从Wwise效果器插件开发到Unity实现样例的过程。
安装SDK在Wwise Lancher中安装Wwise时,会有是否同时安装SDK的可选项:
构建工程在你Wwise的安装目录,比如我这里是这个位置:
1E:\Program Files (x86)\Audiokinetic\Wwise 2022.1.1.8100\Scripts\Build\Plugins
可以找到Wwise Plugins的构建工具
打开控制台cd到你准备放置插件的位置,并输入以下命令(其中引号中的路径为上方提到的位置):
1python "%WWISEROOT%/Scripts/Build/Plugins/wp.py" new
此时会让你选择工程的类型,可以参考以下选择,这里我们以构建一个立体声扩展插件为例:
使用Premake命令生成目 ...
聊聊常见的几种Distortion(失真)算法
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
Hard Clipping就是基于一个阈值摁切,比如大于0.5就算是1,小于-0.5就算是-1
Soft ClippingCubic Distortion12// a: 0~1out[sample] = in[sample] - a * (1/3) * in[sample]^3
例:
输入为sin,a = 1:
Arctan Distortion1out[sample] = (2/pi) * arctan(in[sample] * alpha)
例:
输入为sin,alpha = 0.5:
Alpha = 2:
Alpha = 5:
Alpha = 10:
Bit Reduction通过降比特率的方式来实现失真
12345// 定义目标比特率nBits = 8ampValues = 2 ^ (nBits - 1)out[sample] = ceil(ampValue * ...
关于立体声Panning,我能告诉你的一切
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
Linear Panning作为最简单的Panning,Linear只负责随着旋钮的转动增强或减弱左声道或右声道的增益。当旋钮向左旋转时,左声道增益的同时又声道衰减,旋钮向右旋转时同理。
我们定义一个旋钮的值为p (-100~100),可以得到
12x = p / 200 + 0.5leftAmp = 1 - x
Square-Law Panning与Linear Panning相比,通过使用Square-Law Panning可以实现各通道之间相等的组合功率,而Linear Panning则实现了相等的组合振幅。在很多情况下,听众是根据功率而不是振幅来感知信号的强度的。换句话说,在使用Square-Law Panning时,无论旋钮的位置如何,听众都能感知到相同的信号强度。
我们定义一个旋钮的值为p (-100~100),可以得到
123x = p / 200 + 0.5righ ...
通过设计Tremolo效果器来学习Amplitude Modulation(调幅)
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
简介Amplitude Modulation(调幅)是音频处理中的非常常用的一种方法,它通过将输入信号乘上一个调制信号来获得新的信号。我们通常会使用一个LFO(低频振荡器)作为调制信号,LFO的种类包括正弦波、方波、三角波等等,且它的频率通常不超过20Hz。
Tremolo也是一种非常常见的效果器,它通过上面介绍的Amplitude Modulation来自动化控制输入信号的幅度,实现一种响度忽大忽小的效果。
Github: https://github.com/TaroPie0224/TaroTremolo
原理我们需要让用户输入两个变量,分别是:
rate,用于控制LFO的频率,通常为0~20
depth,调制的深度,通常为0~100
首先我们需要把depth转化成LFO的幅度,至于为什么是200,之后会提到
1a = depth / 200
得到偏置offset
1o ...
如何拓宽或缩窄你的声场——立体声扩展(Stereo Image Widening)
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
Stereo Image WideningGithub:https://github.com/TaroPie0224/TaroStereoWidth
立体声扩展基于mid-side processing,如果为了让信号听起来更宽,side通道会相对于mid通道增强,如果为了让信号听起来更窄,mid通道会相对于side通道增强。
1234567891011121314// 首先我们需要获得左右两个声道,分别为left和right// Encoding,通过左右声道得到sides和midsides = (1/2) * (left - right);mid = (1/2) * (left + right);// Processing,width的范围是0~2width = 1;sides = width * sides;mid = (2 - width) * mid;// Decoding ...
LeetCode | 31. 下一个排列
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io(阅读体验更佳)我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
https://leetcode.cn/problems/next-permutation/
题解12345678910111213141516171819202122class Solution {public: void nextPermutation(vector<int>& nums) { int i = nums.size() - 2; //初始化i为倒数第二个元素的index //从后往前扫描,如果相邻的两个元素,前一个大于后一个,则i--,直到找到那个升序的(从左往右) while (i >= 0 && nums[i] >= nums[i + 1]) { i--; } ...
深度解析!模拟与数字的桥梁——奈奎斯特采样定理
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io(阅读体验更佳)我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
Nyquist Shannon Sampling Theorem(奈奎斯特香农采样定理)对于一个有限带宽且在时域上连续的信号,当采样频率大于信号中最高频率的2倍时,采样之后的数字信号完整地保留了原始信号中的信息。
假设我们有一个频率为1Hz的正弦波(sin(2pi*t)),根据采样定理我们能够得知我们必须要2个以上的采样点,这里我们就使用3个采样点,即采样率为3Hz。
此时你肯定会想3个采样点显然不足以正确表示这个波,因为如果我们把它重新转换为模拟信号时,以下的几种情况似乎都是符合要求的:
那要不再增加一些采样点,比如增加到40?情况似乎乐观了起来:
那么增加采样点真的能在重新转换为模拟信号时使信号更准确吗?答案是否定的。
很多人都有这样的误解:更高的音频采样率意味着更好的音质
采样定理证明了无论是3Hz还是40Hz的采样率,对于一个1Hz的正弦波来说,在把 ...
LeetCode | 薄纱链表!题解不会告诉你的邪道方法
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io(阅读体验更佳)我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
前置要求面试官:请在不使用额外空间的情况下原地对链表进行操作
我:寄!
核心思想
首先我们知道,链表它难操作就难操作在不能即刻任意访问其中一个节点,那么我们就可以思考如何操作才能优化掉这个缺点。
比如我们可以新建一个vector数组,通过把原链表遍历存入vector的方式,将链表转化为vector以实现任意访问其中的某个节点。
按题目要求对vector进行操作(增、删、排序、交换等等等等)
遍历修改后的vector重新对链表的每个节点赋值(可以原地,也可以新建链表)
你必须要会的基本操作遍历链表中的每个节点并存入vector123456vector<int> vec;ListNode* node = head;while (node != nullptr) { vec.push_back(node->val); node = ...
LeetCode | 25. K个一组翻转链表
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io(阅读体验更佳)我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
https://leetcode.cn/problems/reverse-nodes-in-k-group/
题解and思路12345678910111213141516171819202122232425262728293031323334353637383940414243444546class Solution {public: ListNode* reverseKGroup(ListNode* head, int k) { //如果链表为空,返回head if (head == nullptr) return head; //新建vector,遍历存入链表中的所有元素 vector<int> vec; ListNode* node = head; ...
LeetCode | 23. 合并K个升序链表
我的Bilibili频道:香芋派Taro我的个人博客:taropie0224.github.io(阅读体验更佳)我的公众号:香芋派的烘焙坊我的音频技术交流群:1136403177我的个人微信:JazzyTaroPie
https://leetcode.cn/problems/merge-k-sorted-lists/
题解and思路1234567891011121314151617181920212223242526272829class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { //如果lists为空 if (lists.empty() == true) return 0; //新建vector,遍历存入lists中每个链表中的所有元素 vector<int> vec; for (int i = 0; i < lists.size(); i++) { ...