arduino的MIDI library应用之发送MIDI信息(二)

本文详细介绍如何使用 Arduino 和 MIDI 库创建一个简单的 MIDI 控制器。通过代码示例,展示了如何发送音符开/关、控制改变、程序改变、弯音、触后等 MIDI 消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<MIDI.h>

MIDI_CREATE_INSTANCE(HardwareSerial,Serial,HardwareMIDI);

byte SysExData[10];

void setup(){
//putyoursetupcodehere,torunonce:
HardwareMIDI.begin();
}

void loop(){

  HardwareMIDI.sendNoteOn(42,127,1); //音符开(音符,力度,通道)
  delay(1000);
  HardwareMIDI.sendNoteOff(42,127,1); //音符关(音符,力度,通道)
  delay(1000);
  HardwareMIDI.sendControlChange(20,100,1); //控制改变 (控制器号,数值,通道)
  delay(1000);
  HardwareMIDI.sendProgramChange(30,1); //程序改变 (程序号,通道)
  delay(1000);
  HardwareMIDI.sendPitchBend(8191,1);//弯音(弯音值,通道)最小值-8192 中间值0 最大值8191
  delay(1000);
  HardwareMIDI.sendAfterTouch(60,1);  //通道压力 俗称触后通道 (压力值,通道)  
  delay(1000);
  //大多数MIDI键盘的触后指的是触后通道,因为复音触后(0xA0,xx,xx)需要MIDI键盘每一个琴键都要安装压力传感器,
  //成本上考虑是不现实的
  
  //发送系统信息 MIDI规范中,系统信息以F0开头 以F7结束
  SysExData[0] = 0xF0;
  SysExData[1] = 0x04;
  SysExData[7] = 0x12;
  SysExData[9] = 0xF7;
  HardwareMIDI.sendSysEx(10, SysExData, true);
  delay(1000);
}

 

### 使用Arduino实现MIDI键盘功能的详细说明 #### 1. 硬件与软件准备 为了实现基于ArduinoMIDI键盘功能,首先需要准备好硬件和软件环境。硬件方面,可以选择使用标准Arduino开发板(如Arduino Uno、Arduino Mega等),并搭配MIDI接口模块或直接利用USB Host Shield支持的MIDI通信功能[^2]。在软件方面,需要安装Arduino IDE,并导入专门用于MIDI通信的库文件,例如`MIDI.h`库[^1]。 #### 2. MIDI库的基本配置 通过`MIDI.h`库可以轻松地实现MIDI消息的发送与接收。以下是一个基本的代码示例,展示如何初始化MIDI通信并发送音符信息: ```cpp #include <MIDI.h> // 创建一个基于HardwareSerial的MIDI实例 MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI); void setup() { // 初始化MIDI通信 MIDI.begin(MIDI_CHANNEL_OMNI); } void loop() { // 发送音符开启消息 MIDI.sendNoteOn(60, 127, 1); // 音符号60,力度值127,通道1 delay(500); // 发送音符关闭消息 MIDI.sendNoteOff(60, 127, 1); // 音符号60,力度值127,通道1 delay(500); } ``` 上述代码展示了如何通过Arduino发送简单的MIDI音符开闭信号。 #### 3. 实现MIDI键盘的功能扩展 若要实现完整的MIDI键盘功能,可以进一步扩展代码以支持按键扫描和对应的MIDI消息生成。通常,MIDI键盘会使用矩阵键盘电路设计,配合Arduino的数字输入引脚检测按键状态。以下是一个简单的按键扫描逻辑示例: ```cpp #include <MIDI.h> const byte ROWS = 4; // 行数 const byte COLS = 4; // 列数 byte rowPins[ROWS] = {2, 3, 4, 5}; // 行引脚 byte colPins[COLS] = {6, 7, 8, 9}; // 列引脚 byte keys[ROWS][COLS] = { {36, 37, 38, 39}, // 对应的MIDI音符号 {40, 41, 42, 43}, {44, 45, 46, 47}, {48, 49, 50, 51} }; bool previousStates[ROWS][COLS] = {false}; MIDI_CREATE_INSTANCE(HardwareSerial, Serial, MIDI); void setup() { for (byte i = 0; i < ROWS; i++) { pinMode(rowPins[i], OUTPUT); } for (byte j = 0; j < COLS; j++) { pinMode(colPins[j], INPUT_PULLUP); } MIDI.begin(MIDI_CHANNEL_OMNI); } void loop() { for (byte r = 0; r < ROWS; r++) { digitalWrite(rowPins[r], LOW); for (byte c = 0; c < COLS; c++) { if (!digitalRead(colPins[c]) && !previousStates[r][c]) { MIDI.sendNoteOn(keys[r][c], 127, 1); previousStates[r][c] = true; } else if (digitalRead(colPins[c]) && previousStates[r][c]) { MIDI.sendNoteOff(keys[r][c], 127, 1); previousStates[r][c] = false; } } digitalWrite(rowPins[r], HIGH); } } ``` 此代码实现了按键扫描并将按键状态转换为MIDI音符消息的功能[^1]。 #### 4. 外部存储与多轨音序器的实现 对于更复杂的项目需求,例如多轨道MIDI音序器,可以参考相关文献中的设计方案。文献中提到,通过选用适当的外部存储设备(如SD卡)来保存录制的MIDI序列数据,并结合Arduino的处理能力,可以实现最长32步进的多轨音序播放及录制功能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值