如何创建基于DCO的音频合成器

描述

在此项目中,学习使用 Arduino Nano 或 Arduino Uno 创建数控振荡器或基于 DCO 的音频合成器。

我喜欢音乐,也喜欢电子产品。多年来,我一直在制造音乐电子设备,主要是为我的电吉他演奏服务。在构建和修改了几个电子管放大器和效果踏板之后,我决定涉足音频合成领域。我经常梦想创建自己的 Eurorack 合成器,一次一个模块,但对于我的第一个合成器项目,我决定从一个独立的键盘开始。我的成品——一个改装过的玩具键盘。 

 

在这个项目中,我移除了现有的电子设备,并用一个以Arduino Nano为核心的基于数控振荡器 (DCO) 的音频合成器取而代之。虽然我使用的是 Arduino Nano,但也可以使用Arduino Uno 。让我们深入探讨如何制作基于 DCO 的合成器。然而,在走得太远之前,让我们先谈谈在合成器中使用振荡器。 

振荡器:任何合成器的心脏

任何合成器的关键要素是其振荡器电路。模拟合成器通常有两个或多个独立可控的振荡器。但是,任何进入过模拟压控振荡器 (VCO)原理图的互联网兔子洞的人都知道它们通常很复杂且杂乱无章。一些混乱来自可以优雅地处理的功能,例如多个控制电压输入。然而,即使最简单的振荡器电路在原理图中被隔离,剩下的部分仍然很复杂,因为热反馈技巧使振荡器在其组件预热时保持调谐。

当我考虑创建自己的合成器时,VCO 电路的复杂性和混乱一直是我的绊脚石,即使我喜欢模拟合成器,我也无法克服它凌乱的电子软肋。当我欣赏Roland Juno 系列合成器时,这一切都改变了。 

Roland 的 Juno-6于 1982 年上市,作为当时其他和弦合成器的更实惠的替代品。它也是第一个使用 DCO 代替传统 VCO 的合成器。与替代品相比,这显着提高了仪器的调谐稳定性,因为 DCO 使用数字电路来控制振荡器模拟信号的频率。考虑到这一点,使用 DCO 而不是 VCO 当然需要权衡取舍。许多人喜欢两个略微失谐的 VCO 齐声演奏的“温暖”声音,这是很难用基于 DCO 的合成器模拟的。然而,调制效果可以应用于 DCO 的干输出信号,以产生丰富、优美的声音。

总的来说,Arduino Uno 和 Nano 开发板的普遍性和低成本,再加上这些数字平台预装了 16 MHz晶体振荡器,使得创建便宜的 DCO 变得异常容易。

使用微控制器定时器模块创建 DCO

查看任何现代微控制器的数据表,您会在其外围设备中找到定时器模块。定时器模块允许嵌入式设计人员在独立于CPU(中央处理器)的嵌入式系统后台设置运行计数器。此外,定时器模块可以在多种情况下中断 CPU,例如当它们溢出计数寄存器或达到特定计数时。嵌入式设计人员可以配置中断条件以满足其特定应用的需要。

对于这个项目, ATMega328P的定时器模块——Arduino Nano 和 Uno 的大脑——充当合成器的 DCO。通过配置定时器模块的时钟源和最大计数值,可以实现音频触发定时器模块中断。DCO 输出是通过在这些周期性中断的中断服务例程 (ISR) 期间操纵微控制器的 GPIO 引脚来实现的。

在接下来的部分中,我将讨论这个项目背后的硬件和软件设计,然后展示这个自制合成器的一些音频片段。

使用 Arduino Nano 的音频合成器硬件

在深入了解该项目中涉及的不同硬件以及它们如何协同工作之前,表 1 显示了 BOM(物料清单)。

数量 成分
1个 Arduino 纳米 v3.x
4个 470 nF电容
1个 2.1 毫米筒式千斤顶
1个 1/4" 单声道开关插孔
2个 4.7k电阻
3个 47k电阻
7 100k电阻
1个 100k电阻
2个 100k电位器
1个 1M电位器
23 SPDT微型瞬时开关
1个 开关式DC-DC 转换器(5 V 输出)
1个 Microchip MCP23017 I/O 扩展器
1个 LF411 运算放大器(运放)

接下来,让我们看一下图 2 的系统图,它显示了这个合成器的各个部分是如何组合在一起的。 

合成器

图 2. 合成器的硬件系统图。

键盘部分由一组 23 个 SPDT 开关组成,每个开关一个。其中 16 个键被路由到 MCP23017 I/O 扩展器,其余 7 个键直接路由到 Arduino Nano 上的 GPIO 输入。MCP23017 然后通过I2C连接到 Arduino Nano 。

