素年锦时 发表于 2012-12-16 00:12:29

PMW自制音乐DIY工具[For TQ2440]

用以前学C的时候写的一个小工具改装的,用VBA写的,打开前请将excel启用宏.打开后CTRL+SHIFT+H查看帮助
excel2007 + tq2440测试通过.

第一次发贴,还请多多关照.


demo是一首<我家住在黄土高坡>
生成后的代码为
//============================================================================
// Name      : boardMusic.c
// Author      : ma.xw
// Version   : 1.1
// Copyright   : ctrlC
// Description : 《黄土高坡》For TQ2440, date:2012-12-16
//============================================================================

#include "../inc/def.h"
extern void Buzzer_Freq_Set(U32 freq);
extern void Delay(int time);
extern void Uart_Printf(char *fmt,...);
extern void Buzzer_Stop( void );

struct Music_t {
    char c1;
    char c2;
    char* geci;
};

struct Music_t myMus[] = {
    {0x15, 0xC8, "我"},
    {0x15, 0xC8, "家"},
    {0x15, 0xC8, "住"},
    {0x15, 0xC8, "在"},
    {0x16, 0x88, "黄"},
    {0x15, 0xC8, "土"},
    {0x16, 0x90, "高"},
    {0x6, 0x98, "坡,"},
    {0x6, 0x44, 0},
    {0x6, 0x4, 0},
    {0x15, 0xE0, 0},
    {0x16, 0x48, "大"},
    {0x16, 0x50, "风"},
    {0x16, 0x8, "从"},
    {0x15, 0xC8, "坡"},
    {0x15, 0xC8, "上"},
    {0x15, 0x88, "刮"},
    {0x15, 0xF0, "过,"},
    {0x10, 0x8, 0},
    {0x15, 0xC8, "不"},
    {0x15, 0xD0, "管"},
    {0x15, 0xC8, "是"},
    {0x16, 0x88, "西"},
    {0x16, 0x88, "北"},
    {0x16, 0x90, "风"},
    {0x16, 0x8C, "还"},
    {0x16, 0x84, "是"},
    {0x15, 0xC8, "东"},
    {0x16, 0x88, "南"},
    {0x6, 0x8C, "风,"},
    {0x7, 0x50, 0},
    {0x5, 0x88, 0},
    {0x15, 0x48, 0},
    {0x15, 0xC, "都"},
    {0x14, 0xC4, "是"},
    {0x15, 0x8, "我"},
    {0x15, 0xC8, "的"},
    {0x15, 0xD0, "歌"},
    {0x15, 0x8, "我"},
    {0x5, 0x44, "的"},
    {0x15, 0x10, 0},
    {0x14, 0xE0, "歌."},
    {0x10, 0x10, 0},
    {0x15, 0xC8, "我"},
    {0x15, 0xC8, "家"},
    {0x15, 0xC8, "住"},
    {0x15, 0xC8, "在"},
    {0x16, 0x88, "黄"},
    {0x15, 0xC8, "土"},
    {0x16, 0x90, "高"},
    {0x6, 0x98, "坡,"},
    {0x6, 0x44, 0},
    {0x6, 0x4, 0},
    {0x15, 0xE0, 0},
    {0x16, 0x48, "大"},
    {0x16, 0x50, "风"},
    {0x16, 0x8, "从"},
    {0x15, 0xC8, "坡"},
    {0x15, 0xC8, "上"},
    {0x15, 0x88, "刮"},
    {0x15, 0xE0, "过,"},
    {0x10, 0x20, 0},
    {0x15, 0xC8, "不"},
    {0x15, 0xD0, "管"},
    {0x15, 0xC8, "是"},
    {0x16, 0x88, "西"},
    {0x16, 0x88, "北"},
    {0x16, 0x90, "风"},
    {0x16, 0x8C, "还"},
    {0x16, 0x84, "是"},
    {0x15, 0xC8, "东"},
    {0x16, 0x88, "南"},
    {0x6, 0x8C, "风,"},
    {0x7, 0x50, 0},
    {0x5, 0x88, 0},
    {0x15, 0x48, 0},
    {0x15, 0xC, "都"},
    {0x14, 0xC4, "是"},
    {0x15, 0x8, "我"},
    {0x15, 0xC8, "的"},
    {0x15, 0xD0, "歌"},
    {0x15, 0x8, "我"},
    {0x5, 0x44, "的"},
    {0x15, 0x10, 0},
    {0x14, 0xE0, "歌."},
    {0x10, 0x20, 0},
    {0x16, 0x48, "不"},
    {0x16, 0x50, "管"},
    {0x16, 0x10, "过"},
    {0x15, 0xC8, "去"},
    {0x10, 0x8, 0},
    {0x15, 0x88, "了"},
    {0x16, 0x4C, "多"},
    {0x16, 0x44, "少"},
    {0x6, 0x48, "岁"},
    {0x16, 0x8, 0},
    {0x15, 0xE0, "月,"},
    {0x16, 0x4C, "祖"},
    {0x16, 0x44, "祖"},
    {0x16, 0x48, "辈"},
    {0x16, 0x8, "辈"},
    {0x5, 0xCC, "留"},
    {0x14, 0xC4, 0},
    {0x14, 0xD0, "下"},
    {0x15, 0x30, "我,"},
    {0x10, 0x10, 0},
    {0x16, 0x48, "留"},
    {0x16, 0x50, "下"},
    {0x16, 0x8, "我"},
    {0x15, 0xC8, "一"},
    {0x15, 0xC8, "望"},
    {0x15, 0x88, "无"},
    {0x15, 0xC8, "际"},
    {0x16, 0x50, "唱"},
    {0x6, 0x48, "着"},
    {0x16, 0x8, 0},
    {0x15, 0xE0, "歌,"},
    {0x15, 0xCC, "还"},
    {0x15, 0xC4, "有"},
    {0x15, 0xC8, "身"},
    {0x16, 0x48, "边"},
    {0x15, 0xC8, "这"},
    {0x15, 0x88, "条"},
    {0x5, 0x48, "黄"},
    {0x14, 0xD0, 0},
    {0x15, 0xB0, "河"},
    {0x5, 0xD0, "噢"},
    {0x6, 0x60, 0},
    {0x6, 0xCC, 0},
    {0x7, 0x44, 0},
    {0x6, 0xC8, 0},
    {0x16, 0xB0, 0},
    {0x10, 0x8, 0},
    {0x17, 0x48, "我"},
    {0x17, 0x48, "家"},
    {0x17, 0x48, "住"},
    {0x17, 0x8, "在"},
    {0x16, 0xC8, "黄"},
    {0x16, 0x88, "土"},
    {0x16, 0xD0, "高"},
    {0x6, 0xCC, "坡,"},
    {0x7, 0x44, 0},
    {0x6, 0x58, 0},
    {0x6, 0x8, 0},
    {0x15, 0xD0, 0},
    {0x17, 0x48, "四"},
    {0x17, 0x48, "季"},
    {0x17, 0x48, "风"},
    {0x17, 0x8, "从"},
    {0x16, 0xC8, "坡"},
    {0x16, 0x88, "上"},
    {0x16, 0xD0, "刮"},
    {0x6, 0xC8, "过,"},
    {0x7, 0x44, 0},
    {0x6, 0x58, 0},
    {0x6, 0x8, 0},
    {0x15, 0xD0, 0},
    {0x15, 0xC8, "不"},
    {0x15, 0xD0, "管"},
    {0x15, 0xC8, "是"},
    {0x16, 0x90, "八"},
    {0x16, 0x8C, "百"},
    {0x16, 0x84, "年"},
    {0x16, 0x8C, "还"},
    {0x16, 0x84, "是"},
    {0x15, 0xC8, "一"},
    {0x16, 0x88, "万"},
    {0x6, 0x8C, "年,"},
    {0x7, 0x44, 0},
    {0x5, 0x88, 0},
    {0x15, 0x48, 0},
    {0x15, 0xC, "都"},
    {0x14, 0xC4, "是"},
    {0x15, 0x8, "我"},
    {0x15, 0xC8, "的"},
    {0x15, 0xD0, "歌"},
    {0x15, 0x8, "我"},
    {0x5, 0x44, "的"},
    {0x15, 0x4, 0},
    {0x16, 0xB0, "歌."},
    {0x10, 0x10, 0},
    {0x5, 0x10, "噢"},
    {0x15, 0xB0, 0},
    {0x5, 0xD0, "噢~"},
    {0x6, 0x60, 0},
    {0x6, 0xCC, 0},
    {0x7, 0x44, 0},
    {0x6, 0xC8, 0},
    {0x16, 0xE0, 0},
    {0x10, 0x10, 0},
};

