雷竞技注册
项目

EFM8声音合成器:通过USB播放旋律

2015年9月17日经过罗伯特·凯

第3部分“如何制作基于EFM8的声音合成器”系列。

第3部分“如何制作基于EFM8的声音合成器”系列。

以前的系列文章

本文是关于制作基于efm8的合成器的完整项目的一部分。请从以下方面开始:

必需的硬件/软件

描述 数量 Digi-key p / n
面包板 1 377-2094-ND
插座跳线电线 4. 1471-1231-nd.
5v AC/DC壁挂式电源 1 1470-2771-nd.
0.1μF电容器 5. 399-4266-nd.
第五阶开关电容低通滤波器 1 LTC1063CN8 # PBF-ND
通用运放 2 LT1638CN8#PBF-ND
模拟电力缓冲器 1 lt1010cn8#pbf-nd
2μF电容器 1 490-8835-nd.
10 kΩ电阻 2 10kqbk-nd.
100Ω电阻 1 100qbk-nd.
8Ω,1瓦扬声器 1 gf0771-nd.

项目概况

在上一篇文章结束时,我们的固件和音频电路可以一起产生滤波,放大的音乐音符频率正弦波,能够驾驶扬声器。我们甚至发现这种相对简单的系统产生的音调令人惊讶的是令人惊叹的。但是,如果所有它可以确实可以通过C重大比例无休止,我们的声音合成器将逐渐失去吸引力,因此我们需要一种方便的方式来打开和关闭音频,更重要的是发挥舒缓的旋律。

我们将通过在EFM8和Scilab之间建立虚拟COM端口(VCP)USB连接来实现这一目标(参见本文有关Scilab的介绍性信息这一个介绍Scilab串行端口库)。本项目中使用的Scilab脚本提供了一个简单的命令行界面,用户可以启动和停止音频播放,设置速度,并输入简单的旋律的音符信息。

scilab.

这是脚本:

efm8_soundsynthesizer_scilab_script.zip.

首先,Scilab配置并打开VCP。如果由于某种原因串行端口库无法与EFM8建立连接,Scilab控制台将说明无法打开COM端口,然后“中止”,这是Scilab Word用于“停止脚本执行并返回正常操作”。“如果连接已成功建立,则脚本进入无限命​​令行输入循环,其中scilab控制台窗口提示用户输入要发送到EFM8的字符串。要发送命令,只需键入相应的字符,然后按Enter键。要打破循环并退出脚本,请在不键入任何其他字符的情况下按Enter键(请注意,脚本终止之前“卸载”VCP连接,串行库“卸载”)。

