当前位置: 首页 > news >正文

物业网站模板芜湖seo外包公司

物业网站模板,芜湖seo外包公司,公司做网站的目的,搜狗提交入口网址108键全调性钢琴 一 基本介绍1 项目简介2 实现方式3 项目构成 二 实现过程0 前置基本外设驱动1 声音控制2 乐谱录入基础乐理3 点阵屏谱点动态刷新4 项目交互控制5 录入新曲子过程 三 展示#xff0c;与链接视频地址1 主要功能函数一览2 下载链接3 视频效果 一 基本介绍 … 108键全调性钢琴 一 基本介绍1 项目简介2 实现方式3 项目构成 二 实现过程0 前置基本外设驱动1 声音控制2 乐谱录入基础乐理3 点阵屏谱点动态刷新4 项目交互控制5 录入新曲子过程 三 展示与链接视频地址1 主要功能函数一览2 下载链接3 视频效果 一 基本介绍 本章为项目整体介绍 1 项目简介 本项目通过摇杆模块控制模式切换TFTST7735S屏幕LED与点阵屏Max7219显示交互效果喇叭输出声音。摇杆可控制8种模式摇杆Z轴控制确定返回 播放音乐1-2-3控制声音增加减小串口直接设定具体值摇杆音乐模式点阵谱点开关 下为具体特点介绍 1广泛音调支持 支持从1CC#DD#EFF#GG#AA#B的所有音调还可以设置大小调或者用升降半调作为起始音还能使用不同的八度区作为起始音等级完美适配数字简谱几乎可以演奏你熟悉的任何曲子。内部代码会根据设置的初始参数算出该调性下其余一百零七个键的频率不需要提前打表一堆数组节省空间。 2精准还原声音 因为支持修改每个音符的升降半调和升降度并能精准控制音长节拍所以播放音乐分辨率很高音准极好类似一台一百零八键全频率的电子钢琴。录入了3首音乐含克罗地亚狂想曲与梦回还。 3使用简单 录一首谱子只需一个纯数字的一维乐谱数组和一个一键设置调性的函数用来配置新曲子。前者只要按照顺序和一定的规律对着数字简谱抄数字后者更简单根据简谱信息填两三个字母数字。不用懂很多只要会看数字简谱。可播放任何单手数字简谱。 4点阵灯谱扫描 可以通过点阵屏显示不同音符和节拍长度。一条扫描线从顶部扫描至底部每个音符都有长度与不同位置触碰到扫描线即消失类似音游。有两个注意点一是如何让扫描线和声音同步变化对时序必须严格控制。二是如何及时更新不同音符在点阵屏上的谱点因为点阵屏长度有限所以一定会遇到某个音符触碰底部部分被截断的情况需要及时在屏幕顶部恢复被截断的信息。 详细效果见底部视频 项目涉及到许多常用外设如用像是AD控制摇杆模块脉宽调制PWM控制声音串口收发数据SPI,IIC等基础知识。 2 实现方式 音符 1-7PWM控制喇叭发出不同声音。不同调性了解乐理基础根据数字简谱提取参数编写算法。乐谱录入一个音符含 度数/本身频率/时长/升降半调 4个综合信息通过4位十进制表示。第二章最后详细解释动态乐谱显示点阵屏驱动控制精准到控制每一个点从左到右x列对应以音符1-7y轴表示音符长度一行则表示最小节拍时长。交互摇杆控制功能切换TFT与LED显示内容变化。 3 项目构成 (1) 软件环境 上传程序keil5 图片转c数组img-lcd 字体编辑PctoLcd 串口测试串口助手 (2) 所需硬件 stm32F103C8T6TFTst7735_RGB128*160——8引脚小喇叭 或蜂鸣器大喇叭点阵屏MAX7219摇杆模块XYZ3轴LED灯RGB3色非必须 3接线 串口stm32RXA9TXA10 OLEDstm32SCLB8SDAB9 ST7735stm32GND电源地VCC3.3v电源SCL接PA5SDA接PA7RES接PB0DC接PB1CS接PA4BL空/3.3v MAX7219点阵屏stm32DinA6CsB13ClkB14 LEDstm32RB10GB11BB13 摇杆模块stm32XA0YA1ZC15 喇叭stm32红A2黑GND 喇叭TFT, 摇杆为必要外设。如不开灯谱点阵屏亦可不接 二 实现过程 本章详解每一步如何实现 0 前置基本外设驱动 基础驱动实现本文不在赘述。详细解释请跳转以下文章 MAX7219 IIC过程 TFTST7735 SPI过程 串口收发数据 UART协议 PWM脉宽调制 AD模数转换 1 声音控制 本节解释如何利用pwm发出不同频率响度的声音 1声音特性 音调指声音的高低由物体振动的频率决定频率越高音调越高频率越低音调越低 响度表示声音的大小或强弱由振幅和人耳与声源的距离决定。振幅越大距离越近响度越大振幅越小距离越远响度越小 声音的物理量 频率单位时间内物体振动的次数单位为赫兹Hz人类能听到的音频范围是20Hz~20kHz。 周期物体完成一次振动所需的时间单位为秒s与频率成反比。 2PWM控制声音 控制发出不同声音就是是控制声音不同的音调与响度也就是频率与声音大小。回想使用PWM控制舵机时舵机频率是固定的50Hz,通过改变占空比控制舵机角度。而控制声音完全不同 第一需要生成多种PWM频率第二修改占空比仅能改变声音大小不改变音调频率。 故而在使用PWM播放音乐是一定会面临需要经常变化PWM频率的问题而我们知道 PWM频率(定时器频率/PSC)/ARR 定时器频率/PSC * ARR 所以改变PWM频率本质是不断修改PSC或ARR的值为了简便二者改一个就可以。如把pwm频率修改为fre则只要令 ARR定时器频率/PSC)/fre PSC不变故分子为常数。以72Mh时钟频率PSC72为例修改PWM频率代码为 /* 功能运行中修改PWM的频率 参数修改后的频率 fre 公式PWM频率(定时器频率/PSC)/ARR 定时器频率/PSC * ARR */ void PWM_SetFrequency(uint16_t fre) {int arr72000000/72/fre;TIM2-ARR arr; }正常人耳能听到声音的频率范围大致在20Hz~20000Hz之间 108键钢琴的频率范围是从最低音A0的27.5Hz到最高音C8的4186.01Hz (3)代码核心部分 PWM.h #ifndef __PWM_H #define __PWM_H /* Tim2 4通道可控制4路PWM信号使用通道3 PWM输出引脚A2 */ void PWM_Init(void); void PWM_SetCompare3(uint16_t Compare); //改声音大小 1-999 void PWM_SetFrequency(uint16_t fre); //改声音发声#endif PWM.c 初始设定 #include stm32f10x.h // Device header #include PWM.h /* 功能PWM初始化 */ void PWM_Init(void) {//仅举核心部分TIM_TimeBaseInitStructure.TIM_Period 1000 - 1; //初始给个1000TIM_TimeBaseInitStructure.TIM_Prescaler 72 - 1; //分频后为1MH } /* 功能TIM2通道3-A2,占空比 改变每个周期内高电平或低电平的持续时间 参数Compare要写入的CCR的值范围0~20000 ,即为ARR范围 */ void PWM_SetCompare3(uint16_t Compare) {TIM_SetCompare3(TIM2, Compare); //设置CCR1的值精确地设置高电平持续时间 } /* 功能运行中修改PWM的频率 参数计数周期需要的频率 公式PWM频率(定时器频率/PSC)/ARR 定时器频率/PSC * ARR */ void PWM_SetFrequency(uint16_t fre) {int arr1000000.0/fre;TIM2-ARR arr; }2 乐谱录入基础乐理 数字简谱阅读基础必备 基础乐理 1音符规律 由于音符间的音符十二平均律相邻键含黑键频率乘以1.0594630943二的十二次方根频率大一度为2倍关系低一度除以2。故只要确定1初始调性即可计算出剩余108键的频率值存入一个二维数组即可大小为[9][12],代表0-8 九个度数区间的1-7音符频率、以及中间的黑键频率对应钢琴9个区每个区为12个键。 2大小调 大小调简单理解为就是一种1-7不同位置的按法大小调频率表相同不需要重新计算。区分大小调只需在代码种只需要加入2个映射数组即可20种弹法也没有问题 计算频率参考全全局变量值 //------------------------计算频率参数------------------- /* 音符数组-标准钢琴108键 1 8个度区升降度直接改一维下标 2 每个度区含cdefgab以及降半调共12个全黑白键设计一映射数组1-7到第二维度降半调10计算 3 乐谱4位十进制:半调0-2 音调1-7 音度0-8 大1则高8度 时长1-2-4 拍数 *///计算频率参考数组 uint16_t note[9][12]{//C C# D D# E F F# G G# A A# B{16,17,18,19,20,21,23,24,25,27,29,30}, //0 八度区 {32,34,36,38,41,43,46,48,51,55,58,61}, //1{65,69,73,77,82,87,92,97,103,110,116,123},//2{130,138,146,155,164,174,785,196,207,220,233,246}, //3{261,277,293,311,329,349,369,392,415,440,466,493}, //4{523,554,587,622,659,698,739,783,830,880,932,987}, //5{1046,1108,1174,1244,1318,1396,1480,1568,1661,1760,1864,1975},//6{2093,2217,2349,2489,2637,2793,2960,3136,3322,3520,3729,3951},//7{4186},//8 C8 }; //在note中找值的映射数组 uint8_t book_note[8]{0,0,2,4,5,7,9,11};//计算107个频率生成数组存入此处一曲一更覆盖。 uint16_t note2[9][12]{0};//大调映射 0-0 1-0 2-2 3-4 4-5 5-7 6-9 7-11(下一个1略) 全全半全全全半2 2 1 2 2 2 1 uint8_t major_scale[8]{0,0,2,4,5,7,9,11};// //小调映射 0-0 1-0 2-2 3-3 4-5 5-7 6-8 7-10(下一个1略) 全半全全半全全2 1 2 2 1 2 2 uint8_t minor_key[8]{0,0,2,3,5,7,8,10};生成对应调性如下另外107键的频率过程 /* 功能制造专属歌曲的频率数组 参数Scale:音调 C——B,c-b 大小调 参数dp: 0-1-2 降半调无升半调 参数degree:度数0-8 解释适配 do(C-Bc-b#/b,0-8)全音调108键全区每次播放歌曲前调用此函数计算出合适的频率并保存例:make_scale(C,1,4) doC4make_scale(D,2,5) doD#5 原理根据一个参考数组算出当前调性下的初始do的频率往后排11个键就是该度下所有键上下跨度乘2或除2就可以得出。 */ void make_scale(int Scale,int dp,int degree){//大小调do频率固定int t;double ans1.0594630943;double tem0;if(Scalea||Scaleb) //定初始调位置1-7t6Scale-a;else tScale-c1;if(ScaleA||ScaleB)t6Scale-A;else tScale-C1;tbook_note[t]dp-1; //定do的位置dp-1 -1 0 1,计算升降调temnote[degree][t];//不管大小调初始do频率相同变化都的是2-7位置也就是2个映射数组//degree度12键音note2[degree][0]tem;for(int i1;i12;i){tem*ans; //保留进度note2[degree][i]round(tem); //四舍五入}//degreee-1~0for(int idegree-1;i0;i--)for(int j0;j12;j)note2[i][j]note2[i1][j]/2;//degreee1~8for(int idegree1;i8;i)for(int j0;j12;j)note2[i][j]note2[i-1][j]*2; }3曲谱录入 由于本项目对于音准的高要求所以简谱中每个音符包含4个信息是否升降半调、本身音调、是否升降度、节拍。不需要引入字母使用4位数字记录个十百千位的数字记录信息做法类似于寄存器2进制写入数据。 千0 1 2 降/平/升 半调 升降半调即#/b输出数组后一位或前一位元素百频率 1-7十度0-8度 升度频率乘2个记录节拍 1 2 4 根据曲速可计算一拍时长tt除以4/(1、2、4)便是该音符发声时长,为了方便记忆否则设为421也可以本质是得出有几个最小一拍曲速如曲速为112则一拍时长为60/112 s 如实际谱子 /* 曲1Dream of cherry tree 1Db 大调 beat68 4/4 68太慢了提高到80 */ double beat160.0/80*1000; //DC曲速 原曲60.0/68 uint16_t song_DC[]{1351,1251,1352,1552,1351,1351,1051,1041,1251,1351,1251,1352,1552,1161,1161,1061,1162,1752,1652,1552,1351,1251,1352,1552,1351,1351,1051,1542,1642,1152,1252,1351,1251,1352,1552,1361,1361,1061,1262,1162,1752,1552,1651,1051,1551,1051,1451,1551,1652,1552,1351,1251,1051,1152,1742,1642,1152,1741,1041,1041,1041,1552,1652,1752,1162,1651,1652,1352,1451,1551,1652,1452,1351,1251,1042,1352,1742,1252,1151,1152,1644,1744,1152,1742,1152,1252,1352,1252,1251,1351,1251,1352,1552,1361,1042,1262,1162,1752,1652,1552,1551,1351,1251,1352,1552,1361,1042,1462,1362,1262,1162,1752,1751,1042,1752,1162,1262,1161,1162,1552,1651,1652,1452,1552,1452,1352,1252,1151,1051,1051,1051 };4播放声音 遍历乐谱数组依次播放每个音符即可。下为播放一个音符的函数 /* 功能按照时长演奏一个音符不含点阵屏变化 参数ans复合音符 参数btspeed一拍的曲速单位ms 参数scale大调1 小调0 解释根据音符信息演奏音符oled显示参数无灯模式效果精准音长更及时 */ void unlight_Sound(int ans,int btspeed,int scale){int halfans/1000; //0 1 2 降半音b 正常 升半音#int mscans/100%10; //1-7 不含0 8int degreeans/10%10; //0-8 度int tmans%10; //节拍 1 2 4 int fre;//1 fre为获取二维数组下标1-7与大小调映射if(scale) fremajor_scale[msc]; //大小调-判断else freminor_key[msc];if(half-11) fre; //2 判断是否升降半调else if(half-1-1) fre--; // -1 0 1 升/降半调前一个或后一个元素if(msc0) PWM_SetCompare3(0); //3修改声音大小,空音设占空比0else PWM_SetCompare3(voice);PWM_SetFrequency(note[degree][fre]); //4设置声音频率发声tmbtspeed/tm; //5控制发声时长Delay_ms(tm); //OLDED参数显示OLED_ShowString(3,7,degree:); OLED_ShowNum(3,14,degree,1);OLED_ShowString(4,1,fre:);OLED_ShowNum(4,5,note[degree][fre],4);OLED_ShowString(4,10,msc:);OLED_ShowNum(4,14,msc,1);//PWM_SetCompare3(0);//每个音符后额外停顿曲谱精准时无需设置//Delay_ms(5); }此函数仅用于播放声音不控制点阵屏注意与下面函数区分 3 点阵屏谱点动态刷新 点阵屏8*8XY轴代表信息 X1-7列对应音符1-7 Y每一行代表音符发声时长一行为最小节拍通过60/曲速计算得出Delay进行控制 扫描线会从上至下扫描碰到音符使其消失和乐谱中每个音符的时长对应同步。此算法设计包含以下部分 扫描线变化与乐谱的声音长度同步以Delay延时最小节拍为基础当扫描线达到顶端-立刻向后更新一屏的音符信息非同步而是某时刻更新预处理曲谱中每一个音符的显示信息代码计算处理人无需计算恢复被截断的底部音符保证正确性准确性 (1)预处理乐谱每个音符的点阵信息 预处理每个音符在点阵屏上出现的起始行与结束行位置存入标记数组msc_sort中。用于后续输出某音符在点阵屏上的具体位置注意截断 /* 功能 并预处理曲铺每个音符灯点位置信息 参数: 1-3,播放歌曲前先调用此函数 解释msc_sort数组覆盖每次播放前都需调用获取每个音符在点阵屏上 出现的起始行与结束行位置存入msc_sort*起始不可超过8结尾可大于等于8会在动态更新点阵屏时利用结尾特性判断触底截断音符 */ void load_msc(int num){int tem,mucis_num; if(num1){mucis_numsizeof(song_DC)/sizeof(song_DC[0]); //音符数msc_sort[0][0]1;msc_sort[0][1]4/(song_DC[0]%10);for(int i1;imucis_num;i) //每一个的值依据前一个结尾计算{temmsc_sort[i-1][1];if(tem8) temtem%81;else tem1;int r4/(song_DC[i]%10); //当前音符所占1/4节拍数就是需要几个点点亮msc_sort[i][0]tem; //起始必须小于等于8msc_sort[i][1]temr-1; //结尾可以大于等于8}}if(num2){//同上}if(num3){//同上} }(2)显示单个音符谱点函数 欲显示整个乐谱需先从显示一个音符开始 /* 功能显示一个音符的位置 参数k曲库中下标音符 参数ans复合音符值 介 绍在预处理数组中记录了开始点与结束点此处显示时超过底部不予显示在动态更新乐谱时在对确实的另外半截手动设置填补否则会覆盖第一行 */ void note_show(int k,int ans){int t4/(ans%10); //音符长度int xans/100%10; //音符0-7int ymsc_sort[k][0]; //音符起始行,不会超过8//向下显示t个音符超过不显示,所以不用msc_sort[1]for(int i0;it;i){Max7219_ShowGraph(y,x,x);y;if(y8) break; //先显示一次在结束} }需注意由于音符触底超长部分需要截断留在下一次显示所以超过第8行不显示。补充截断部分已在对应处单独编写代码。 (3)扫描线、声音、音符点、同步方式核心 此处与上述unlight_Sound数组区别是,添加的while循环部分。单纯播放声音只需要PWM写入频率然后延时即可。但添加乐谱后由于需要控制扫描线与音符声长同步以2个最小节拍长的音符为例则实际过程为 PWM发声-扫描线1出现-Delay最小节拍1-扫描线1消失-扫描线2出现-Delay最小节拍2-扫描线2消失。 这样可以做出声音与点阵屏同步更新的效果以最小延时为基础人眼是察觉不到先后顺序的形成声画同步效果。其次是每个音符的谱点并非是只有播放到该音符才更新一个而是当扫描线出现在顶部时一次提前更新一屏幕的内容这样才有提前读谱的效果类似全民k歌而判段什么时候到达底部以及如何恢复被截断的音符部分通过预处理的谱点数组msc_sort实现。 /* 功能按照时长演奏一个音符扫描线对应同步变化 参数1音符编号 参数3复合数组 需要预处理点阵所以要传递数组 参数3beat节拍速度 参数4大调1小调0 解释扫描线于声音同步乐谱点是在每次扫描到第一行时更新满屏。扫描线与声音同步每个最小节拍间隔点阵屏都要亮灭一次乐谱点阵显示每次到第一行时刷新一整个点阵屏的音符点向后遍历遇到底部停止难点在于补全上一次末尾超长截断的灯点 */ void light_Sound(int k,uint16_t *ans,int btspeed,int scale){int halfans[k]/1000; //0 1 2 降半音b 正常 升半音#int mscans[k]/100%10; //0-7int degreeans[k]/10%10; //0-8 度int tm4/(ans[k]%10); //几个1/4节拍 1 2 4 int fre; //1 fre为获取二维数组下标1-7与大小调映射if(scale) fremajor_scale[msc]; //大小调-判断else freminor_key[msc];if(half-11) fre; //2 是否升/降半调-1 1前一个或后一个元素else if(half-1-1) fre--; if(msc0) PWM_SetCompare3(0); //3 音量设置,注意0不发声else PWM_SetCompare3(voice);PWM_SetFrequency(note[degree][fre]); //4发声int ymsc_sort[k][0]; //扫描线位置 1-8行while(tm--) //tm个最小节拍{if(y1){ //5 扫描到第一行立刻向后更新一屏的乐谱点阵for(int i0;i8;i){if(i0){ //当前字符是否为被截断字符并恢复截断长度if(msc_sort[k][1]8){ //避免连续出现一个长度无法到达下一个从而断屏for(int n1;nmsc_sort[i][1]-8;n)Max7219_ShowGraph(n,msc,msc);}elsenote_show(k,ans[k]);}else{note_show(ki,ans[ki]); //显示单个字符的点阵if(msc_sort[ki][1]8) //到底结束超长部分不显示break;}}}Max7219_ShowGraph(y,1,8); //6扫描线随 最小节拍更新Delay_ms(btspeed/4.0); //发音同时亮灯 Max7219_Clearline(y);y; //扫描线位置更新,最多到9if(y8) yy%8; //超过8则%8为1-7不能在加1会跳过空行}OLED_ShowString(3,7,degree:);OLED_ShowNum(3,14,degree,1);OLED_ShowString(4,1,fre:);OLED_ShowNum(4,5,note[degree][fre],4);OLED_ShowString(4,10,msc:);OLED_ShowNum(4,14,msc,1);//PWM_SetCompare3(0);//每个音符间额外停顿//Delay_ms(5); }此处为 模拟过程想要直接理解有难度最好自己去编写尝试 (4)完整播放乐曲函数 最终封装遍历音乐的函数可设置是否打开点阵屏模式与大小调选择由于基于最小延时节拍同步点阵与声音所以会占据部分cpu性能若只需播放音乐的话可设置关闭。 /* 功能播放音乐 参数1:曲目1-3 参数2:1 灯光 0 非灯光 参数3:1 大调 0 小调 解释可选择灯光模式 */ void Play_msc(int num,int mode,int scale){//可调控曲速if(num1){int rsizeof(song_DC)/sizeof(song_DC[0]);if(mode){for(int i0;ir;i) //有动态灯谱light_Sound(i,song_DC,beat1,scale); //2修改2大小调1为大PWM_SetCompare3(0);//播放完静音}else{for(int i0;ir;i)unlight_Sound(song_DC[i],beat1,scale);PWM_SetCompare3(0);}}if(num2){//同上}if(num3){//同上} }变速 如一首曲子需要多个曲速可以在对应for循环内部中判断当到达某个音符时 改变beat值接口加几个if语句即可解决。 4 项目交互控制 本质为利用摇杆8个模拟值区间上下左右与斜对角控制8个不同模式利用不同flag状态控制界面 rocker_music函数效果为根据AD采集摇杆信息判断摇杆位置0-8值来播放不同的音调1-7 TFT_update效果为根据不同数字显示不同的文字内容 AD摇杆模块的实现过于基础不再描述。包括设置全局变量声音、串口通信获取信息、TF图片文字显示。 /*接线 1 串口连接RX-A9 TX-A10 2 OLED连接SCL-B8 SDA-B9 3 TFTST7735GND 电源地VCC 3.3v电源SCL 接PA5SDA 接PA7RES 接PB0DC 接PB1CS 接PA4 BL 空/3.3v 4 MAX7219点阵屏: Din-A6 Cs-B13 Clk-B14 5 LEd_RGB: B10 B11 A3 6 摇杆XYZ: x-A0 y-A1 z-C15 7 喇叭A2 (另一根线接GND) */ #include stm32f10x.h // USE_STDPERIPH_DRIVER #include delay.h //--no-multibyte-chars #include OLED.h #include Serial.h#include LED.h #include KEY.h #include AD.h #include PWM.h#include St7735tft.h //TFT #include Max7219.h //点阵屏 #include playmusic.h //主要功能集成函数int main(void) {AD_Init();PWM_Init();LED_Init();KEY_Init();TFT_Init();Max7219_InitDisplay();OLED_Init();Serial_Init();TFT_UI(); //显示自定义界面OLED_ShowString(1,1,SKY_Music);int z,m1,mode0; //z轴状态m1与mode用来记录摇杆位置int falg_rocker0;//摇杆标记/*C-B调全升降调打表以do4度为例最大支持0-8度区间for(int iA;iG;i){for(int j0;j2;j)make_scale(i,j,4);Serial_Printf(\r\n);}*/while (1){//可随时串口更新音量if(Serial_RXString())set_voice();zKEY_Getnum(); //z轴状态OLED_ShowString(3,1,Z:);OLED_ShowNum(3,3,z,1);//自由编曲独占模式if(falg_rocker){if(z1) falg_rocker0;rocker_music();continue;}//记录摇杆值m1Get_rocker(); //摇杆一松手会归0所以需要2个值记录无法及时TFT_update(m1);if(m1!0) modem1; //记录变化的操作/*串口测试获取值Serial_Printf(z%d m1%d mode%d\r\n,z,m1,mode); *///调用功能if(zmode1){ //上:DC Dream of cherry treeload_msc(1);//载入歌曲make_scale(D,DOWN,4); //调性Db降半调度数4 1Db4Play_msc(1,light_Turn,MAJOR); //曲目编号灯光模式MAJOR大调}else if(zmode2){ //左上add声音lower_voice();TFT_update(2);}else if(zmode3){ //左:克罗迪亚load_msc(2);make_scale(E,DOWN,4); //1Eb4,小调Play_msc(2,light_Turn,MAJOR); }else if(zmode4){ //左下low声音upper_voice();TFT_update(4);}else if(zmode5){ //下:梦回还load_msc(3);Delay_ms(400);//曲目长更新下数组make_scale(A,NORMAL,4); //A4 不降调Play_msc(3,light_Turn,MAJOR);}else if(zmode6){ //下右空}else if(zmode7){ //右: 自由摇滚-独占,rocker音乐falg_rocker1; }else if(zmode8){ //右上灯光模式light_Turn!light_Turn;TFT_update(8);LED_On(1);Delay_ms(100);LED_On(2);Delay_ms(150);LED_On(3);Delay_ms(200);LED_Off(1);LED_Off(2);LED_Off(3);}} }//摇杆的按钮挂个中断及时反应 void EXTI15_10_IRQHandler(void){ //5创建中断函数//startup_stm32f0x_md.s找——-Table MappedDCD栏以EXTI_IRQHandler结尾//判断是不是15通道exti.h————EXTI_GetITStatus与EXTI_ClearITPendingBit函数if(EXTI_GetITStatus(EXTI15_10_IRQn)RESET){EXTI_ClearITPendingBit(EXTI_Line15);//清除标志位Serial_Printf(Z按钮进入中断\r\n);} }5 录入新曲子过程 (1)录入乐谱 进入Song.h文件 乐谱数组覆盖3首中随机一首的信息即可。修改对应beat曲速数字简谱会有曲速说明 以一小节为例4/4拍 录谱过程 实际录谱时使用语音识别输入与excel批量处理数字数据很快捷因为规律十分的简单 (2)修改带调性函数 进入main.c文件修改对应调性大小调参数即可 //根据编号信息修改 else if(zmode3){load_msc(2);make_scale(E,DOWN,4); //1Eb4, 改A-GDOWN/NORMAL/RISE 降平升半调初始度数0-8一般为4Play_msc(2,light_Turn,MAJOR); //改大小调MAJOR或MIRROR }#为升使用RISE b为降用DOWN 否则NORMAL A-G大小写通用 大调MAJOR 小调MIRROR 三 展示与链接视频地址 本章内容为主要功能函数展示与实现效果附上下载链接 1 主要功能函数一览 #ifndef __PLAYMUSIC_H #define __PLAYMUSIC_H/*song中引用文件: note[9][12] 频率文件 book_note[8] 映射 song_DC[] 曲库1 song_Croatia[] 曲库2 song_DreamBack[] 曲库3 beat1 曲1节拍 beat2 beat3 voice 声音 */#define RISE 2 //升半调 #define NORMAL 1 #define DOWN 0 //降半调 #define MAJOR 1 //大调 #define MINOR 0 //小调//playmusic定义 extern int light_Turn; //开关灯光模式 extern uint16_t msc_sort[800][2]; //预处理:每个音符在点阵屏初始位置信息//----------------功能函数----------------------- //音乐播放 void set_voice(void); //串口准确更新声音1-999 void lower_voice(void); //按一下200 void upper_voice(void);void load_msc(int num); //载入曲谱灯铺信息 void make_scale(int Scale,int dp,int degree);//制作不同曲目调108键调性表 void rocker_music(void);//摇杆音乐 void Play_msc(int num,int mode,int scale); //曲目编号灯光模式0-1//TFT void TFT_UI(void); void TFT_update(int k);//-------------------内部函数----------------------- //灯 void unlight_Sound(int ans,int btspeed,int scale); //音符无灯 void light_Sound(int k,uint16_t *ans,int btspeed,int scale); //音符带灯,动态更新乐谱 void note_show(int k,int ans); //显示单个音符的点阵超过底部部分不显示#endif 2 下载链接 点击下载源文件 与君共勉 3 视频效果 stm32自制可视化乐谱108键钢琴小白轻松奏神曲
http://www.hkea.cn/news/14472056/

