yaboPP电子
项目

如何用Arduino构建一个无触点MIDI控制器

2016年11月3日,通过埃文羽衣甘蓝

学习如何使用Arduino构建自己的无触点MIDI控制器…视频和代码文件包括。

学习如何使用Arduino构建自己的无触点MIDI控制器。

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

在这个项目中,我们将建立一个无柔道的MIDI设备,可以通过将手悬停在传感器区域上来操作。这对希望拥有MIDI控件但已经专注于另一个乐器的音乐家(特别是那些做实时表演的人)有用。

它是如何工作的?

在前一篇文章中,我们使用Colpitts振荡器电路构成了金属探测器.与传统拍频振荡器(拍频振荡器)金属探测器,在二级频线圈是用来改变主探测器线圈到声音的频率范围内,我们的金属探测器使用的Arduino数字化过程信号的主要探测器线圈,我们从而消除需要一个次级线圈。

无触觉的MIDI控制器


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

探测器线圈将被用作传感器(分散地塞进吉他的音孔中),当它靠近或远离探测器时,内衬锡箔的手套会引起振荡频率的变化。振动频率由Arduino(安装在控制单元中,并连接到吉他的背面)测量,并转换成MIDI CC(控制变化)信号,通过MIDI端口传输出去。一个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接口(三个数字引脚和一个接地)。因此,一个4针连接器,如atrr连接器,可用于连接面板到主机。

请注意:你会注意到在视频中我使用了USB连接器;这不是很好的做法,因为这不是一个实际的USB设备,但这是我手头上仅有的四针连接器。

主要单位


最后,主单元包含Arduino Nano, Colpitts振荡器电路,MIDI端口,以及检测线圈和按钮面板的端口。将主单元连接到吉他的背面(我用的是尼龙搭扣)。

示意图

完整的原理图


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

MIDI消息

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

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

控制更改命令后面跟着2个字节:控制器编号(0-119)和控制器值(0-127)。控制器数量我们问题将取决于这三个影响是当前选择(通过按钮面板),和控制器价值将取决于距离的锡箔探测器线圈(0箔察觉时,逐步增加到127,因为它靠近线圈)。

例如,选择第二种效果并让锡箔在线圈上方稍微盘旋,适当的MIDI传输可能看起来像这样(二进制):1011 0000 00010001 01011010。字节00010001对应的是十进制17,是MIDI规范中“general purpose slider 2”的控制器编号,字节01011010对应的是十进制90,表示控制器在其71%位置(90/127≈71%)。

代码走查

这个项目的完整源代码可以在这里找到:

设置函数

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

中断函数

中断函数测量中断之间的时间增量(在每2000个colpitts -振荡器周期之后发生)。与原始的金属探测器代码相比,该函数所做的更改是增加了保留运行时间增量值的功能。由于Arduino的micros()函数在16 MHz板上的分辨率为4微秒(在8MHz的变体上分辨率为8微秒),时间增量将snap到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控制器之间切换。

检波器线圈的小形状使其非常适合嵌入到现有的仪器中,而不需要对仪器进行侵入式修改。后期处理效果可以很容易地映射到现代数字音频工作站的几乎任何参数,为仪器本身可以实现的功能增加了另一个维度。

ArduinoTouchlessMIDI-master.zip

为自己提供这个项目!BOM。

1评论
  • indigoredster 2021年1月29日

    这很酷!!!!我从来没有足够协调,可以做踏板或复杂的脚步行动,所以我更喜欢用手指!!!!谢谢!!!

    喜欢的。 回复