Arduino Nano 从这里开始处理来自键盘的输入,并根据这些按键在 D11、D12 和 D10 上生成三个独立的振荡器输出。Arduino Nano 上这些数字引脚的输出被路由到加法放大器电路,其原理图如图 3 所示。

合成器

图 3. 加法放大器电路原理图 [点击图片放大]。

求和放大器包含三个电位器。它们独立控制振荡器 2 和 3 的音量以及乐器的主音量。放大器电路的输出直接路由到 ¼” 单声道音频插孔,可以轻松直接插入吉他放大器。

为了给这个乐器供电,我使用了一个标准的 2.1 毫米 9 V DC 吉他踏板桶形插孔。此外,来自该插孔的 +9 V 被路由到小型 DC-DC 开关电源转换器以生成 5 V 电源连接。+5 V 电源为 MCP23017 供电。Arduino 由 +9 V 电源通过其 Vin 引脚供电。运算放大器的 V+ 和 V- 由桶形插孔的 +9 V 和接地连接提供,5 V 电源用作运算放大器的浮动接地连接。

图 4 显示了该系统的所有部分如何连接的示意图。

合成器

图 4. 整个系统的示意图 [点击图片放大]。

创建音频合成器的软件方面

该项目软件的主要任务是解释来自键盘按钮的输入并相应地操作定时器模块寄存器(有关代码,请参见此处的 Arduino 草图 PDF)。在草图中的 setup() 函数之前,声明了几个全局变量,包括两个大型二维数组的定时器模块寄存器值对应于音符。setup() 函数的过程遵循图 5 的流程图,其中仅涉及:

设置 GPIO 输入和输出

启动 I2C 通信

初始化三个定时器模块

启用中断

选择定时器 B 模块的时钟源作为定时器 A 的时钟

启用全局中断

合成器

图 5. 该仪器的 Arduino 草图的 setup() 函数流程图。

图 6 显示了表示 Arduino 草图的 loop() 函数的流程图。 

合成器

图 6.该仪器的 Arduino 草图的 loop() 函数流程图 [单击图像放大]。

循环函数执行三个主要任务:

检测键盘上按下的键

根据特定键的音符设置定时器模块参数

设置门变量以允许将振荡器信号转发到它们各自的 GPIO 引脚

循环函数一次评估连接到键盘的每个 I/O 端口,直到检测到按下的按钮。端口的评估顺序是键盘上从最低音符到最高音符,这意味着较低的音符实际上具有较高的优先级。当我考虑使用 GPIO 和 I2C 中断来处理键盘按钮按下时,我最终使用了连续轮询方法,并且我没有注意到任何不利的性能结果。 

最后,图 7 表示 ATMega328P 中三个定时器模块中每一个的中断服务例程。 

合成器

图 7.  Arduino Nano 的 ATMega328P 定时器模块的中断服务例程流程图。

如果设置了门变量,这些 ISR 中的每一个都会切换其输出引脚值。这种切换是为每个振荡器生成音频输出的原因。

产生的声音样本和潜在的改进

您可以在下面找到该项目的两个音频样本。请务必单击播放按钮图像进行播放 - 请注意,音频将在单独的窗口中打开并播放。

声音剪辑 1. 音频合成器演示。

正如您从第一个音频样本中听到的那样,该合成器产生了一种漂亮的斯巴达式低保真声音。该样本首先演示了根音振荡器,然后是根音和八度向下振荡器,最后是根音、向下八度和 7 个半音向上振荡器。

声音剪辑 2。 带有效果器和鼓的音频合成器演示。

第二个示例通过一些延迟和相位效果展示了合成器,并覆盖了多个轨道。所有旋律声音都来自 Arduino 合成器,但鼓声来自 Roland 808 风格的鼓机 vst 插件。

总而言之,我对这个项目的结果感到非常兴奋,但我确实认为这个基于 Arduino 的合成器可以实现许多潜在的改进。例如,我想为这个 Arduino 合成器实现一个 USB midi 接口。我还想使用这些方法创建一个可扩展的复音合成器。然而,就目前而言,这个项目的玩具屋已经变成了一种有趣、适合舞台的低保真乐器,具有非常坚韧的低音。

从基础到高级的ADC讲座,将涵盖高速ADC设计的原理、传统架构和最先进的设计。第一部分首先回顾了ADC的基本知识,包括采样、开关电容和量化理论。接下来,介绍了经典ADC架构的基础和设计实例,如闪存、SAR和流水线ADC。然后,本教程将对混合型ADC架构进行总体概述,这就结束了第一部分。在第二部分,首先描述了ADC的度量。然后,介绍混合或非混合架构的各种先进设计。该教程最后将以数字辅助解决技术结束。

  审核编辑:汤梓红
 
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分