注意各地的音乐家!通过创建自己的自定义乐器数字接口 (MIDI) 控制器,您可以让音乐的每一个音符都真正属于您,从而使音乐更具原创性。你怎么做这样的事情,你问?使用称为 Arduino 的开源电子原型平台。
图片来源:MakeUseOf。
使用 Arduino Uno,这个项目既简单又快速。如果您不熟悉 Arduino,您应该查看有关如何使用该板的教程。如果您有经验,请准备好应对这种设计。但在开始之前,请确保您知道 MIDI 信息有两种主要类型:控制变更 (CC) 和程序变更 (PC)。
CC 消息包含控制器编号和 0 到 127 之间的值。这些消息通常用于更改音量或音高等设置。接受 MIDI 的设备应附带说明默认设置哪些通道和消息以及如何更改它们的手册。
PC 消息比 CC 消息简单。PC 消息由单个数字组成,用于更改设备上的预设或音色。与 CC 消息一样,制造商应提供一份文档,概述特定消息更改了哪些预设。
以下是构建自己的 MIDI 控制器所需的内容:
一旦你收集了你的设备,就该开始了。因为只需要三个引脚,几乎任何 Arduino 都适用。这个项目包括两个控制程序的按钮、一个发送数据的 MIDI 端口和一个接收消息的设备。在最初的设计中,电路是建立在面包板上的,但可以将其转移到项目盒和焊接连接器中,以获得强大的解决方案。
图片来源:MakeUseOf。
图片来源:MakeUseOf。
采取以下步骤连接您的 MIDI 插座:
- MIDI pin 5 通过 220 ohm 电阻连接到 Arduino Transmit (TX) 1
- 通过 220 欧姆电阻将 MIDI 引脚 4 连接到 Arduino +5V
- MIDI pin 2 到 Arduino 地
至于按钮连接,按钮通过改变 Arduino 看到的电阻来工作。Arduino 引脚通过 10k 欧姆电阻通过开关直接接地 (LOW)。当按下按钮时,电路看到的值变为+5v,没有电阻(HIGH)。Arduino 可以使用 digitalRead(pin) 命令检测到这种变化。将按钮连接到 Arduino 数字输入/输出 (I/O) 上的引脚 6 和 7。连接两个按钮:
- 按钮左侧为+5V
- 按钮右侧通过 10k 欧姆电阻连接到 Arduino Ground
- 按钮右侧到 Arduino 引脚(6 或 7)
硬件完成后,就该进行测试了。您需要一个 USB-MIDI 接口和一根 MIDI 电缆。连接在面包板上的 MIDI 端口将发送数据,因此它用作输出。因为您的计算机接收数据,所以它是输入。该项目使用 47 Effects的 Arduino MIDI 库 v4.2 。安装库后,您可以通过转到 Sketch > Include Library > MIDI 将其包含在代码中。
您还需要一个程序来监控传入的 MIDI 数据:
接下来,将 Arduino 连接到您的计算机并上传以下测试代码:
#包括
#包括
#包括
#包括
#包括
MIDI_CREATE_INSTANCE(HardwareSerial,Serial, midiOut); // 创建一个名为 midiOut 的 MIDI 对象
无效设置(){Serial.begin(31250);// 为 MIDI 设置串口}
无效循环()
midiOut.sendControlChange(56,127,1); // 发送一个 MIDI CC — 56 = 音符,127 = 力度,1 = 通道
延迟(1000);// 等待 1 秒
midiOut.sendProgramChange(12,1); // 发送 MIDI PC — 12 = 值,1 = 通道
延迟(1000);// 等待 1 秒}
此代码将发送 CC 消息。如果一切正常,您应该会在 MIDI 监视器中看到一条消息。如果没有任何反应,请尝试故障排除:
- 确保所有连接正确
- 检查 MIDI 端口的接线是否正确——外侧边缘应该有 2 个备用引脚
- 仔细检查电路是否正确
- 验证电路是否使用 MIDI 电缆连接到 USB-MIDI 接口
- 检查您的 MIDI 电缆是否连接到 USB-MIDI 接口上的输入
- 确保 Arduino 有电
- 为您的 USB-MIDI 接口安装正确的驱动程序
为确保按钮正常工作,请上传以下测试代码。请注意,无需连接 MIDI 即可测试此部分。
常量 int buttonOne
= 6; // 将按钮引脚分配给变量
常量 int buttonTwo
= 7; // 将按钮引脚分配给变量
无效设置(){ .begin Serial
(9600);// 为文本设置序列号
销模式(buttonOne
,INPUT
);// 设置按钮作为输入
销模式(buttonTwo
,INPUT
);// 设置按钮作为输入}
void loop() {if(digitalRead(buttonOne
) ==HIGH
) { // 检查按钮状态
延迟(10);// 软件去抖动
if(digitalRead(buttonOne
) ==HIGH
) { // 再次检查按钮状态
Serial
.println("按钮一有效!"); // 记录结果
延迟(250);}
if(digitalRead(buttonTwo
) ==HIGH
) { // 检查按钮状态
延迟(10);// 软件去抖动
if(digitalRead(buttonTwo
) ==HIGH
) { // 再次检查按钮状态
Serial
.println("按钮两个有效!"); // 记录结果
延迟(250);}
在保持 USB 电缆连接的同时运行此代码,然后打开串行监视器(右上角 > 串行监视器)。当您按下一个按钮时,您应该会看到“Button One Works!” 或“按钮二有效!” 取决于您按下的按钮。
当一切都连接好并正常工作时,您将组装完整的控制器。下面的示例将为每个按下的按钮发送不同的 CC 消息,并且类似于上面的测试示例。
#包括
#包括
#包括
#包括
#包括
常量 int buttonOne
= 6; // 将按钮引脚分配给变量
常量 int buttonTwo
= 7; // 将按钮引脚分配给变量
MIDI_CREATE_INSTANCE(HardwareSerial
,,,Serial
)midiOut
; // 创建一个名为 midiOut 的 MIDI 对象
无效设置(){pinMode(buttonOne
,INPUT
);// 设置按钮作为输入
销模式(buttonTwo
,INPUT
);// 设置按钮作为输入
Serial
.开始(31250);// 设置 MIDI 输出}
void loop() {if(digitalRead( buttonOne
) == HIGH
) { // 检查按钮状态
延迟(10);// 软件去抖动
if(digitalRead(buttonOne
) ==HIGH
) { // 再次检查按钮状态
midiOut
.sendControlChange(56,127,1); // 发送一个 MIDI CC -- 56 = note, 127 = velocity, 1 = channel
延迟(250);}
if(digitalRead(buttonTwo
) ==HIGH
) { // 检查按钮状态
延迟(10);// 软件去抖动
if(digitalRead(buttonTwo
) ==HIGH
) { // 再次检查按钮状态
midiOut
.sendControlChange(42,127,1); // 发送一个 MIDI CC -- 42 = note, 127 = velocity, 1 = channel
延迟(250);}
你有它。MIDI 控制器有很多用途——从工作室控制器到脚控单元。您是否曾经创建过自己的自定义 MIDI 控制器?如果是这样,请在下面发表评论。
审核编辑:汤梓红
评论
查看更多