一款便携式启蒙电子钢琴的设计与实现
2021-07-19田伟李玲香潘学文
田伟 李玲香 潘学文
摘要:针对新手刚接触电子钢琴无法看懂五线谱,上手较为困难而易失去学习兴趣。该文在传统电子钢琴基础上,琴谱的部分则应用Qt技术来搭建界面,并将钢琴五线谱的每个发音转换成开发板中每个按键的位置得到简化琴谱。简化后的琴谱在开发板上显示出来的12个按键,正好对应简易琴谱上的每一个音。这样,无论什么基础的人都可以对照显示屏的琴谱,顺利弹奏出完整美妙的钢琴曲。此外,该文电子钢琴是在S5p6818开发板上实现的,携带方便而不占用大量空间资源。
关键词:电子钢琴;S5p6818;TFTP;线程
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2021)15-0212-03
1 背景
据调查分析,人们多数人认为自身会一种甚至多种乐器,会让自己在社会中有更好的发展,更好地表现自己,现在越来越多的家长热衷于青少年对乐器的学习和培养。
2019年初,卡西欧推出新一代轻薄便携带的电钢琴,PX,CDP,EP系列[1]。该系列电子琴虽然在体积有所改观,但出门携带仍有困难,而且价格不菲。其后,在针对电子钢琴体积大,价格贵的问题,一些钢琴制造商们又推出了可折叠式的电钢琴,相比于传统的电子钢琴来说,其体积大大减小,价格也相对实惠,但折叠式电子钢琴折叠后,仍然存在不便于随身携带和占用空间的问题。比如一些大学生对电子钢琴比较感兴趣的就不能在宿舍随时拿出,随时弹奏。如今,基于C++的电子钢琴,相比于前几代的钢琴系列,轻巧便携,价格实惠。
2 系统总体设计
本文系统主控模块采用S5p 6818芯片作为核心,用USB线将电脑与S5p 6818上的COMO端口相连接,再将电脑上的RJ45接口用网线与s5p 6818上的ETHERNET端口相连接,通过Tftp[2]将文件传输到S5p 6818上,开发板接收文件完毕后,通过SecureCRT 去控制终端的开发板,在开发板上对文件进行压缩,再运行,能够正常运行后,LED屏上会将文件中的内容显示出来,达到显示钢琴键盘的效果。其系统总体框图如图3所示。
3 系统实现
3.1 部分硬件设计
3.1.1 外围电源电路设计
电源供电采用DC 5V/3A提供给s5p6818供电,提供稳定的电压,充足的电流,且电源电压建立时间短,功耗消耗也低,能满足供电电源的所有基本要求。其外围供电电路设计如图4所示。
3.1.2 数据收发模块设计
数据收发模块使用PHY芯片RTL8211E对以太网进行连接进行收发数据,其连接电路如图5所示。
3.2 软件实现
3.2.1 钢琴界面实现
首先打开VMware-Workstation虚拟机,在虚拟机中左边的框中选中安装好的QtCreator,就可以创建一个新的Qt工程,其创建流程[3]如图6所示。
本文Qt界面搭建,采用mainwindow.ui[4]。因为其十分的简单,只需要在控键箱中找到自己需要的控键,然后拖拽到位于中心的设计区域即可。等在设计区域中把想要的界面搭建好后,编写代码设置一些特定按钮的信号以及槽函数实现想要达到的功能。
visible = false;(visble是申明在头文件中的一个布尔类型,在这将它赋值false)
ui->widget_datetime->setVisible(visible);(表示开始的时候将界面中命名为datatime的对象先隐藏起来)
connect(ui->btn_datetime,SIGNAL(clicked(bool)),this,SLOT(onShowOrHideWidget()));(连接点击按钮与当前界面类的信号与槽)
this->visible = !visible;
ui->widget_datetime->setVisible(visible);(判断visible的值,达到可以连续按动按钮,实现按钮功能的重复使用的效果)
当代码编写完成后,点击运行,就会把搭建好的界面显示出来,如图7所示。点击设置的显示琴谱按钮,就会把琴谱显示出来,点击切换琴谱,就会切换到下一张琴谱。如图8所示。
在Qt搭建的简易琴谱界面中,简易琴谱转化思想是将钢琴五线谱的每个发音转换成开发板中每个按键的位置。琴谱中的1就对应按键中的第1个按键,2就对应按键中的第2个按键,以此类推。刚好简谱是用阿拉伯数字1,2,3,4,5,6,7去表示音阶的7个基本级,分别读作Do,Re,Mi,Fa,Sol,La,Si,Do.而钢琴按键部分的第一个按键正好是发Do的音,以此类推,后面的按键就是发Re,Mi,Fa,Sol,La,Si,Do的音,正好又可以对应上音阶的7个基本级,所以可以达到让用户轻松识谱,轻松弹奏的目的。而琴谱中的0则表示在该处需要稍做停顿,可以达到表示该曲是几几拍的效果,使彈奏出来的效果更接近原钢琴曲。
3.2.2 电子钢琴程序实现
电子钢琴软件实现原理是将钢琴的一些基础发音和按键保存,存放到创建的链表中。按动琴键,就会由相应的进程去播放相应的音频,从而达到,按动每个按键,弹出对应音调。
程序代码编写思想:首先编写两个带头结点的双向链表,一个用来保存读取到的图片信息,一个用来保存钢琴按键对应音调的文件。再编写一个识别.bmp图片和.mp3的代码。因为在linux操作系统中,一切皆文件,它是根据文件内容来判断的,而不只是单单依靠后缀名来判断文件的格式的,当识别到.bmp和.mp3的文件后,会将文件的路径保存到之前创建的链表中,然后根据.bmp图片在linux操作系统的格式来对文件进行判断,看是否真的是符合要求的.bmp格式的图片,判断函数如下:
char buf[2];
read(fd,buf,2);
if(buf[0] != 0x42 || buf[1] != 0x4d)
{
printf("NO\n");
close(fd);
return -1;
}
printf("Yes\n");
然后将LED显示屏文件给打开并映射,(显示屏相关文件存放的路径为/dev/fb0)。
fd = open("/dev/fb0",O_RDWR);(打开显示屏相关文件,申请LCD设备资源)
映射:
plcd = mmap(NULL,800*480*4,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
if(plcd == MAP_FAILED)
{
perror("mmap error:");
return -1;
}
申请完显示屏资源后,就可以在显示屏上进行画点,显示出相应的图片在显示屏上。
void draw_point(int x,int y,int color)
{
*(plcd + 800*y + x) = color;
}
4 结束语
本文电子钢琴在传统电子钢琴的基础上,利用Qt技术搭建了一个琴谱界面显示简易琴谱,即使用户看不懂钢琴五线谱的情况下,也可根据简化琴谱弹奏钢琴曲,有良好的用户体验,并攜带方便,还可支撑简易谱和五线谱之间的切换,方便用户后续学习和使用,但系统录入的曲目数量有限。
参考文献:
[1] 卡西欧推出新一代轻薄便携电钢琴,不忘初衷突破自我[J].乐器,2019(7):98-99.
[2] 孙晓晔,王程,成彬.基于TFTP协议实现STM32的IAP[J].微型机与应用,2016,35(7):76-78.
[3] 付嘉宁.基于Qt的显控系统图形显示的研究[J].电子测试,2017(15):37-38.
[4] 赵北庚.Windows系统下Qt图形界面集成开发环境搭建[J].科技经济导刊,2016(9):20.
【通联编辑:代影】