目录
简介
开发环境
开发过程
函数介绍
相关文章
简介
首先看几个视频,大佬们做的东西,都是基于esp32。
自制卡林巴电子琴,可通过蓝牙连接手机库乐队 MIDI Boy【理科生的第一件乐器】_哔哩哔哩_bilibili
【Totoro】模仿“埙”的电子吹奏乐器_哔哩哔哩_bilibili
相关的文章如下
Python挺酷的 | 识别蓝牙MIDI(基于ESP32开发板)_python解析midi-CSDN博客
【MIDI_Boy】使用ESP32做一个炫酷的【卡林巴】【电子琴】, 可通过蓝牙MIDI连接手机库乐队_esp32 midi-CSDN博客
上面这些都是用esp32官方编译琏进行的编译,对于我这种懒汉有点不友好,现在编译器,ide五花八门,实在不想做多配环境。
下面我就用arduino的库来开发一个能实现上面功能的方法。
开发环境
esp32开发板
android手机,因为我只有android手机,ios没有验证过。
arduino2.3.2
自乐班 自乐班 - 锣钹科技 (robkoo.com)
开发过程
打开raduino,安装库中搜索“BLE-MIDI”并安装。
先这样选,后面需要手动更改,
配置开发板
如果你用了其他esp32模块,根据需要进行选择。
现在我们需要手动修改一下库,以为刚刚全部下载的依赖库中包含了多余的库。
我们到“项目文件夹地址”的目录中
我们看到一共下载了4个库,我们需要手动把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.begin();
初始化蓝牙midi设备。
BLEMIDI_Transport &setHandleConnected(void (*fptr)())
{
_connectedCallback = fptr;
return *this;
}
BLEMIDI_Transport &setHandleDisconnected(void (*fptr)())
{
_disconnectedCallback = fptr;
return *this;
}
设备连接和断开回调。可以如下方法使用。
BLEMIDI.setHandleConnected([]() {
isConnected = true;
digitalWrite(LED_BUILTIN, HIGH);
});
BLEMIDI.setHandleDisconnected([]() {
isConnected = false;
digitalWrite(LED_BUILTIN, LOW);
});
void MidiInterface<Transport, Settings, Platform>::sendNoteOn(DataByte inNoteNumber,
DataByte inVelocity,
Channel inChannel)
发送信息给手机,inNoteNumber播放的音节,inVelocity音量0-100,0表示关闭,inChannel通道,对于midi音乐设备没有用到,直接写1即可。
音节的表可以看【低功耗蓝牙】④ 蓝牙MIDI协议-CSDN博客文章。
下面我贴一下我的测试代码,
#include <BLEMIDI_Transport.h>
//#include <hardware/BLEMIDI_ESP32_NimBLE.h>
#include <hardware/BLEMIDI_ESP32.h>
//#include <hardware/BLEMIDI_nRF52.h>
//#include <hardware/BLEMIDI_ArduinoBLE.h>
BLEMIDI_CREATE_DEFAULT_INSTANCE()
unsigned long t0 = millis();
bool isConnected = false;
#define LED_BUILTIN 2
#define BUTTON_PIN 0
// -----------------------------------------------------------------------------
// When BLE connected, LED will turn on (indication that connection was successful)
// When receiving a NoteOn, LED will go out, on NoteOff, light comes back on.
// This is an easy and conveniant way to show that the connection is alive and working.
// -----------------------------------------------------------------------------
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()
{
// MIDI.read();
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);
}
下载完成后手机上打开自乐班软件,找到“设备管理”,“其他MIDI”,“BLE MIDI设备”,点击“Esp32-BLE-MIDI”,连接完成后名字后面会有一个小黄点。
代码功能就是连接设备后开发板上的蓝灯亮起,断开连接蓝灯熄灭,按下boot按键手机会发出声音。
这个软件很强大,很多种乐器可以选择,而且我发现那些按一下发一声的乐器,比如钢琴,你调用一次,就会响较短的一声,当你选择那些能够持续发声的,比如口琴,笛子这种,发声会持续,直到调用音量为0才停止。
相关文章
【低功耗蓝牙】④ 蓝牙MIDI协议-CSDN博客
最全midi常用表 - 豆丁网 (docin.com)
【BLE MIDI】开发 BLE MIDI 硬件电子乐器设备需要遵循的相关规范 ( 资料收集 )-CSDN博客