U32 freqTab[] = {
      0,//静止符
      200, 200, 200, 200, 200, 200, 200, //低二 1,2,3,4,5,6,7
      131, 147, 165, 175, 196, 220, 247, //低一 1,2,3,4,5,6,7
      262, 286, 330, 349, 392, 440, 494, //常音 1,2,3,4,5,6,7
      523, 587, 659, 698, 784, 879, 987, //高一 1,2,3,4,5,6,7
      1047, 1175, 1319, 1397, 1568, 1760, 1976, //高二 1,2,3,4,5,6,7
};

//BOARD BEEP
void mybeep(U32 freq, U32 ms) {
    Buzzer_Freq_Set(freq);
    Delay(ms);
    Buzzer_Stop();
}

//shichangBase_Ms 表示1/64拍所用的毫秒数
void subPlay(char yingaoidx, char shichang, int kongxi, int shichangBase_Ms) {
    if (0 != yingaoidx) { //如果yingaoidx为0则表示静止符
      //real play 以指定时间长度,指定频率PWM播放
      mybeep(freqTab, shichang * shichangBase_Ms);
      if (kongxi) {
            Delay(20);
      }
    } else {
      Buzzer_Stop();
      Delay(shichang * shichangBase_Ms);
    }
    return;
}

void play(struct Music_t* pmusHead, int eleCnt) {
    int idx = 0;
    while(idx < eleCnt) {
      int isum = ((pmusHead.c1 << 8) | pmusHead.c2);
      char yingaoIdx = ((isum >> 6) & 0x3F);
      char shichang = (isum & 0x3F);
      int kongxi = ((isum >> 12) & 0x1);
      if (0 != pmusHead.geci) {
            Uart_Printf("yingaoIdx=%d, shichang=%d, kongxi=%d, geci=%s\n",yingaoIdx, shichang, kongxi, pmusHead.geci);
      } else {
            Uart_Printf("yingaoIdx=%d, shichang=%d, kongxi=%d, geci=%s\n",yingaoIdx, shichang, kongxi, "null");
      }
      subPlay(yingaoIdx, shichang, kongxi, 50);
      ++idx;
    }
    return;
}

void musicGo(void) {
    play(myMus, sizeof(myMus) / sizeof(struct Music_t));
}

//under code please move to main function
extern void musicGo(void);
    musicGo();
    return;




lzty634158 发表于 2012-12-16 15:32:29

{:2_148:} 很好!有意思!顶

素年锦时 发表于 2012-12-16 23:45:53

本帖最后由 素年锦时 于 2012-12-17 21:44 编辑

上传3首歌曲的bin,烧进NAND,从NAND起,输入1,听歌:lol





素年锦时 发表于 2012-12-24 18:15:46

备份
http://wiki.freepascal.org/Cross_compiling/zh_CN
http://blog.chinaunix.net/uid-25299072-id-2956391.html
页: [1]
查看完整版本: PMW自制音乐DIY工具[For TQ2440]