相关文章:

  • 五莲网站建设报价网站建站公司公告
  • 网站建设怎么让网站收录wordpress 充值系统
  • 厦门市同安区建设工程质量安全监督站网站wordpress处理大数据
  • 镇江网站建设门户报价软件库合集软件资料链接
  • 怎么做网站接家纺订单做网站是需要多少钱
  • html网站建设中源代码wap网站解析
  • 怎么样做移动油光文字网站做网站买岩棉
  • 帮人做钓鱼网站做后期的网站有哪些
  • 爱站网关键词查询网站百度推广怎么赚钱
  • html5网站引导页模板怎么自创网页
  • 如何看一个网站是用哪个语言做的惠州网站建设 惠州邦
  • 普同网站跟营销型网站的区别上海网站设计与开发公司
  • 网上有卖网站链接的吗惠州建设网站开发
  • 工人找工作哪个网站好装潢设计师
  • 西安那些做网站的公司腾讯云怎么做网站
  • 杭州系统vi设计苏州优化网站建设
  • 做专属淘客网站西安网站快速优化
  • 百度创意产品网站做的网站怎么上传到网上
  • 邳州城乡建设局网站网站建设内部链接
  • 电子商务网站建设专业主修课程郑州专业建网站
  • 网站关键词排名突然没了那个网站做h5不要钱
  • 怎么利用快站做网站seo个人博客
  • 网站建设续费催款通知书做网站公司天津
  • 南京网站制作公司排名网上商城怎么购物
  • 网站 做百度推广有没有效果怎么样网页设计实训报告美食主题
  • 智能锁东莞网站建设长沙高端网站建设品牌
  • 网站建设7大概要多久天津建筑信息网
  • 中国建设银行官网网站推广是什么
  • 网站设计 开发人员网站开发人员调试
  • 黑龙江企业网站设计团队如何建立和设计公司网站