⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.c

📁 周立功公司的EasyARM1138资料
💻 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 + -