📄 music.c
字号:
#include "Music.H"
#include "Score.H"
#include "Buzzer.H"
#include "Delay.H"
#include "LED.H"
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <sysctl.h>
#include <gpio.h>
#include <stdlib.h>
// 定义音乐频率表
const long MusicFreqTab[] =
{
// 大字组
110, // A
117,
123, // B
131, // C
139,
147, // D
156,
165, // E
175, // F
185,
196, // G
208,
// 小字组
220, // a
233,
247, // b
262, // c
277,
294, // d
311,
330, // e
349, // f
370,
392, // g
415,
// 小字1组
440, // a1
466,
494, // b1
523, // c1
554,
587, // d1
622,
659, // e1
698, // f1
740,
784, // g1
831,
// 小字2组
880, // a2
932,
988, // b2
1047, // c2
1109,
1175, // d2
1245,
1319, // e2
1397, // f2
1480,
1568, // g2
1661,
// 小字3组
1760, // a3
1865,
1976, // b3
2093, // c3
2217,
2349, // d3
2489,
2637, // e3
2794, // f3
2960,
3136, // g3
3322,
// 小字4组
3520, // a4
3729,
3951, // b4
4186, // c4
4435,
4699, // d4
4978,
5274, // e4
5588, // f4
5920,
6272, // g4
6645
};
// 定义演奏速度
long MusicSpeed;
/***************************************************************************************************
功能:演奏初始化
参数:无
返回:无
***************************************************************************************************/
void MusicInit(void)
{
BuzzerInit();
LED_Init(LED1 | LED2 | LED3);
MusicSpeed = 3200;
}
/***************************************************************************************************
功能:演奏一个音符
参数:pNote是音符
返回:1结束演奏,0继续演奏
***************************************************************************************************/
tBoolean NotePlay(const tNote *pNote)
{
const long Tab[] = {0 , 2, 4 , 5 , 7 , 9 , 11};
long Freq;
long Time;
long x = 27; // 定义位置变量,初始位置指向MusicFreqTab[x]
// 处理音阶
switch ( pNote->mScale )
{
case -1: // 低音,降低一个八度
x -= 12;
LED_On(LED1);
break;
case 0: // 中音,不变
LED_On(LED2);
break;
case +1: // 高音,升高一个八度
x += 12;
LED_On(LED3);
break;
default: // 遇其它情况返回
return(1);
}
// 处理半音
switch ( pNote->mSharpFlat )
{
case ' ': // 正常,不变
break;
case '#': // 升半音
x++;
break;
case 'b': // 降半音
x--;
break;
default: // 遇其它情况返回
return(1);
}
// 处理唱名
switch ( pNote->mName )
{
case 0: // 休止符
Freq = 0;
LED_Off(LED1 | LED2 | LED3);
break;
case 1: // do
case 2: // re
case 3: // mi
case 4: // fa
case 5: // so
case 6: // la
case 7: // si
Freq = MusicFreqTab[x + Tab[pNote->mName - 1]];
break;
default: // 遇其它情况返回
return(1);
}
// 处理时值
switch ( pNote->mTime )
{
case 1: // 全音符
case 2: // 二分音符
case 4: // 四分音符
case 8: // 八分音符
case 16: // 十六分音符
case 32: // 三十二分音符
Time = MusicSpeed / (pNote->mTime);
break;
default: // 遇其它情况返回
return(1);
}
// 处理符点
switch ( pNote->mPoint )
{
case ' ': // 正常
break;
case '.': // 有符点,时值增加50%
Time += Time / 2;
break;
default: // 遇其它情况返回
return(1);
}
BuzzerSound(Freq);
Delay(Time * (TheSysClock / 4000));
BuzzerOff();
return(0);
}
/***************************************************************************************************
功能:演奏乐曲
参数:无
返回:无
***************************************************************************************************/
void MusicPlay(tScore *pScore)
{
long i = 0;
MusicSpeed = (3200 * 60) / (pScore->mSpeed);
for (;;)
{
if ( NotePlay(&(pScore->mNoteTab[i])) )
{
break;
}
LED_Off(LED1 | LED2 | LED3);
Delay(12 * (TheSysClock / 4000));
i++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -