基于arduino的ESP32上蓝牙midi音乐设备开发教程

2024-04-16 17:28

本文主要是介绍基于arduino的ESP32上蓝牙midi音乐设备开发教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

简介

开发环境

开发过程

函数介绍

相关文章


简介

首先看几个视频,大佬们做的东西,都是基于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博客

这篇关于基于arduino的ESP32上蓝牙midi音乐设备开发教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909434

相关文章

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2

python依赖管理工具UV的安装和使用教程

《python依赖管理工具UV的安装和使用教程》UV是一个用Rust编写的Python包安装和依赖管理工具,比传统工具(如pip)有着更快、更高效的体验,:本文主要介绍python依赖管理工具UV... 目录前言一、命令安装uv二、手动编译安装2.1在archlinux安装uv的依赖工具2.2从github

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配