目录
说明:
以下内容皆由个人理解所得请各自斟酌学习。部分知识内容来自江协科技,部分简谱来自微信公众号:简谱大师
钢琴键模型:
C调音符与频率对照表:
其中以低音6为基准频率440Hz,其余以等比数列推算出来,下一个频率为:440*2^(1/12);依次类推即可推出所有频率值。
C调代表钢琴上只弹白键盘,D调代表有半音节加上黑键盘。
简谱:
示例谱子:
知识点:
如果全音符持续时间是2s,那么4分音符持续时间就是500ms,除了4分音符外,还有2分音符、8分音符、16分音符、32分音符。
1=C代表此简谱为C调,不包含升音符(#)。1=D为D调,包含升音符(#),降音符:(b)
4/4代表此简谱以四分音符为一拍(每个数字就是一拍,演奏完一拍要挺顿一瞬间),每小节有4拍。简谱中单个数字就是一拍。
默认单个数字就是4分音符,就是一拍。
"_"代表半延音,即4分音符(1/4)的一半8分音符(1/8),即代表奏响此拍时持续250ms。
“——”两个数字下都有下划线和各自下面有下划线代表一样。
“-”代表延音符,表示4分音符在此基础上延长一倍,即2分音符,奏响此拍时持续1s。
数字下面加“."代表降低音频,原本是中音1 降为低音1 。
数字上面加”."代表增高音频,原本是中音2增高为高音2。
数字后面加“."代表延音,但只延长此4分音符500ms的一半即8分音符250ms,那么总的就是750ms(3/8)
"#"代表增高音频,但只增高一半,叫半音,对应钢琴上就是白琴键后的黑琴键。
弧线代表这都是“你”这个字的音频变化,演奏时这3个节拍之间不要有停顿,演奏完3个节拍再停顿一瞬间演奏下一拍。
谱子:
敢问路在何方:
上学歌:
两只老虎:
小星星:
小星星这个简谱响出来很奇怪,应该是当时每个节拍都是连贯的没有停顿,之后写生日快乐歌的时候每个节拍都加了一瞬间的停顿就感觉效果很好。
生日快乐歌:
生日快乐歌,每个节拍响完就停顿那么一瞬间,可以把每个字区分出来。只写到第二行高音结束,这样正好和开头循环起来,感觉效果拉满。
小毛驴:
每个字奏响后停顿0.1个时间单位感觉效果拉满。
美丽的神话:
有点歌曲的味道。
天空之城:
这个简谱没有试过,不知道怎样。
代码:
main.c
#include <STC32G.H>
#include "GPIO.h"
#include "OLED.h"
#include "PWM.h"
#include "Delay.h"
#define Delay_Base_Time 500 //四分音节 设-500ms
const unsigned int Music_Fre[21] = {
262,294,330,349,392,440,494, //低音
523,587,659,698,784,880,988, //中音
1046,1175,1318,1397,1568,1760,1976, //高音
};
const float Music_Happy_Brithday[][2] = {
{0,1},{0,1},{5,1.5},{0,0.1},{5,0.5},{0,0.1}, //1祝你
{6,1},{0,0.1},{5,1},{0,0.1},{1+7,1},{0,0.1}, //生日快
{7,2},{0,0.1},{5,1.5},{0,0.1},{5,0.5},{0,0.1}, //乐-2祝你
{6,1},{0,0.1},{5,1},{0,0.1},{2+7,2},{0,0.1}, //生日快
{1+7,2},{0,0.1},{5,1.5},{0,0.1},{5,0.5},{0,0.1}, //乐-3祝你
{5+7,1},{0,0.1},{3+7,1},{0,0.1},{1+7,1},{0,0.1}, //生日快
{7,1},{6,1},{0,0.1},{4+7,1.5},{0,0.1},{4+7,0.5},{0,0.1},//乐-4祝你
{3+7,1},{0,0.1},{3+7,1},{0,0.1},{2+7,1},{0,0.1}, //生日快
{1+7,2},{0,0.1},//乐
{0xff,0xff},
};
const float Music_Small_Traget[][2] = {
{1,1},{2,1},{3,1},{1,1},{0,0.01}, //两只老虎
{1,1},{2,1},{3,1},{1,1},{0,0.01}, //两只老虎
{3,1},{4,1},{5,1},{0,0.5}, //跑的块-
{3,1},{4,1},{5,1},{0,0.5}, //跑的块-
{5,0.5},{6,0.5},{5,0.5},{4,0.5},{3,1},{1,1},{0,0.1},
{5,0.5},{6,0.5},{5,0.5},{4,0.5},{3,1},{1,1},{0,0.1},
{1,1},{5-7,1},{1,1},{0,0.5}, //真奇怪
{1,1},{5-7,1},{1,1},{0,0.5}, //真奇怪
{0xff,0xff},
};
const float Music_Small_Lv[][2] = {
{1,0.5},{0,0.1},{1,0.5},{0,0.1}, //我有
{1,0.5},{0,0.1},{3,0.5},{0,0.1}, //一头
{5,0.5},{0,0.1},{5,0.5},{0,0.1}, //小毛
{5,0.5},{0,0.1},{5,0.5},{0,0.1}, //驴我
{6,0.5},{0,0.1},{6,0.5},{0,0.1}, //从来
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //也不
{5,2},{0,0.1}, //起
{4,0.5},{0,0.1},{4,0.5},{0,0.1}, //有一
{4,0.5},{0,0.1},{6,0.5},{0,0.1}, //天我
{3,0.5},{0,0.1},{3,0.5},{0,0.1}, //心血
{3,0.5},{0,0.1},{5,0.5},{0,0.1}, //来潮
{2,0.5},{0,0.1},{2,0.5},{0,0.1}, //骑着
{2,0.5},{0,0.1},{2,0.5},{0,0.1}, //去赶
{5,1.5},{0,0.1},{5,0.5},{0,0.1}, //集.我
{1,0.5},{0,0.1},{1,0.5},{0,0.1}, //手里
{1,0.5},{0,0.1},{3,0.5},{0,0.1}, //拿着
{5,0.5},{0,0.1},{5,0.5},{0,0.1}, //小皮
{5,0.5},{0,0.1},{5,0.5},{0,0.1}, //鞭我
{6,0.5},{0,0.1},{6,0.5},{0,0.1}, //心里
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //正得
{5,2},{0,0.1}, //意
{4,0.5},{0,0.1},{4,0.5},{0,0.1}, //不知
{4,0.5},{0,0.1},{6,0.5},{0,0.1}, //怎么
{3,0.25},{0,0.1},{3,0.25},{0,0.1}, //哗啦
{3,0.25},{0,0.1},{3,0.25},{0,0.1}, //啦啦
{3,0.5},{0,0.1},{5,0.5},{0,0.1}, //啦啦
{2,0.5},{0,0.1},{2,0.25},{0,0.1}, //摔得
{2,0.25},{0,0.1},{2,0.5},{0,0.1}, //我一
{3,0.5},{0,0.1},{1,2},{0,0.1}, //身泥
{0xff,0xff},
};
const float Music_Buty_ShenHua[][2] = {
{6,1},{0,0.1},{3+7,1},{0,0.1},{7,2},{0,0.1}, //梦中人
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1},{2+7,1},{0,0.1},//熟悉的
{1+7,0.25},{0,0.1},{3+7,2},{0,0.1},{6,1},{0,0.1},//脸孔你
{6+7,1},{0,0.1},{5+7,0.5},{0,0.1},{6+7,0.5},{0,0.1},//是我守
{5+7,0.5},{0,0.1},{2+7,0.5},{0,0.1},{4+7,0.5},{0,0.1},//侯的温
{3+7,3.5},{0,0.1},{6,1},{0,0.1},{6+7,1},{0,0.1},//柔---就算
{5+7,0.5},{0,0.1},{2+7,0.5},{0,0.1},{3+7,0.5},{0,0.1},//泪水淹
{4+7,0.5},{0,0.1},{3+7,2},{0,0.1},{1+7,2},{0,0.1},//没天地
{6,1},{0,0.1},{3+7,1},{0,0.1},{2+7,1.5},{0,0.1},//我不会
{7,0.5},{0,0.1},{6,4},{0,0.1},{6,1},{0,0.1}, //放手---每
{3+7,1},{0,0.1},{7,2},{0,0.1},{6,0.5},{0,0.1}, //一刻-孤
{1+7,0.5},{0,0.1},{2+7,1.5},{0,0.1},{1+7,0.25},{0,0.1},//独的享
{3+7,2},{0,0.1},{6,1},{0,0.1},{6+7,1},{0,0.1}, //受只因
{5+7,0.5},{0,0.1},{6+7,0.5},{0,0.1},{5+7,0.5},{0,0.1},//我曾经
{5+7,0.5},{0,0.1},{2+7,0.25},{0,0.1},{4+7,0.75},{0,0.1},//许下承
{3+7,3.5},{0,0.1},{6,1},{0,0.1},{6+7,1},{0,0.1},//诺---你我
{5+7,0.5},{0,0.1},{2+7,0.25},{0,0.1},{3+7,0.75},{0,0.1},//之间熟
{4+7,0.5},{0,0.1},{3+7,1},{0,0.1},{2+7,1},{0,0.1},//悉的感
{1+7,2},{0,0.1},{6,1},{0,0.1},{3+7,1.5},{0,0.1},//动-爱就
{2+7,1.5},{0,0.1},{7,0.5},{0,0.1},{6,2},{0,1}, //要苏醒0
{6,0.5},{0,0.1},{7,0.5},{0,0.1}, //万事
{1+7,0.5},{0,0.1},{2+7,0.5},{0,0.1}, //沧桑
{3+7,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //唯有
{7,1},{0,0.1},{5,1},{0,0.1}, //爱是
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1},{2+7,1.5},{0,0.1},//永远的
{3+7,0.25},{0,0.1},{3,1},{0,0.1}, //神话
{6,0.5},{0,0.1},{7,0.5},{0,0.1}, //潮起
{1+7,0.5},{0,0.1},{2+7,0.5},{0,0.1}, //潮落
{3+7,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //始终
{7,1},{0,0.1},{5,1},{0,0.1}, //不悔
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1},{2+7,1.5},{0,0.1},//真爱的
{1+7,0.25},{0,0.1},{1+7,1},{0,0.1}, //相约
{6,0.5},{0,0.1},{7,0.5},{0,0.1}, //几番
{1+7,0.5},{0,0.1},{2+7,0.5},{0,0.1},{3+7,0.5},{1+7,0.5},{0,0.1},//苦痛的
{7,1},{0,0.1},{5,1},{0,0.1}, //纠缠
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //多少
{2+7,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //黑夜
{3+7,0.5},{0,0.1},{3+7,1},{0,0.1}, //挣扎
{6,0.5},{0,0.1},{7,0.5},{0,0.1}, //紧握
{1+7,0.5},{0,0.1},{2+7,0.5},{0,0.1}, //双手
{3+7,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //让我
{7,1},{0,0.1},{5,1},{0,0.1}, //和你
{6,0.5},{0,0.1},{1+7,0.5},{0,0.1}, //再也
{2+7,1.5},{0,0.1},{1+7,0.25},{0,0.1},{1,3},{0,0.6},//不离分
{0xff,0xff},
};
unsigned int Music_Count = 0;
void main()
{
OLED_Init();
OLED_ShowString(1,1,"PWM_");
// PWM_Init(262,0.993);
GPIO_Init_Pin(GPIO_P1,GPIO_P0,GPIO_Mode_Out_PP);
PWM_SetPIN(PWM_AB_A, GPIO_P1, GPIO_P0);
PWM_SetFreDuty(PWM_AB_A, 200, 0.5);
Delay_ms(500);
while(1)
{
//如果是0,就代表停顿
if(Music_Buty_ShenHua[Music_Count][0] != 0){
PWM_SetPIN(PWM_AB_A, GPIO_P1, GPIO_P0);
PWM_SetFreDuty(PWM_AB_A, Music_Fre[Music_Buty_ShenHua[Music_Count][0] - 1 + 7],0.9975);
}else{
PWM_Stop();
}
//显示当前发声频率
OLED_ShowNum(2,1,Music_Fre[Music_Buty_ShenHua[Music_Count][0] - 1 + 7],5);
OLED_ShowNum(3,1,Music_Count,2);
//延时一拍对应时间-死延时
Delay_ms(Music_Buty_ShenHua[Music_Count][1] * Delay_Base_Time);
Music_Count ++;
//判断是否结束
if(Music_Buty_ShenHua[Music_Count][1] == 0xff){
Music_Count = 0;
}
}
}