ESP32(掌控板) 电子琴

news2024/11/16 5:46:51

ESP32(掌控板) 电子琴

本程序实现了电子琴功能,通过机械按键改变变量的值实现“翻页”(每个八度分两页,共六页),通过触摸按键弹奏(包含半音),屏幕显示当前触摸按键弹奏的音。可能是屏幕刷新占用一定时间,本程序未实现长按功能。

图形化程序如下

Arduino代码如下

/*!
 * MindPlus
 * mpython
 *
 */
#include <MPython.h>

// 动态变量
volatile float mind_n_i;


// 主程序开始
void setup() {
	mPython.begin();
	mind_n_i = 3;
	buzz.setTicksTempo(4, 60);
}
void loop() {
	if (((buttonA.isPressed()) && (mind_n_i>1))) {
		mind_n_i -= 1;
		delay(100);
	}
	if (((buttonB.isPressed()) && (mind_n_i<6))) {
		mind_n_i += 1;
		delay(100);
	}
	if ((mind_n_i==1)) {
		display.setCursorLine(1);
		display.printLine("  低音");
		display.setCursorLine(3);
		display.printLine(" 1 1# 2 2# 3 4");
		if ((touchPadP.isTouched())) {
			buzz.freq(131, BEAT_1_4);
		}
		if ((touchPadY.isTouched())) {
			buzz.freq(139, BEAT_1_4);
		}
		if ((touchPadT.isTouched())) {
			buzz.freq(147, BEAT_1_4);
		}
		if ((touchPadH.isTouched())) {
			buzz.freq(156, BEAT_1_4);
		}
		if ((touchPadO.isTouched())) {
			buzz.freq(165, BEAT_1_4);
		}
		if ((touchPadN.isTouched())) {
			buzz.freq(175, BEAT_1_4);
		}
	}
	if ((mind_n_i==2)) {
		display.setCursorLine(1);
		display.printLine("  低音");
		display.setCursorLine(3);
		display.printLine("  4# 5 5# 6 6# 7");
		if ((touchPadP.isTouched())) {
			buzz.freq(185, BEAT_1_4);
		}
		if ((touchPadY.isTouched())) {
			buzz.freq(196, BEAT_1_4);
		}
		if ((touchPadT.isTouched())) {
			buzz.freq(208, BEAT_1_4);
		}
		if ((touchPadH.isTouched())) {
			buzz.freq(220, BEAT_1_4);
		}
		if ((touchPadO.isTouched())) {
			buzz.freq(233, BEAT_1_4);
		}
		if ((touchPadN.isTouched())) {
			buzz.freq(247, BEAT_1_4);
		}
	}
	if ((mind_n_i==3)) {
		display.setCursorLine(1);
		display.printLine("  中音");
		display.setCursorLine(3);
		display.printLine(" 1 1# 2 2# 3 4");
		if ((touchPadP.isTouched())) {
			buzz.freq(262, BEAT_1_4);
		}
		if ((touchPadY.isTouched())) {
			buzz.freq(277, BEAT_1_4);
		}
		if ((touchPadT.isTouched())) {
			buzz.freq(294, BEAT_1_4);
		}
		if ((touchPadH.isTouched())) {
			buzz.freq(311, BEAT_1_4);
		}
		if ((touchPadO.isTouched())) {
			buzz.freq(330, BEAT_1_4);
		}
		if ((touchPadN.isTouched())) {
			buzz.freq(349, BEAT_1_4);
		}
	}
	if ((mind_n_i==4)) {
		display.setCursorLine(1);
		display.printLine("  中音");
		display.setCursorLine(3);
		display.printLine("  4# 5 5# 6 6# 7");
		if ((touchPadP.isTouched())) {
			buzz.freq(370, BEAT_1_4);
		}
		if ((touchPadY.isTouched())) {
			buzz.freq(392, BEAT_1_4);
		}
		if ((touchPadT.isTouched())) {
			buzz.freq(415, BEAT_1_4);
		}
		if ((touchPadH.isTouched())) {
			buzz.freq(440, BEAT_1_4);
		}
		if ((touchPadO.isTouched())) {
			buzz.freq(466, BEAT_1_4);
		}
		if ((touchPadN.isTouched())) {
			buzz.freq(494, BEAT_1_4);
		}
	}
	if ((mind_n_i==5)) {
		display.setCursorLine(1);
		display.printLine("  高音");
		display.setCursorLine(3);
		display.printLine(" 1 1# 2 2# 3 4");
		if ((touchPadP.isTouched())) {
			buzz.freq(523, BEAT_1_4);
		}
		if ((touchPadY.isTouched())) {
			buzz.freq(554, BEAT_1_4);
		}
		if ((touchPadT.isTouched())) {
			buzz.freq(587, BEAT_1_4);
		}
		if ((touchPadH.isTouched())) {
			buzz.freq(622, BEAT_1_4);
		}
		if ((touchPadO.isTouched())) {
			buzz.freq(659, BEAT_1_4);
		}
		if ((touchPadN.isTouched())) {
			buzz.freq(698, BEAT_1_4);
		}
	}
	if ((mind_n_i==6)) {
		display.setCursorLine(1);
		display.printLine("  高音");
		display.setCursorLine(3);
		display.printLine("  4# 5 5# 6 6# 7");
		if ((touchPadP.isTouched())) {
			buzz.freq(740, BEAT_1_4);
		}
		if ((touchPadY.isTouched())) {
			buzz.freq(784, BEAT_1_4);
		}
		if ((touchPadT.isTouched())) {
			buzz.freq(831, BEAT_1_4);
		}
		if ((touchPadH.isTouched())) {
			buzz.freq(880, BEAT_1_4);
		}
		if ((touchPadO.isTouched())) {
			buzz.freq(932, BEAT_1_4);
		}
		if ((touchPadN.isTouched())) {
			buzz.freq(988, BEAT_1_4);
		}
	}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/728912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于微信小程序充电桩预约管理系统的设计与实现(论文+源码)_kaic

摘要 微信小程序的充电桩预约管理系统是一个复杂的系统&#xff0c;需要遵循不同的设计原则和方法&#xff0c;在实现高可用性、高性能、高安全性和高稳定性等特点的同时&#xff0c;还要注重用户体验和易用性&#xff0c;不断改进和迭代优化&#xff0c;以提高系统性能和用户满…

replicaSet,DaemonSet and Job

ReplicaSet 上一篇讲到的 ReplicationController 是用于复制和在异常的时候重新调度节点的 K8S 组件&#xff0c;后面 K8S 又引入了 ReplicaSet 资源来替代 ReplicationController ReplicationController 和 ReplicaSet 有什么区别呢&#xff1f; ReplicationController 和 …

Java中一个类可以继承多个类吗?揭秘多重继承的秘密!

大家好&#xff0c;我是你们的小米&#xff01;今天&#xff0c;我们来聊聊Java中一个备受争议的话题——"一个类可以继承多个类吗&#xff1f;"这是一个让许多Java初学者困惑的问题&#xff0c;也是一个常常被问及的热门话题。那么&#xff0c;到底Java中是否允许一…

Multi-Aspect Explainable Inductive Relation Prediction by Sentence Transformer

摘要 最近关于知识图(KGs)的研究表明,通过预先训练的语言模型授权的基于路径的方法在提供归纳和可解释的关系预测方面表现良好。本文引入关系路径覆盖率和关系路径置信度的概念,在模型训练前过滤掉不可靠的路径,以提高模型的性能。此外,我们提出了知识推理句子转换器(Know…

MySQL索引介绍及底层数据结构B+树介绍

索引 1. 索引概述1.1 索引1.2 索引的优缺点1.2.1 优点1.2.2 缺点 2. InnoDB中的索引2.1 主键索引设计方案2.2 索引底层数据结构2.3 常见索引2.3.1 聚簇索引2.3.1.1 优点2.3.1.2 缺点 2.3.2 非聚簇索引2.3.3 联合索引 3. MyISAM中的索引3.1 MyISAM 与 InnoDB对比 1. 索引概述 1…

代码随想录算法训练营第59天 | 503.下一个更大元素 II + 42.接雨水

今日任务 目录 503.下一个更大元素 II - Medium 42.接雨水 - Hard 503.下一个更大元素 II - Medium 题目链接&#xff1a;力扣-503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nu…

vmware提示此平台不支持虚拟化的Intel VT-x/EPT. 不使用虚拟化的Intel VT-x/EPT,是否继续?

当打开虚拟机时会发现弹出提示框显示不支持&#xff0c;只要检查三个步骤保证能正常使用 1、检查vmware虚拟机设置中处理器右边是否勾选虚拟化引擎 2、检查物理机中的windows组件是否冲突 打开控制面板选择程序和功能之后点击启用或关闭windows功能&#xff0c;取消Hyper-V 取…

插值算法

插值法在较少的数据模型的基础上模拟产生新的靠谱数值&#xff0c;可以用来预测。 利用已知的点建立合适的插值函数 f(x) ,未知点 x_i 由插值函数 f(x) 可以求出函数值 f(x_i) &#xff0c;用求得的 (x_i,f(x_i))近似代替未知点。 基本概念&#xff1a; yf(x)在[a,b]上有定义 x…

MySQL之概述、安装和使用(一)

一、概述 关系数据库概述&#xff1a; https://blog.csdn.net/qq_21370419/article/details/128568920 二、数据库的安装 参考我的两篇博客&#xff1a; win10 安装mysql 5.6.36版本_windows 安装mysql5.6_人……杰的博客-CSDN博客 wind 10 安装 mysql 8.0_人……杰的博客…

二十三种设计模式第十五篇--模版方法模式

模板方法模式是一种行为型设计模式&#xff0c;它定义了一个算法的骨架&#xff0c;而将一些步骤延迟到子类中实现。通过使用这种模式&#xff0c;我们可以在不改变算法结构的情况下&#xff0c;重新定义算法中的某些特定步骤。 模版方法的思想 模板方法模式的核心思想是将一…

WebDAV之π-Disk派盘 + FE文件管理器

FE File Explorer是一款功能强大且易于使用的文件管理器&#xff0c;它可以让你轻松地管理内部和外部存储器上的文件和文件夹&#xff0c;支持云存储服务&#xff0c;如派盘、Dropbox等。结合FE File Explorer和派盘可以实现更加高效便捷的文件管理体验。 π-Disk派盘 – 知识…

#systemverilog#进程控制问题#(二)终止进程

二 线程的终止 2.1 命名块 + diable Block,也就是语句块,SystemVerilog提供了两种类型的语句块,分别是begin…end为代表的顺序语句块,还有以fork…join为代表的并发语句块。 这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以命名的,就像我…

基于Prometheus 和 Grafana 实现springboot应用监控和服务器监控

目录 1.Prometheus环境搭建 1.1 下载和安装Prometheus 1.2 配置Prometheus 1.3 配置Prometheus抓取Spring Boot应用Metrics 1.4 启动Prometheus 2.Grafana环境搭建 2.1 下载和安装Grafana 2.2 配置Grafana数据源 2.3 创建Dashboard 3、NodeExporter&#xff08;服务器…

华为云Astro出品《低代码开发者101问》电子书上线

这四年来&#xff0c;在低代码平台的运营和客户支持过程中&#xff0c;我们有幸见证了华为云低代码的成长&#xff0c;也有幸认识了很多有思想、有热情、有行动力的低代码开发者朋友&#xff0c;我们自身对低代码领域的认识和理解也在不断整合、刷新。与开发者、客户、伙伴以及…

Vue3使用混入(混合)

minixs/entity.js&#xff1a;混入代码 //混入的实体类 import { reactive } from vue;const userEntityMixin {setup() {const Admin reactive({id: -1,account: "",userPassword: "",});const Teacher reactive({id: -1,account: "",userP…

Nginx启动、关闭及信息查看命令

1、查找Nginx的位置 ps -aux | grep nginx 2、启动Nginx nginx直接启动&#xff0c;这时候可能出现两种情况&#xff1a; 第一种&#xff0c;就是Nginx已经启动过了&#xff0c;会提示端口被占用&#xff0c;启动失败 我们尝试杀掉占用端口的进程&#xff0c;然后重启 sys…

基于springboot图书个性化推荐系统的设计与实现【附ppt和万字文档(Lun文)和搭建文档】

主要功能 前台登录&#xff1a; ①首页&#xff1a;图书名称查询、图书信息推荐、好书推荐、图书信息展示 ②图书信息&#xff1a;图书类别、图书名称、名称类别作者查询、图书详情、收藏、点赞、评论 ③好书推荐&#xff1a;图书展示、点击查看 ④留言反馈&#xff1a;用户可…

爆肝整理,Docker容器测试-常见问题+解决(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 问题1&#xff1a…

9 首页和图标定制

9.1 首页 springboot的首页是写在index.html中&#xff0c;而index.html可以放在静态资源存放的任何一个文件夹&#xff08;public、resources、static&#xff09;。然后&#xff0c;直接运行&#xff0c;访问localhost:8080即可。 9.2 图标定制 对于springboot2.7.13版本&am…

应用层:域名系统DNS

1.应用层&#xff1a;域名系统DNS&#xff08;Domain Name System&#xff09; 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;域名系统DNS 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 DNS报文使用运输层的…