Arduino平台的Wave Shield是Adafruit早期的一个面罩套装,一直以来,它依然是那么受欢迎。我们有足够的理由相信,这是给Arduino添加高质量音效的最容易和最便捷的方法。 像一瓶好酒,开源项目随着时间而得到提高。我们被告之这个面罩有一个新的技巧:那就是一个实时的变声器。发音就像每个人都喜欢的男中音歌手Sith Lord一样,或者如Lollipop Guild的跟唱一般。Wave Shield一早成为商家欢迎的万圣节项目。最新添加上去的东西也是紧扣这个主题的。 核心部分的清单这个项目里面有三个新型的元件: - Arduino Uno /DFRduino UNO V2.0(老版本的Arduino Duemilanove或者328 Diecimila也适合,但Arduino Mega或者Leonardo就不适兼容了。)
- Adafruit Wace Shield
- Adafruit麦克风放大器接头
- 你还需要基本的焊接工具,电线以及bits & bobs
其他部件这是一个可扩展的项目,你打算用它来达到什么目的则决议你用什么元器件。细读整个流程是很有必要的,因为这样可以便于购买你项目中所需的元件。我们会展示一些实例。但这些东西并不是最新的。但这些都是Arduino的精华。
因为有声音输出,因此你需要一个头戴式耳机、便携MP3扬声器或是我们经典的D类功放。示范扫描大概用到一个12键键盘去触发预录制的声音。若果你只是想使用音效,你的应用只需要一些简单的按键,又或者什么都不用。
如果要添加一些预录制的声音,你需要一个包含有WAV文档的SD卡。用一个10K的电位计来调节音高,又或者你可以进行简单的永久设置。
如果你想拨弄这些电线,一个额外的样机面罩和堆栈头部可以很容易实现。焊接带有堆栈头部的wave shield,同时将原型面罩放在上面。为了使其可以像服装和小道具那样轻便使用,要添加电池、电池套等。 [/url] 我们强烈建议,应该说是要求你在开始这个项目之前完成这个原版的Wave Shield教程的阅读。这是在添加额外层次的复杂性之前验证关键部分能够正常工作的一个好方法。现在就解析一些令人讨厌的背景理论知识。如果你只是想做点东西,那么你就可以跳过以下的文章。 音频样本不管你是否曾经玩弄过父亲的LP唱盘,又或者涉猎过最新的PC上面的数字音频程序,你在这些现象上面或多或少都应该有一些经验。就拿录音来说,这只不过是一个以特有速度的回放,之后改变速度或者压缩、拉伸时间,音频的音高就会随之改变。压缩时间会使音高上升,拉伸时间会降低音高,频率是波长的倒数。
利用录音是很容易得出这些效果的,但在直播音频的时候,我们就不能那么奢侈。实时就是实时,我们并不能压缩或者拉伸,它们沿着自身的状况发展。这种情况下,所谓的声音改变能够做点什么?
在这里设计一个叫做福利叶变换的复杂技术,通过变换可以转变一个函数(或者可以讲是改变音频流),将其转为一个频谱。最后出来的频率值可以改变,同时一个相反的转变会应用于还原这个音频,这就是纯粹的数学问题。但除了Arduino的处理之外,我们还需要一些额外的处理方法。一个相当强悍的CPU或者DSP是必须的,我们也需要一些便捷方法或做一些尝试。
在数字音乐圈,颗粒合成是一个将大量的短音频样本糅合和分层的技术。这也是为了建造更多更复杂的声音或者乐器合成。现在,图片是一个单独的声音样本,十毫秒左右。同时我们持续从直播麦克风更新这个声音样本,通过实践压缩或延伸这个微小的环,重复或丢弃短小的片段去跟上实时。我们以实时音高转换为基础,这个看起来是不能工作的,但实际上是有效的。语音波形在短期内会重复,同时我们可以丢弃或者重复一些波形。
这种方法总体上是适合于Arduino的有限处理能力和RAM,得出的结果是不符合好莱坞品质的。但是,这比架子上大部分的声音改变玩具好很多。现在你将要去制造它了,很酷是吧。 声音采样人的声音频率范围大约是300HZ到3500HZ。奈奎斯特抽样定理有如下的阐述:要如实重建一个信号必须需要至少两倍的采样率。对于人声来说,那就是7KHZ的采样率。但多一点的话也无妨。
在一个循环里重复调用Arduino的标准模拟Read()函数是一种方法,这种方法对这个项目来说也太慢了。我们需要对Arduino的ADC、特别储存器和模式有一个更深入的了解。一个叫做自由震荡的模式以快速、固定间隔,同时并不反复查询代码的方式快速收集模拟采集信号。每当一个新的采样信号准备好了,一个中断处理程序会被自动调用,这个会有规律的进行。全速的运行,一个16MHZ的Arduino每秒可以捕获9615个10位的样本,这对于声音采样来说足够了。
声音样本存储在一个环形缓冲器里面,这是计算机科学里面的“当你到达缓冲器末端的时候,回调到最初,并重写”的一种美妙的描述。但从概念上说,这只是帮助理解文字上所说的循环。
录音的频率会很少精准符合缓冲长度。同时声音样本是被存储和以不同速率读取。这会产生一个明显的间断。每次输入和输出点交汇时,会产生一个间歇性的噪音。现在用一个小型的额外缓冲器存储一些优先的音频样本,同时在边界编码交错单变的音频可以减少噪音。
因为我们的音频样本是相当短,大概只有10毫秒。RAM则需要适中的,大概几百字节。问题是,因为Wave shield的设计目的的缘故,我们经常会持续做采样的工作,也就是回放WAV文件。这需要从一个SD卡读取文件,这会需要比较大的RAM。很幸运的是,这个WAV播放编码的设计使我们获得访问库存储的权利,同时回收满足我们需要。
源代码的这个技术细节备受好评。因此如果你对执行的标准有所好奇,查看源代码。 限制当把Arduino介绍给新用户的时候,我通常将其描述为“具有足够能力去处理好任何一件事”。因此对这个项目来说,它是很完美的。记住以下的限制:
1.它可以处理声音效果或者WAV回放,但你不能同时做到。
2.当声音效果在运行的时候,你不能读取其他模拟输入。(例如,你不能用一个电位计持续转换音高)。如果用到模拟穿高企作为声音触发器,考虑工作的时候就如在数字输入时用一个精心调整过的分压器,或者另一个MCU去处理数字输入,透过串行或者I2C连接进行正向触发。
|