📄 rb_play.c
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <rb_stdio.h>
#include <rb_string.h>
#include <rb_mem.h>
#define rb_msc (u16 *)0x06012C00 //音符存放区0x06012C00
const float Mfreq[7][6]={
{32.70,65.41,130.81,261.63,523.25,1046.50},//C
{36.71,73.42,146.83,293.66,587.33,1174.66},//D
{41.20,82.41,164.81,329.63,659.26,1318.51},//E
{43.65,87.31,174.61,349.23,698.46,1396.91},//F
{49.00,98.00,196.00,392.00,783.99,1567.98},//G
{55.00,110.00,220.00,440.00,880.00,1760.00},//A
{61.74,123.47,246.94,493.88,987.77,1975.53}//B
};//简谱频率
extern u8 is_basic_run;
extern rb_get_str(char *exp,char *str);
u8 rb_mo=2;//当前音符单调
extern void play_snd2(u16 mus);
u8 music_cnt;
u16 M_np=0;
u16 M_ep=0;
u16 *const rb_music=rb_msc;
void add_music(u16 mus)
{
rb_music[M_ep&0x03FF]=mus;
M_ep++;
}
void ply_music()
{
//u16 loc;
if (M_np==M_ep) {set_sound_off();music_cnt=0;return;}
//loc=M_np&0x03FF;
if ((rb_music[M_np&0x03FF]&0x000F)!=7) play_snd2(rb_music[M_np&0x03FF]);
else set_sound_off();
M_np++;
}
u8 is_music(char ch)
{
int i;
char mm[]="CDEFGABP";
for (i=0;i<7;i++)
{
if (ch==mm[i]) return i+1;
}
return 0;
}
void rb_play(char *exp)
{
u8 id;
int i=0;
//int flg=0;
u8 yf,yd,len;
u16 mus;
char str[str_max_len];
rb_get_str(exp,str);
str_up(str);
while (str[i]!='\0')
{
id=is_music(str[i]);
if (id)
{
i++;
if (str[i]<'1' || str[i]>'8') {rb_error=6;return;}
len=str[i]-'0';
yf=id-1;
yd=rb_mo;
mus=len;
mus=(mus<<8)|(yf<<4)|yd;
add_music(mus);//音符加入播放缓存
}
else if(str[i]=='O')//设置音调
{
i++;
if (str[i]<'0' || str[i]>'5') {rb_error=6;return;}
rb_mo=str[i]-'0';
}
else {rb_error=6;return;}
i++;
}
}
void music_reset()
{
rb_mo=2;
M_np=0;
M_ep=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -