这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 如何使用Arduino构建无接触MIDI控制器?

共2条 1/1 1 跳转至

如何使用Arduino构建无接触MIDI控制器?

助工
2018-09-21 14:49:04     打赏

学习如何使用Arduino构建自己的非接触式MIDI控制器。

MIDI(乐器数字接口)控制器是用于操纵数字音频工作站的行业标准数字设备。这些设备对音乐制作人来说是无价之宝,有各种形式,如MIDI键盘,MIDI鼓,Launchpad等等。它们通常由一系列按钮和电位计组成,用于将标准MIDI信号发送到计算机或合成器。然后将MIDI信号映射到各种声音或声音效果。

在这个项目中,我们将构建一个非接触式MIDI设备,可以通过将手悬停在传感器区域来操作。这对于希望拥有MIDI控制但已经专注于其他乐器的音乐家(特别是那些进行现场表演的人)非常有用。

 

它是如何工作的?

在之前的文章中,  我们使用Colpitts振荡器电路构建了金属探测器与传统的BFO(拍频振荡器)金属探测器不同,我们的金属探测器使用辅助固定频率线圈将主探测器线圈的频率转换到可听范围内,使用Arduino对主探测器的信号进行数字处理线圈,因此我们消除了对次级线圈的需求。

 

非接触式MIDI控制器


我们将使用相同的金属检测机制,并在之前的Arduino程序中添加一些内容,以创建非接触式MIDI设备。

探测器线圈将用作传感器(离散地塞入吉他的音孔),并且衬有锡箔的手套在其移近或远离探测器时引起振荡频率变化。振荡频率由Arduino(它安装在控制单元中,然后连接到吉他背面)测量,并转换为从MIDI端口发出的MIDI CC(控制变化)信号。还包括一个3按钮面板,用于在三个可以映射到不同效果的MIDI控制器编号之间切换。

 

物料

我们需要以下组件:

  • Arduino Nano(或任何等效的基于ATmega328p的Arduino)

  • 5针MIDI端口

  • 电阻:39kΩ,2.2kΩ,10kΩ,470Ω,220Ω

  • 陶瓷电容器:10nF(数量3),0.1μF(数量3)

  • BC338 NPN晶体管

  • 触觉按钮(数量3)

  • 漆包铜线(25 AWG,约60英尺长)

 

开始构建

该设备包括一个检测器线圈(感应手套的接近度),一个3按钮面板(选择三种效果之一),以及包含电路的主单元。

 

探测器线圈


要为探测器线圈创建一个线轴,请将两个塑料杯的嘴唇切断并粘在一起(您需要直径为3英寸的东西)。接下来,将漆包铜线紧紧缠绕在线轴上约70次。

然后,将线圈的两端焊接到带有TS连接器的音频电缆。 

 

按钮面板


对于按钮面板,您可以使用从破坏(或其他可消耗的)计算器中挽救的材料。将三个触觉按钮焊接到穿孔板上并制成外壳。每个按钮的一个端子连接到Arduino上的数字引脚,另一个引脚接地(参见下图)。

这意味着有三个按钮需要四个引脚才能与Arduino接口(三个数字引脚和一个接地连接)。因此,可以使用诸如TRRS连接器的4针连接器将面板连接到主单元。

注意:您将在视频中注意到我使用的是USB连接器; 这不是一个很好的做法,因为这不是一个真正的USB设备,但这些是我手边唯一的半导体四针连接器。

 

主要单位


最后,主要部件包含Arduino Nano,Colpitts振荡器电路,MIDI端口以及探测器线圈和按钮面板的端口。将主机安装在吉他背面(我使用的是Velcro)。

完整原理图


Colpitts振荡器与我们在金属探测器项目中使用的电路相同。我们有一个用于信号处理的Arduino和一个用于发送声音效果数据的MIDI端口。

 

MIDI信息

MIDI 1.0规范消息使用Arduino的硬件串行引脚(TX)传输,使用标准的MIDI通信波特率,31250bps。

每条MIDI信息都以状态字节开头(4位用于指定MIDI命令,后跟4位用于选择MIDI通道)。当检测器线圈中的振荡频率改变时,我们将使用第一通道0000发出“控制改变”命令1011(二进制)。

控制变更命令后跟2个字节:控制器编号(0-119)和控制器值(0-127)。我们发出的控制器编号将取决于当前选择的三种效果中的哪一种(通过按钮面板),控制器值将取决于锡箔与检测器线圈的接近程度(当箔片不可检测时为0,逐渐当它接近线圈时增加到127)。

例如,选择第二个效果并使锡箔略微悬停在线圈上方,适当的MIDI传输可能如下所示(二进制):1011 0000 00010001 01011010.字节00010001对应于十进制17,即控制器编号对于MIDI规范中的“通用滑块2”,字节01011010对应于十进制90,它指定控制器处于其71%位置(90 /127≈71%)。

 

设置功能

设置功能与金属探测器代码基本保持不变。附加的“Serial.begin(MIDI_SERIAL_RATE)”将硬件串行波特率设置为MIDI标准速率31250bps。

 

中断功能

中断功能测量中断之间的时间差(在每2000个Colpitts-振荡器周期之后发生)。与原始金属探测器代码相比,此功能所做的更改是保持运行总时间增量值的附加功能。由于Arduino的micros()函数在16 MHz电路板上的分辨率为4微秒(在8MHz变体上为8微秒),因此时间增量将达到4微秒的间隔。测量增量的这种有限分辨率导致不期望的波动,其可以通过使用总计来平滑。

 

循环功能

循环功能首先检查效果按钮的状态。如果按下任何一个按钮,则相应地更改所选的控制器编号。然后将其他控制器编号的控制器值重置为0。

接下来,采用最长中断时间增量运行总和(参考点,即没有金属存在以改变频率)和中断时间增量运行总量(最后4个样本)之间的差值来确定接近度锡箔到探测器线圈。将该值除以10将其归一化为接近0到127的范围。然后将其钳位到最大值127。

 

                    int sumDifference = (longestDeltaSum - rollingDeltaSum) / 10;


最后,调用辅助函数midiControlChange()来构建3字节MIDI消息(如上面“MIDI消息”部分所述),然后通过硬件序列传输它。

 

                    midiControlChange(MIDI_GENERAL_PURPOSE_SLIDERX, sumDifference);


结论

具有非接触式MIDI控制器是一种实用的方式,可以在不需要在乐器和传统MIDI控制器之间切换的情况下为音乐演奏添加MIDI支持。

探测器线圈的小巧外形使其成为嵌入现有仪器的理想选择,无需对仪器进行侵入式修改。后处理效果可以轻松映射到现代数字音频工作站中的几乎任何参数,为仪器本身的功能增加了另一个维度。




关键词: Arduino     MIDI控制器     半导体     IC    

院士
2018-10-03 23:01:41     打赏
2楼

谢谢分享,受教了。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]