EFM8固件识别出四种类型的命令:播放音频(“p”),停止音频(“s”),设置速度(“t ###”),并创建旋律(下面讨论的命令格式)。播放和停止音频命令打开或关闭声音信号和滤波器时钟方波,而不会干扰固件的正常操作。SET TEMPO命令用于控制播放速度;速度在每分钟节拍(BPM)中输入。固件当前将TEMPO限制为60到180bpm之间的节奏,因此该范围高于或低于此范围的数字将分别由EFM8更改为180或60。

创建旋律的方法可能出现有点隐蔽,但如果您在您输入字符时查看一段音乐,易于实现,实际上可以相当快速直观。作为一系列字符对输入旋律,包括字母(表示音符)和一个数字(表示播放音符的时间)。固件目前支持整个音符,半纸张,季度票据和第八章。

在进入旋律时,您将使用“1”整个注释,半张音符“2”,四分之一的音符“4”,并为第八次注释“8”。对于您自己,您使用相应的信件。命令行界面支持以C开头的两个八度高,并以B结尾(无锐白或单位)。下八度名中的音符由小写字母表示,更高octav中的字母由大写字母表示。因此,如果您想要播放接口支持的所有音符,按升序顺序且每次注释为季度注释,则输入“C4D4E4F4G4A4B4C4D4E4F4G4A4B4”。笔记:目前的固件只支持在第二个八度高达E的音符;更高的音符对于演示旋律是不需要的,这些音符将逐渐被RC低通滤波器削弱,正如在前一篇文章中讨论的。此外,由于PCA中断频繁发生,EFM8的处理器将无法持续更新捕获/比较寄存器,因此在某些时候滤波时钟信号将变得不可靠。你当然可以扩展固件以包括这些更高的音符,但是你需要关注滤波器时钟方波,你可能需要修改RC低通滤波器以获得更高的截止频率。

有关命令行界面的其他详细信息:

  • 对于速度命令,速度值的ASCII表示转换为单个字节编号,以便EFM8不需要执行此转换。另一个命令直接传递给EFM8。
  • 发送Melodod命令时,会自动启用播放。
  • 所有命令都通过EFM8回馈,如下图所示。
  • 您可以使用“r”指定休息(即,没有播放的期限)“1”,“2,”“4,”或“8”;该数字指定其余的持续时间,作为整体,一半,季度或第八章。
  • 您可以在任何时候设置节奏,但是播放速度不会改变,直到您输入一个新的旋律(或重新输入当前的旋律)。默认速度是120 BPM。
  • 在命令提示符处按向上箭头键允许您通过先前输入的字符串循环;当您发送长旋律命令时,这非常有用,只想更改一个注释,或者如果您需要重新输入以前的旋律。
  • 为简单起见,所有命令目前都限于一个64字节USB数据包。每个音符需要两个字节,因此最大旋律长度为32个音符。

下面是显示命令行界面正确使用的示例。执行脚本,并且EFM8被编程为使用所有季度注释播放升高的C重大比例,然后是所有八分音符的降序C重大比例。接下来,速度降至60bpm,然后增加到180bpm。最后,在脚本终止之前再次启用播放。您会注意到速度命令的回音字符看起来不正确,但实际上它们是scilab显示与EFM8接收的单字节速度编号对应的ASCII字符。

USB接口配置

这篇文章提供使用Silabs VCPxpress库的USB通信概述,以及将VCP功能添加到Simplicity Studio项目的重要方面。在这里,我们将简要介绍将VCP通信合并到我们固件中的所有步骤:

1.将“vcpxpress.h,”vcpxpress.lib,“descriptor.c,”和“descriptor.h”复制到项目目录中:

2.在项目属性中添加适当的include路径:

3.在项目属性中添加VCPXpress库:

4.插入一个源文件,其中包含与vcpxpress库的交互和处理USB数据包的代码:

5.插入新函数原型的代码,全局变量和预处理器定义(构建错误将帮助您找到任何可能错过的任何内容),并在任何要求它们的源文件中包含“VCPXPRESS.H”和“DESSITERR.H”:

6.呼叫硬件初始化功能后,将调用添加到usb_init()和api_callback_enable():

7.要抑制链接器警告,复制“叠加(?PR?_USB_WRITEFIFO?efm8_usbdep!*,?PR?_usbd_read?efm8_usbd!*,?pr?_usbd_write?efm8_usbd!*,?pr?_vcpxcore_write?vcpxpress!*)”进入““链接器设置”中的其他标志:

中断优先级

EFM8的外设/中断配置的唯一变化是一个微妙但重要的更改:PCA中断已设置为高优先级。

最初滤波时钟方波输出是严重不可靠的,大概是因为与VCPXpress库相关的高优先级中断抢占了PCA中断。对优先级设置的修改确保及时处理PCA中断。

功能细节

固件通过将命令字符串转换为一系列音符和相应的Timer3计数,每个序列都存储在单独的阵列中:

void storenewmelody(){无符号char x,y;y = 0;for(x = 0; x 

在收到SET TEMPO命令时计算整个整体,一半,季度或第八次注释的计时器3的数量:

void SetTempo(unsigned char TempoBPM) {if(TempoBPM > 180) TempoBPM = 180;else if(TempoBPM < 60) TempoBPM = 60;QuarterNoteCounts = ((float)60/TempoBPM) * 10000;WholeNoteCounts = QuarterNoteCounts * 4;HalfNoteCounts = QuarterNoteCounts * 2;EighthNoteCounts = QuarterNoteCounts / 2;}

这些计算假设四分之一章节的持续时间是一个节拍,因此整个音符是4个节拍,半张音符2节拍,第八次注释一半的节拍。因此,对于60 bpm的速度,笔记将具有以下持续时间:

在主循环时,通过音符阵列中的每个元素的程序周期,并相应地设置声音信号和滤波器时钟递增,然后它使用Timer3计数阵列中的相应值来实现适当的延迟。

whis(1){for(currentnoteindex = 0; currentnoteindex 

这种方法的一个问题是,两个相同音调的短音符听起来像一个更长的音符。要纠正此缺陷,代码检查下一个注释是否与当前注释相同,如果是,则当前注释后跟一个短延迟,在此期间禁用声音信号和滤波器时钟波形波:

重复= n = false;if(currentnoteindex <(numberofnotes  -  1)){if(notessequence [currentnoteindex] == notessequence [currentnoteindex + 1])repected_note = true;} // --------------------------------------------//then after the note has been played... //----------------------------------------------------- if(REPEATED_NOTE == TRUE) { SFRPAGE = PCA0_PAGE; PCA0CN0_CR = STOP; SFRPAGE = TIMER3_PAGE; TMR3 = 0; while(TMR3 < 200); } SFRPAGE = PCA0_PAGE; PCA0CN0_CR = PLAYorSTOP;

SoundSynthesizer_Part3.zip

这种技术让我们真正受益于“点击-弹出”的声音,这通常是音频电路中一个麻烦的方面:当方波重新启用时产生的快速点击或弹出为重复音符之间提供了额外的一点定义。然而,我们不想要太多的点击和pop,所以电路中的直流阻塞电容已经从2µF减少到0.1µF,以努力缓解这些影响,这些影响部分是由于与充电滤波电容相关的瞬态电流。

以下视频提供了两个样本旋律;在字幕中给出相应的命令行条目。该系统产生的声音似乎模糊地让人想起了中世纪长笛,并相应地选择了旋律。

旋律命令:E4a4a2E4a4a4a8b8C4C4b4C4D4D8D8C4D4E4E8E8D4D4C4C4b2a4C4b4g4a2a2;节奏命令:T180

旋律命令:d2a2e2f8e4d2a2C4D2C4a4b4g4a2r2a4D2D4C2a2g4f4e2c4d2a4g2f4e4d4c4d1;节奏命令:T120。其中的一些音符会含糊不清,因为用一个更长的音符替换多个相同音高的音符可以将整个旋律放入一个64字节的数据包中。

为自己提供这个项目!得到BOM.