Noise Nugget是一款紧凑型数字合成器,基于180MHz Cortex-M4和带耳机放大器的高品质音频DAC。
我在这个项目中的目标是创造一个音频合成的“瑞士军刀”。 在最小和最便宜的板上包装最大功能。
凭借其所有连接(USB,2 x音频输出,1 x音频输入,I2C,UART,GPIO),它可用于许多不同的任务:
数字合成器,带MIDI接口或其他一些控制手段
吉他踏板或合成器的音频效果(延迟,混响,失真)
音频FX触发板,播放预先录制的声音
音频播放,从输入录制声音,然后按一下按钮即可播放
USB声音接口
硬件设计
硬件设计的主要目标是简单和占用空间小。
该系统的核心显然是STM32F446微控制器。 它基于ARM Cortex-M4内核,浮点单元运行频率为180MHz,还有大量外设。
在STM32F4周围,我们有:
USB micro-B连接器
一个电源稳压器,可从USB连接器的5V提供3.3V电压
用于STM32F4时钟的晶体振荡器
一个用户按钮和一个按钮进入设备固件更新(DFU)模式
用于存储样本数据的闪存
自定义IO
一个调试头
一个耳机插孔
音频数模转换器(DAC)
我本来可以使用STM32F4的DAC,但一方面它们只有12位而16位用于正确的音频DAC,另一方面它需要额外的电路来驱动耳机。 因此,使用SGTL5000可提供更高的音质和简单性。
SGTL5000还有很多IO选项:
耳机输出
线路输出
线路输入
麦克风输入
这意味着不同应用程序有很多选项。
在Noise Nugget的rev-B上,我没有使用麦克风输入。 我认为这是一个错误,因为电路板上有一些用于MEMS麦克风的空间,这将开启更多可能性。 例如实时语音效果或样本录制。
DFU按钮的设计灵感来自Numworks开放式计算器。 如果在插入USB电缆时按下按钮,STM32F4将自动进入DFU模式。 然后,在不使用任何调试探针的情况下安装不同的固件非常容易。
软件设计
Noise Nugget的软件是用Ada编写的。 Ada编程语言都是关于功能安全的,也就是说,检测软件何时没有做到应该做的事情(错误!)。 使用Ada,您可以快速准确地知道出现了什么问题,而不是在缓冲区溢出或未初始化的驱动程序上搔痒几个小时。 这意味着减少调试时间。 由于我没有足够的时间来开发这个软件,因此每分钟都很重要。
该软件最重要的方面是生成音频样本并将其发送到DAC。
样本是16位有符号整数,表示给定时间点的音频信号的值。
DAC配置为每秒44_100个样本(CD质量)。 如果软件无法以适当的速度传送样本,音频将出现故障(响亮的砰砰声和咔嗒声)。 所以这是系统真正的实时要求。
样本不是一个接一个地发送,而是在512个样本的缓冲区中*每个样本2个字节* 2个通道(立体声),所以2048个字节。 缓冲器B在发送缓冲器A时被填充,反之亦然(触发器缓冲器)。 来自音频输入的样本以类似的方式接收。 缓冲区的传输是通过DMA完成的,因此在该操作期间不使用CPU,这意味着生成样本的时间更长。
为了确保实时要求,我使用了Ada Ravenscar运行时。 您可以将其视为集成在Ada编程语言中的实时操作系统(RTOS)。 如果你想看看它的样子,我写了一篇关于它的博客文章。
系统中有两个任务:
音频任务,它具有最高优先级,因为它负责填充音频缓冲区。 这意味着只要有要填充的音频缓冲区,就会执行此任务。
另一项任务是在轮询循环中处理USB请求。 在将来,这可以移动到并中断处理程序。
在依赖性方面,驱动程序来自Ada_Drivers_Library ,这是我几年前开始的一个项目,旨在鼓励在微控制器上使用Ada。 音频合成器基于Raphael Amiard的ada-synth-lib 。
Noise Nugget的未来
我对Noise Nugget的未来有一些想法。 其中之一是拥有一个GUI,让用户可以使用基本模块(如振荡器,滤波器,效果等)构建声音。类似于青少年音频工具,但实时,不需要为用户提供任何代码。 这可以成为一个有趣和多功能的微型合成器。