源码 4 -- 喇叭播放插曲 You
BGM 取自插曲 You,简谱由网络提供,感谢作者……先把简谱附上:
还有一张自制的“钢琴按键频率分布”,没写那么全,只对应本程序,图如下:
附上源码:(初出茅庐,难免有写的不好的地方,仅作备份之用,欢迎指点,喷子退散……)
/*******************************************************************
喇叭播放音乐
BGM 取自的插曲 You
缺点:
1、没有添加调节音量的功能
2、音高、节拍 都要自己提前写好,工作量大
可以改进成:通过解析 midi 文件进行音乐播放
(midi 里边就是音高、节拍信息)
********************************************************************/
#include
sbitSPK = P1^0;// 喇叭输入
/************************************************************************************************************************************
PIANO_F[ ]:是钢琴按键的频率,数组下标对应钢琴按键,如上图所示
例:图上可以看出:8 号键对应钢琴的中央 C,正好是 PIANO_F[8],对应频率为 261.6 Hz
注:PIANO_F[0] 不代表任何按键,为了方便计数,数组下标从 1 开始有意义
*************************************************************************************************************************************/
float codePIANO_F[ ] = {7.63,
130.8, 146.8, 164.8, 174.5, 196.0, 220.0, 247.1,
261.6, 293.6, 329.6, 349.0, 392.0, 440.0, 494.0,
523.2, 587.2, 659.2, 698.3, 784.0, 880.0, 988.0,
1046.4, 1174.4, 1318.4, 1396.8, 1567.7, 1760.0, 1975.3};
/******************************************************************************************************
PITCH[ ]:指的是 音高,对应上图中的按键号
例:中音 do:如图对应 8 号键
高音 do:如图对应 15 号键
好处:假如歌曲播放到了第 i 个音,那么 PITCH[i] 就是对应钢琴上的按键
那么 PIANO_F[ PITCH[i] ] 就是对应的琴键的频率,方便编程使用
注:255 代表 音乐结束
0 代表 八分休止符
******************************************************************************************************/
unsigned char codePITCH[ ] = {16, 17, 16, 15, 16, 12, 17, 16, 15,
16, 17, 16, 15, 15, 19, 16,
16, 17, 16, 15, 16, 12, 17, 16, 15,
16, 17, 16, 15, 15, 12,
12, 10, 12, 15, 15,
16, 16, 16, 17, 17, 12,
12, 10, 12, 0, 15, 15, 16,
16, 16, 16, 19, 17, 12,
12, 10, 0, 12, 0, 15, 15, 15,
16, 16, 16, 17, 17, 12,
12, 10, 0, 12, 0, 15, 15, 16,
16, 16, 16, 19, 17, 26,
26, 24, 0, 26, 26, 22, 0, 23,
23, 22, 23, 0, 24, 23, 24, 26,
26, 24, 0, 26, 26, 22, 0, 23,
23, 22, 0, 23, 22,
255};
/***************************************************************************************************************
BEAT[ ]:指的是 节拍,数值代表基本节拍的倍数,这里基本节拍为 十六分音符 长
例:8,代表 8 倍 十六分音符 长,即:二分音符
4,代表 4 倍 十六分音符 长,即:四分音符
2,代表 2 倍 十六分音符 长,即:八分音符
1,代表 1 倍 十六分音符 长,即:十六分音符
6,代表 6 倍 十六分音符 长,即:符点四分音符
***************************************************************************************************************/
unsigned char codeBEAT[ ] = {4, 1, 1, 2, 2, 2, 1, 1, 2, 4, 1, 1, 2, 2, 2, 4,
4, 1, 1, 2, 2, 2, 1, 1, 2, 4, 1, 1, 2, 6, 2,
2, 4, 2, 6, 2, 2, 2, 2, 2, 6, 2,
2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 8,
255};
unsigned chartime_h = 0;// 用于向定时器中断程序传递下一步定时信息
unsigned chartime_l = 0;
unsigned inttime = 0;// 根据按键频率,换算出应该定时多长时间
unsigned chari;
voidInit_Timer0(void);// 初始化 定时器 0
voidDelay(unsigned intt);// 普通延时
voidDelay_ms(unsigned intt);// 相当近似的延迟 t ms
voidmain (void)
{
Init_Timer0();
for(i = 0; PITCH[i] != 255; i++) {// 顺序播放,255 为音乐结束
TR0 = 0;// 关 定时器0
Delay_ms(20);// 延时一段时
C51喇叭播 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)