使用 Arduino Nano 创建基于 DCO 的音频合成器

描述

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

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

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

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

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

当我考虑创建自己的合成器时,VCO电路的复杂性和混乱一直是我的绊脚石,尽管我喜欢模拟合成,但我无法摆脱其混乱的电子软肋。 当我对
罗兰·朱诺系列合成器。

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

总体而言,Arduino Uno和Nano开发板的普遍性和低成本,以及这些数字平台预先配备了16 MHz的事实。 晶体振荡器,使以便宜的价格创建 DCO
变得非常容易。

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

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

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

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

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

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

数量 元件
1 Arduino Nano v3.x
4 470 nF [电容器]
1 2.1 毫米枪管插孔
1 1/4“ 单声道开关插孔
2 4.7千米 [电阻器]
3 47k 电阻器
7 100k 电阻
1 100k 电阻
2 100k [电位计]
1 1 M 电位计
23 单刀双掷微型瞬时开关
1 开关 [直流-直流转换器] (5 V 输出)
1 微片 [MCP23017] I/O 扩展器
1 [LF411] 运算放大器(运算放大器)

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

合成器

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

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

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

合成器

***图3. ** 求和放大电路原理图 [点击图片放大]。 *

求和放大器包含三个电位计。 它们独立控制振荡器 2 和 3 的音量以及仪器的主音量。 放大器电路的输出直接路由到 1/4“ 单声道音频插孔,使其易于直接插入吉他放大器。

为了给这个乐器供电,我使用了一个标准的 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. 整个系统的原理图[点击图片放大]。 *

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

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

  • 设置 GPIO 输入和输出
  • 启动 I2C 通信
  • 初始化三个计时器模块
    • 启用中断
    • 选择定时器B模块的时钟源作为定时器A的时钟
  • 启用全局中断

合成器

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

表示 Arduino 草图的 loop() 函数的流程图如图 6 所示。

合成器

*图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接口。 我还想使用这些方法创建一个可扩展的多边形合成器。 然而,就目前而言,这个项目已经改造成的玩具外壳是一种有趣的、值得上台的低保真乐器,具有非常沙砾的低音。

如果您选择像这样构建自己的基于 Arduino 的合成器, 在下面的评论中让我知道 听起来如何。 祝你好运,继续制造噪音!

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

全部0条评论

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

×
20
完善资料,
赚取积分