Arduino MIDI 琶音器:模块化固件 + 欧几里得节奏 + 硬件可扩展设计
项目演进
- v1 (2019.03):Arduino Nano 单文件固件,7 滑锅 + 7 按钮控制调性、和弦、琶音型、速度、八度等,DIN-5 MIDI 输出驱动 Korg Volca Keys。
- v2 (2019.06):重构为**模块化 C++ 库**(
arpeggio2),剥离硬件抽象层,可移植至 Teensy、ESP32、STM32 甚至 PC 模拟器;新增**欧几里得节奏生成器**,支持多轨复合节奏。 - 硬件兼容性保持:原 Fritzing 原理图(
arpeggiator_LICtzK2a2Q.fzz)仍适用于新固件。
硬件架构
| 接口 | 引脚/模块 | 功能 |
|---|---|---|
| 7× 电位器 | A0~A6 | 根音八度、和弦八度、BPM、根音、琶音步数、调式、琶音型 |
| 7× 按钮 | D2~D8 (INPUT_PULLUP) | 触发 7 种和弦进行(I~VII 级) |
| MIDI OUT (DIN-5) | D1 (TX) + 220 Ω + 5V | 标准 31250 baud 电流环 |
| 2× LED | D9, D10 | 运行指示 / 拍子闪烁 |
| 4× 220 Ω | MIDI 电流限制 + LED 限流 |
音乐理论速查(固件内置)
- **12 平均律音名**:C C# D D# E F F# G G# A A# B(MIDI note 0~11)。
- **七音调式模式**:Ionian(大调)、Dorian、Phrygian、Lydian、Mixolydian、Aeolian(小调)、Locrian —— 由全/半音步长模板生成。
- **三和弦构成**:级数 1-3-5(大三和弦)/ 1-♭3-5(小三和弦)/ 1-♭3-♭5(减三和弦)等,按调式自动生成七个级数和弦。
- **琶音型**:上行、下行、上下行、随机、欧几里得分布(如 E(3,8) = ●○●○●○○○)。
- **同步模式**:
INT_SYNC(内部 BPM 滑锅)或EXT_SYNC(Volca SYNC IN/OUT 5V 脉冲,上升沿触发步进)。
模块化代码结构(arpeggio2 库核心类)
// 核心数据结构
struct Note { uint8_t pitch; uint8_t vel; uint16_t dur; }; // 音高、力度、时长(tick)
class Scale { /* 根音+模式 → 音级数组 */ };
class Chord { /* 级数+调式 → 音符集合 */ };
class Arpeggiator {
Scale scale; Chord chord; EuclidRhythm rhythm;
uint8_t style, steps, octaveRoot, octaveChord;
void setParams(...); // 映射电位器值
void triggerChord(uint8_t deg); // 按钮回调
Note nextNote(); // 每 tick 调用,返回下一音符或休止
};
// 硬件抽象层 (HAL) 示例
class Hal {
virtual uint16_t readPot(uint8_t ch) = 0;
virtual bool readBtn(uint8_t ch) = 0;
virtual void midiSend(uint8_t status, uint8_t d1, uint8_t d2) = 0;
virtual void ledSet(uint8_t idx, bool on) = 0;
virtual uint32_t millis() = 0;
};
// Arduino 实现见 hal_arduino.cpp
欧几里得节奏算法(Bjorklund 算法)
将 k 个 onset 尽可能均匀分布在 n 个步长中,生成传统非洲/巴尔干/电子音乐常用节奏型。
std::vector euclid(int n, int k) { // n=步长, k=onset数
std::vector> seq;
for (int i=0;i flat;
for (auto &v: seq) flat.insert(flat.end(), v.begin(), v.end());
return flat; // 长度 n, 含 k 个 true
}
固件移植指南
- 实现
Hal纯虚类(读电位器、读按钮、发 MIDI、驱动 LED、取毫秒数)。 - 实例化
Arpeggiator,主循环以 1 ms tick 调用nextNote(),非零则midiSend(0x90, note.pitch, note.vel);note.dur到期后发0x80Note Off。 - 电位器平滑:
val = val*0.9 + analogRead()*0.1防抖。 - 按钮边沿检测:上升沿触发
triggerChord()。
实战调试技巧
- MIDI Monitor(macOS)或 MIDI-OX(Windows)监控输出消息。
- Volca Keys
GLOBAL → MIDI CH设为 1,SYNC选AUTO。 - 电位器行程映射:
map(analog, 0, 1023, min, max),建议加死区 ±5。 - 欧几里得参数(n, k)映射到第 6、7 个电位器,实时重算节奏序列。
资源链接
- GitHub 源码(含模块化库、HAL 示例、Arduino 完整固件):raszhivin/arpeggio2
- Fritzing 原理图与 PCB:项目附件
arpeggiator_LICtzK2a2Q.fzz - 在线琶音器原型(Web Audio API):Web Demo
一句话总结:从单片机单文件到跨平台 C++ 库,Arduino MIDI 琶音器 v2 以模块化架构支撑调式、和弦、欧几里得节奏、内外同步,是电子音乐控制器开发的优秀参考实现。
制造工艺
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- Unopad:基于 Arduino 的无缝 Ableton Live MIDI 控制器
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- USB-BLE 无线 MIDI 适配器三种方案:让乐器无线连接 iOS 设备
- 打造功能完整的 Arduino 驱动 3D 打印机械臂:分步指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- 非接触体温筛查闸机:Arduino MKR1000 + 红外测温 + 舵机控制
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里