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;
{:2_148:} 很好!有意思!顶 本帖最后由 素年锦时 于 2012-12-17 21:44 编辑
上传3首歌曲的bin,烧进NAND,从NAND起,输入1,听歌:lol
备份
http://wiki.freepascal.org/Cross_compiling/zh_CN
http://blog.chinaunix.net/uid-25299072-id-2956391.html
页:
[1]