天嵌 ARM开发社区

 找回密码
 注册
查看: 4565|回复: 3

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

[复制链接]
素年锦时 发表于 2012-12-16 00:12:29 | 显示全部楼层 |阅读模式
用以前学C的时候写的一个小工具改装的,用VBA写的,打开前请将excel启用宏.打开后CTRL+SHIFT+H查看帮助
excel2007 + tq2440测试通过.

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


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

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

  13. struct Music_t {
  14.     char c1;
  15.     char c2;
  16.     char* geci;
  17. };

  18. struct Music_t myMus[] = {
  19.     {0x15, 0xC8, "我"},
  20.     {0x15, 0xC8, "家"},
  21.     {0x15, 0xC8, "住"},
  22.     {0x15, 0xC8, "在"},
  23.     {0x16, 0x88, "黄"},
  24.     {0x15, 0xC8, "土"},
  25.     {0x16, 0x90, "高"},
  26.     {0x6, 0x98, "坡,"},
  27.     {0x6, 0x44, 0},
  28.     {0x6, 0x4, 0},
  29.     {0x15, 0xE0, 0},
  30.     {0x16, 0x48, "大"},
  31.     {0x16, 0x50, "风"},
  32.     {0x16, 0x8, "从"},
  33.     {0x15, 0xC8, "坡"},
  34.     {0x15, 0xC8, "上"},
  35.     {0x15, 0x88, "刮"},
  36.     {0x15, 0xF0, "过,"},
  37.     {0x10, 0x8, 0},
  38.     {0x15, 0xC8, "不"},
  39.     {0x15, 0xD0, "管"},
  40.     {0x15, 0xC8, "是"},
  41.     {0x16, 0x88, "西"},
  42.     {0x16, 0x88, "北"},
  43.     {0x16, 0x90, "风"},
  44.     {0x16, 0x8C, "还"},
  45.     {0x16, 0x84, "是"},
  46.     {0x15, 0xC8, "东"},
  47.     {0x16, 0x88, "南"},
  48.     {0x6, 0x8C, "风,"},
  49.     {0x7, 0x50, 0},
  50.     {0x5, 0x88, 0},
  51.     {0x15, 0x48, 0},
  52.     {0x15, 0xC, "都"},
  53.     {0x14, 0xC4, "是"},
  54.     {0x15, 0x8, "我"},
  55.     {0x15, 0xC8, "的"},
  56.     {0x15, 0xD0, "歌"},
  57.     {0x15, 0x8, "我"},
  58.     {0x5, 0x44, "的"},
  59.     {0x15, 0x10, 0},
  60.     {0x14, 0xE0, "歌."},
  61.     {0x10, 0x10, 0},
  62.     {0x15, 0xC8, "我"},
  63.     {0x15, 0xC8, "家"},
  64.     {0x15, 0xC8, "住"},
  65.     {0x15, 0xC8, "在"},
  66.     {0x16, 0x88, "黄"},
  67.     {0x15, 0xC8, "土"},
  68.     {0x16, 0x90, "高"},
  69.     {0x6, 0x98, "坡,"},
  70.     {0x6, 0x44, 0},
  71.     {0x6, 0x4, 0},
  72.     {0x15, 0xE0, 0},
  73.     {0x16, 0x48, "大"},
  74.     {0x16, 0x50, "风"},
  75.     {0x16, 0x8, "从"},
  76.     {0x15, 0xC8, "坡"},
  77.     {0x15, 0xC8, "上"},
  78.     {0x15, 0x88, "刮"},
  79.     {0x15, 0xE0, "过,"},
  80.     {0x10, 0x20, 0},
  81.     {0x15, 0xC8, "不"},
  82.     {0x15, 0xD0, "管"},
  83.     {0x15, 0xC8, "是"},
  84.     {0x16, 0x88, "西"},
  85.     {0x16, 0x88, "北"},
  86.     {0x16, 0x90, "风"},
  87.     {0x16, 0x8C, "还"},
  88.     {0x16, 0x84, "是"},
  89.     {0x15, 0xC8, "东"},
  90.     {0x16, 0x88, "南"},
  91.     {0x6, 0x8C, "风,"},
  92.     {0x7, 0x50, 0},
  93.     {0x5, 0x88, 0},
  94.     {0x15, 0x48, 0},
  95.     {0x15, 0xC, "都"},
  96.     {0x14, 0xC4, "是"},
  97.     {0x15, 0x8, "我"},
  98.     {0x15, 0xC8, "的"},
  99.     {0x15, 0xD0, "歌"},
  100.     {0x15, 0x8, "我"},
  101.     {0x5, 0x44, "的"},
  102.     {0x15, 0x10, 0},
  103.     {0x14, 0xE0, "歌."},
  104.     {0x10, 0x20, 0},
  105.     {0x16, 0x48, "不"},
  106.     {0x16, 0x50, "管"},
  107.     {0x16, 0x10, "过"},
  108.     {0x15, 0xC8, "去"},
  109.     {0x10, 0x8, 0},
  110.     {0x15, 0x88, "了"},
  111.     {0x16, 0x4C, "多"},
  112.     {0x16, 0x44, "少"},
  113.     {0x6, 0x48, "岁"},
  114.     {0x16, 0x8, 0},
  115.     {0x15, 0xE0, "月,"},
  116.     {0x16, 0x4C, "祖"},
  117.     {0x16, 0x44, "祖"},
  118.     {0x16, 0x48, "辈"},
  119.     {0x16, 0x8, "辈"},
  120.     {0x5, 0xCC, "留"},
  121.     {0x14, 0xC4, 0},
  122.     {0x14, 0xD0, "下"},
  123.     {0x15, 0x30, "我,"},
  124.     {0x10, 0x10, 0},
  125.     {0x16, 0x48, "留"},
  126.     {0x16, 0x50, "下"},
  127.     {0x16, 0x8, "我"},
  128.     {0x15, 0xC8, "一"},
  129.     {0x15, 0xC8, "望"},
  130.     {0x15, 0x88, "无"},
  131.     {0x15, 0xC8, "际"},
  132.     {0x16, 0x50, "唱"},
  133.     {0x6, 0x48, "着"},
  134.     {0x16, 0x8, 0},
  135.     {0x15, 0xE0, "歌,"},
  136.     {0x15, 0xCC, "还"},
  137.     {0x15, 0xC4, "有"},
  138.     {0x15, 0xC8, "身"},
  139.     {0x16, 0x48, "边"},
  140.     {0x15, 0xC8, "这"},
  141.     {0x15, 0x88, "条"},
  142.     {0x5, 0x48, "黄"},
  143.     {0x14, 0xD0, 0},
  144.     {0x15, 0xB0, "河"},
  145.     {0x5, 0xD0, "噢"},
  146.     {0x6, 0x60, 0},
  147.     {0x6, 0xCC, 0},
  148.     {0x7, 0x44, 0},
  149.     {0x6, 0xC8, 0},
  150.     {0x16, 0xB0, 0},
  151.     {0x10, 0x8, 0},
  152.     {0x17, 0x48, "我"},
  153.     {0x17, 0x48, "家"},
  154.     {0x17, 0x48, "住"},
  155.     {0x17, 0x8, "在"},
  156.     {0x16, 0xC8, "黄"},
  157.     {0x16, 0x88, "土"},
  158.     {0x16, 0xD0, "高"},
  159.     {0x6, 0xCC, "坡,"},
  160.     {0x7, 0x44, 0},
  161.     {0x6, 0x58, 0},
  162.     {0x6, 0x8, 0},
  163.     {0x15, 0xD0, 0},
  164.     {0x17, 0x48, "四"},
  165.     {0x17, 0x48, "季"},
  166.     {0x17, 0x48, "风"},
  167.     {0x17, 0x8, "从"},
  168.     {0x16, 0xC8, "坡"},
  169.     {0x16, 0x88, "上"},
  170.     {0x16, 0xD0, "刮"},
  171.     {0x6, 0xC8, "过,"},
  172.     {0x7, 0x44, 0},
  173.     {0x6, 0x58, 0},
  174.     {0x6, 0x8, 0},
  175.     {0x15, 0xD0, 0},
  176.     {0x15, 0xC8, "不"},
  177.     {0x15, 0xD0, "管"},
  178.     {0x15, 0xC8, "是"},
  179.     {0x16, 0x90, "八"},
  180.     {0x16, 0x8C, "百"},
  181.     {0x16, 0x84, "年"},
  182.     {0x16, 0x8C, "还"},
  183.     {0x16, 0x84, "是"},
  184.     {0x15, 0xC8, "一"},
  185.     {0x16, 0x88, "万"},
  186.     {0x6, 0x8C, "年,"},
  187.     {0x7, 0x44, 0},
  188.     {0x5, 0x88, 0},
  189.     {0x15, 0x48, 0},
  190.     {0x15, 0xC, "都"},
  191.     {0x14, 0xC4, "是"},
  192.     {0x15, 0x8, "我"},
  193.     {0x15, 0xC8, "的"},
  194.     {0x15, 0xD0, "歌"},
  195.     {0x15, 0x8, "我"},
  196.     {0x5, 0x44, "的"},
  197.     {0x15, 0x4, 0},
  198.     {0x16, 0xB0, "歌."},
  199.     {0x10, 0x10, 0},
  200.     {0x5, 0x10, "噢"},
  201.     {0x15, 0xB0, 0},
  202.     {0x5, 0xD0, "噢~"},
  203.     {0x6, 0x60, 0},
  204.     {0x6, 0xCC, 0},
  205.     {0x7, 0x44, 0},
  206.     {0x6, 0xC8, 0},
  207.     {0x16, 0xE0, 0},
  208.     {0x10, 0x10, 0},
  209. };

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

  218. //BOARD BEEP
  219. void mybeep(U32 freq, U32 ms) {
  220.     Buzzer_Freq_Set(freq);
  221.     Delay(ms);
  222.     Buzzer_Stop();
  223. }

  224. //shichangBase_Ms 表示1/64拍所用的毫秒数
  225. void subPlay(char yingaoidx, char shichang, int kongxi, int shichangBase_Ms) {
  226.     if (0 != yingaoidx) { //如果yingaoidx为0则表示静止符
  227.         //real play 以指定时间长度,指定频率PWM播放
  228.         mybeep(freqTab[yingaoidx], shichang * shichangBase_Ms);
  229.         if (kongxi) {
  230.             Delay(20);
  231.         }
  232.     } else {
  233.         Buzzer_Stop();
  234.         Delay(shichang * shichangBase_Ms);
  235.     }
  236.     return;
  237. }

  238. void play(struct Music_t* pmusHead, int eleCnt) {
  239.     int idx = 0;
  240.     while(idx < eleCnt) {
  241.         int isum = ((pmusHead[idx].c1 << 8) | pmusHead[idx].c2);
  242.         char yingaoIdx = ((isum >> 6) & 0x3F);
  243.         char shichang = (isum & 0x3F);
  244.         int kongxi = ((isum >> 12) & 0x1);
  245.         if (0 != pmusHead[idx].geci) {
  246.             Uart_Printf("yingaoIdx=%d, shichang=%d, kongxi=%d, geci=%s\n",yingaoIdx, shichang, kongxi, pmusHead[idx].geci);
  247.         } else {
  248.             Uart_Printf("yingaoIdx=%d, shichang=%d, kongxi=%d, geci=%s\n",yingaoIdx, shichang, kongxi, "null");
  249.         }
  250.         subPlay(yingaoIdx, shichang, kongxi, 50);
  251.         ++idx;
  252.     }
  253.     return;
  254. }

  255. void musicGo(void) {
  256.     play(myMus, sizeof(myMus) / sizeof(struct Music_t));
  257. }

  258. //under code please move to main function
  259. extern void musicGo(void);
  260.     musicGo();
  261.     return;
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
lzty634158 发表于 2012-12-16 15:32:29 | 显示全部楼层
很好!有意思!顶
 楼主| 素年锦时 发表于 2012-12-16 23:45:53 | 显示全部楼层
本帖最后由 素年锦时 于 2012-12-17 21:44 编辑

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





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 素年锦时 发表于 2012-12-24 18:15:46 | 显示全部楼层
备份
http://wiki.freepascal.org/Cross_compiling/zh_CN
http://blog.chinaunix.net/uid-25299072-id-2956391.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-17 05:56 , Processed in 1.046875 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表