问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于Arduino的ESP32蓝牙MIDI音乐设备开发教程

创作时间:
作者:
@小白创作中心

基于Arduino的ESP32蓝牙MIDI音乐设备开发教程

引用
CSDN
1.
https://blog.csdn.net/andylauren/article/details/137826209

本文将介绍如何使用Arduino开发ESP32蓝牙MIDI音乐设备。通过本教程,你将学习到如何搭建开发环境、编写代码以及实现基本的MIDI功能。

简介

在开始之前,让我们先看看一些基于ESP32的蓝牙MIDI项目:

  • 自制卡林巴电子琴,可通过蓝牙连接手机库乐队
  • 模仿“埙”的电子吹奏乐器

这些项目都是使用ESP32官方编译链进行的编译,对于一些开发者来说可能不太友好。因此,本文将使用Arduino的库来开发一个能实现类似功能的MIDI设备。

开发环境

  • ESP32开发板
  • Android手机(iOS设备未验证)
  • Arduino 2.3.2

开发过程

  1. 打开Arduino IDE,安装库中搜索“BLE-MIDI”并安装。

  2. 配置开发板:选择合适的ESP32模块。

  3. 手动修改库:由于下载的依赖库中包含了多余的库,需要删除“ArduinoBLE”文件夹,以避免与ESP32的BLE库冲突。

函数介绍

必须使用的函数

引用头文件

#include <BLEMIDI_Transport.h>
#include <hardware/BLEMIDI_ESP32.h>

定义蓝牙设备

BLEMIDI_CREATE_DEFAULT_INSTANCE()

默认设备名为“Esp32-BLE-MIDI”。如果需要自定义设备名,可以使用以下宏:

#define BLEMIDI_CREATE_INSTANCE(DeviceName, Name)

例如:

BLEMIDI_CREATE_INSTANCE("MyBLEserver",MIDI)

初始化蓝牙MIDI设备

MIDI.begin();

连接和断开回调

BLEMIDI_Transport &setHandleConnected(void (*fptr)())
BLEMIDI_Transport &setHandleDisconnected(void (*fptr)())

使用示例:

BLEMIDI.setHandleConnected([]() {
  isConnected = true;
  digitalWrite(LED_BUILTIN, HIGH);
});
BLEMIDI.setHandleDisconnected([]() {
  isConnected = false;
  digitalWrite(LED_BUILTIN, LOW);
});

发送MIDI信息

void MidiInterface<Transport, Settings, Platform>::sendNoteOn(DataByte inNoteNumber,
                                                     DataByte inVelocity,
                                                     Channel inChannel)

参数说明:

  • inNoteNumber:播放的音节
  • inVelocity:音量(0-100),0表示关闭
  • inChannel:通道,对于MIDI音乐设备通常设置为1

音节表可以参考相关资料。

测试代码

#include <BLEMIDI_Transport.h>
#include <hardware/BLEMIDI_ESP32.h>
BLEMIDI_CREATE_DEFAULT_INSTANCE()
unsigned long t0 = millis();
bool isConnected = false;
#define LED_BUILTIN 2
#define BUTTON_PIN 0

void setup() {
  MIDI.begin();
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  digitalWrite(LED_BUILTIN, LOW);
  
  BLEMIDI.setHandleConnected([]() {
    isConnected = true;
    digitalWrite(LED_BUILTIN, HIGH);
  });
  
  BLEMIDI.setHandleDisconnected([]() {
    isConnected = false;
    digitalWrite(LED_BUILTIN, LOW);
  });
  
  MIDI.setHandleNoteOn([](byte channel, byte note, byte velocity) {
    digitalWrite(LED_BUILTIN, LOW);
  });
  
  MIDI.setHandleNoteOff([](byte channel, byte note, byte velocity) {
    digitalWrite(LED_BUILTIN, HIGH);
  });
}

void loop() {
  int buttonState = digitalRead(BUTTON_PIN);
  if ((buttonState == LOW) && isConnected) {
    Serial.printf("123\n");
    MIDI.sendNoteOn (60, 100, 1);
    delay(500);
    MIDI.sendNoteOn (70, 100, 1);
    delay(5000);
    MIDI.sendNoteOn (60, 0, 1);
    MIDI.sendNoteOn (70, 0, 1);
  }
  delay(10);
}

测试步骤

  1. 将代码上传到ESP32开发板。
  2. 打开自乐班软件,进入“设备管理” -> “其他MIDI” -> “BLE MIDI设备”。
  3. 点击“Esp32-BLE-MIDI”,连接成功后设备名称后面会出现一个小黄点。
  4. 连接成功后开发板上的蓝灯会亮起,断开连接蓝灯会熄灭。
  5. 按下BOOT按键,手机会发出声音。

这个软件支持多种乐器选择,对于能够持续发声的乐器(如口琴、笛子等),需要调用音量为0的命令才能停止发声。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号