104 lines
6.6 KiB
C
104 lines
6.6 KiB
C
/********************************** music V2.0 说明 ************************************************************************
|
||
Music模块在Beep和Displayer模块基础上再次封装,用于控制“STC-B学习板”上播放音乐。加载该模块,将同时加载Beep模块、displayer模块。music模块共提供1个music驱动函数、4个应用函数:
|
||
(1)MusicPlayerInit():驱动music模块;
|
||
(2)char PlayTone(unsigned char tone, unsigned char beatsPM ,unsigned char scale, unsigned char beats):播放音乐音阶,实现用指定音调、指定节拍率、发指定音阶、发音节拍数。
|
||
函数参数:
|
||
tone:指定音调,有效值:0xFA、0xFB、0xFC、0xFD、0xFE、0xFF、0xF9分别对应音乐A、B、C、D、E、F、G调
|
||
beatsPM:节拍率,即每分钟节拍数,值范围10~255拍/分钟
|
||
scale:音乐简谱音高,1字节。
|
||
0x00——休止符
|
||
高4位:1——低8度音 2——中8度音 3——高8度音
|
||
低3位:1-7对应简谱音。其它值无效。
|
||
如:0x13表示低音3(mi)
|
||
beats:音长(节拍数),单位1/16拍。
|
||
如:16(0x10)对应1拍,32(0x20)对应2拍,8(0x08)对应半拍...... 。
|
||
函数返回值:(见Beep.h中定义BeepActName)enum BeepActName {enumBeepFree=0,enumBeepBusy,enumSetBeepOK,enumSetBeepFail};
|
||
(3)SetMusic(unsigned char beatsPM, unsigned char tone, unsigned char *pt, unsigned int datasize, unsigned char display):设定或改变要播放音乐和播放参数。
|
||
函数参数:
|
||
beatsPM:节拍率,即每分钟节拍数,值范围10~255拍/分钟,如果参数值为enumModeInvalid将不改变原beatsPM;
|
||
tone:指定音调, 有效值:0xFA、0xFB、0xFC、0xFD、0xFE、0xFF、0xF9分别对应音乐A、B、C、D、E、F、G调,参数值为enumModeInvalid或其它值将不改变原tone
|
||
*pt :指向要播放的音乐编码的首地址 。*pt 和 datasize 只有有一个参数 = enumModeInvalid,将不改变 *pt 和 datasize
|
||
datasize:要播放的音乐编码的长度(字节数) 。*pt 和 datasize 只有有一个参数 = enumModeInvalid,将不改变 *pt 和 datasize
|
||
display:Seg7和Led是否用来显示播放音乐信息,取值:
|
||
enumMscNull —— 不用
|
||
enumMscDrvSeg7 —— 用7段数码管Seg7(显示信息)
|
||
enumMscDrvLed —— 用Led指示灯(打拍) enumMscDrvSeg7andLed —— 用Seg7 和 Led
|
||
参数值为enumModeInvalid或其它值将不改变原display
|
||
音乐编码规则:
|
||
1,常规音乐简谱发音编码(成对出现,不可分开,中间不能插入其它编码和控制字)
|
||
基本格式:音高(1字节),节拍数(1字节),音高,节拍,......
|
||
其中“音高”部分:
|
||
0x11 — 0x17 :对应低音 do、re、mi、fa、so、la、si、
|
||
0x21 — 0x27 :对应中音 do、re、mi、fa、so、la、si
|
||
0x31 — 0x37 :对应高音 do、re、mi、fa、so、la、si
|
||
其中“节拍数”部分:
|
||
0x01-0xFF:单位1/16拍。也即十六进制中,高4位表示整拍数,低4位表示分拍数(1/16)
|
||
如:发音2拍: 0x20
|
||
发音半拍: 0x08
|
||
发音1拍半:0x18
|
||
2,音乐编码中可以插入以下控制字,用于设定音乐播放参数等(前6个也可以通过函数,用程序设定和实现):
|
||
enumMscNull : 不用
|
||
enumMscDrvSeg7 : 用7段数码管Seg7(显示信息)
|
||
enumMscDrvLed : 用Led指示灯(打拍)
|
||
enumMscDrvSeg7andLed : 用Seg7 和 Led
|
||
enumMscSetBeatsPM : 设置节拍率, 后面再跟 节拍率(1字节)
|
||
enumMscSetTone : 设置音调, 后面再跟 音调(1字节)
|
||
0xFA 或 0xFB 或 0xFC 或 0xFD 或 0xFE 或 0xFF 或 0xF9
|
||
分别对应音乐:A调 或B调………
|
||
enumMscRepeatBegin : 设置音乐播放重复开始处。重复一次(暂不支持多次),暂不能嵌套(嵌套无效或可能导致不可预期结果)
|
||
enumMscRepeatEnd : 设置音乐播放重复结束处
|
||
|
||
(4)SetPlayerMode(unsigned char play_ctrl) :音乐播放控制函数。
|
||
函数参数:
|
||
play_ctrl:enumModePlay : ”播放“
|
||
enumModePause : ”暂停“
|
||
enumModeStop :”停止/结束“
|
||
(其它参数无效)
|
||
所有操作在当前”音“播放完成后生效;
|
||
(5)char GetPlayerMode(void): 获取当前播放状态
|
||
函数返回值:(play_ctrl值)
|
||
enumModePlay : 播放状态
|
||
enumModePause : 暂停状态
|
||
enumModeStop : 停止/结束
|
||
(其它功能应用型函数可根据需要设置和增加)
|
||
|
||
|
||
编写:徐成(电话18008400450) 2021年3月5日设计,2021年9月5日更新
|
||
*/
|
||
|
||
#ifndef _music_H_
|
||
#define _music_H_
|
||
|
||
extern void MusicPlayerInit();
|
||
extern char PlayTone(unsigned char tone, unsigned char beatsPM, unsigned char scale, unsigned char beats);
|
||
// tone: 音调。F9,FA,FB,FC,FD,FE,FF分别对应G\A\B\C\D\E\F调,其它值无效
|
||
// beatsPM:节凑,单位:每分钟节拍数
|
||
// scale: 音高。0x00——休止符,高4位:1——低8度音 2——中8度音 3——高8度音,低3位:1-7简谱音。其它无效
|
||
// beats: 音长(节拍数),单位1/16拍。16(0x10)对应1拍,32(0x20)对应2拍,8(0x08)对应半拍......
|
||
extern void SetMusic(unsigned char beatsPM, unsigned char tone, unsigned char *pt, unsigned int datasize, unsigned char display);
|
||
//可设置或改变:全部、或部分播放参数(节拍率、音调、显示方式、音乐原数据)
|
||
//其中节拍率、音调、显示方式 也可以在音乐编码中设置
|
||
extern void SetPlayerMode(unsigned char play_ctrl);
|
||
//操作播放:enumModePlay 或 enumModePause 或 enumModeStop,分别设置音乐”播放“、”暂停“、”停止/结束“,所有操作在当前”音“播放完成后生效;
|
||
extern char GetPlayerMode(void); //获取当前播放状态
|
||
|
||
enum PlayerMode
|
||
{
|
||
enumModeInvalid = 0, //播放模式非法
|
||
enumModePlay, //播放
|
||
enumModePause, //暂停(可恢复续放)
|
||
enumModeStop
|
||
}; //停止(结束)
|
||
enum MusicKeyword
|
||
{
|
||
enumMscNull = 0xF0, //播放音乐时,不用7段数码管、LED指示灯(显示音乐播放相关信息)
|
||
enumMscDrvSeg7, //播放音乐时, 用7段数码管
|
||
enumMscDrvLed, //播放音乐时, 用 LED指示灯
|
||
enumMscDrvSeg7andLed, //播放音乐时, 用7段数码管、LED指示灯
|
||
enumMscSetBeatsPM, //音乐编码中关键字: 设置 音乐节拍
|
||
enumMscSetTone, //音乐编码中关键字: 设置 音调
|
||
enumMscRepeatBegin, //音乐编码中关键字: 设置 重复开始
|
||
enumMscRepeatEnd
|
||
}; //音乐编码中关键字: 设置 重复结束
|
||
|
||
#endif |