文档库 最新最全的文档下载
当前位置:文档库 › 一种简单音乐播放器算法的研究

一种简单音乐播放器算法的研究

一种简单音乐播放器算法的研究
一种简单音乐播放器算法的研究

一种简单音乐播放器算法的研究

电气10501 熊伟摘要:本文主要巧妙的充分利用了AVR的T/C1的特点,仅使用一个定时计数器,配合它的比较匹配功能,利用 T/C1的产生的比较匹配中断来输出相应的脉冲发声,同时在比较匹配中断中又对脉冲个数进行计数来控制音符发声时间,它大大提高了MCU的效率。这种功能的设计实现,可以非常方便的组合在一个复杂系统中使用。本文研究的音乐播放的算法可以选择音乐,可以调节播放速度和音调,可以不受时钟频率的限制而过多修改程序。

关键字:音乐播放器,比较匹配,中断

1.引言

在实际的应用中,经常需要利用单片机系统产生各种音乐用于报警和提示等,如手机的来电铃声,儿童玩具,时钟的音乐报时等。原则上讲,用单片机产生各种音乐发声的原理很简单,就是由I/O引脚输出不同频率的脉冲信号,再将信号放大,推动发声器件发声(这里是指在要求不高的情况下,用不同频率的脉冲方波替代正弦波)。

2.单片机发声的基本原理

在编写程序前,通常要先知道各不同的音符所对应的振荡频率,也就是确定各音符所对应的脉冲输出频率值。另外就是该音符发生的长度(节拍)值。接下来是根据所要产生曲谱的音调和节拍,建立相对应发声数据组,然后才能编写发生控制程序。

表1是一个音符的频率(周期)对应表。在表中,中音音符“1”的频率为523Hz,既1秒钟脉冲为523个,周期为1/523=1912us,半周期为956us。假设一般音乐的正常播放速度是1分钟120个节拍,那么每个节拍的时间长度为60s/120=500ms,1/4节拍的时间长度为500ms/4=125ms。

因此,如果要发出1/4节拍长度的中音“1”,I/O输出的脉冲频率应该为523Hz,输出脉冲的个数为523*0.125=65.375个,则输出半周期的脉冲个数为65.375*2=130.75。

我们以1/4拍为1个基本节拍单位,则2个基本单位表示1/2拍,4个基本单位为1拍,依次类推。

注意,表中最后的两行为音符所对应的半周期数和1/4基本节拍时间单位中输出半周期的个数。做这样的换算处理,并取整数,主要是方便在程序中使用。

根据表1,再按儿童歌曲“我爱北京天安门”的乐谱编制出发音数据组,每一个音符的发生用一组数据来表示。其中第一个数据表示发音的音符频率,第二个数据是节拍基本单位的倍率值,它表示音符的发音长度。如乐谱中第一个音符“5”为1/2拍,则其对应的数据表示为(20,2);第2个音符是1/2拍的高音“i”,其数据表示为(25,2);最后一个音符为2拍的“5”,其数据表示为(20,8)。把这些数据组合起来放到一个一维数组中,就可以形成用户自己的音乐数据库了。

5 i 5 4 | 3 2 1 | 1 1 2 3 | 3 1 3 4 | 5- |

20,2 25,2 20,2 18,2 17,2 15,2 13,4 13,2 13,2 15,2 17,2 17,3 13,2 17,2 18,2 20,8

表1 音符频率对应表

3.模块设计

3.1 硬件电路

与51单片机相比,AVR 单片机处理速度快,性能很高,并且内部资源丰富,所以我选用Atmega128单片机。图1为电原理图。用于发音的蜂鸣器接在PG3脚。编写程序在该脚上输出脉冲波,直接驱动蜂鸣器发声。

图1 仅使用T/C1实现音乐播放器电路图

3.2 软件设计

在一些网站中都可看到类似的设计例子,不足的是,这些示例往往是一个独立的例子,或采用软件定时和延时的方法来体现节拍时长,或使用多个硬件功能部件,如2个定时器等。这会大量地占用单片机的内部资源,不利于提高单片机的工作效率。

在这个例程中,巧妙的利用 T/C1的产生的比较匹配中断来输出相应的脉冲发声,同时又对脉冲个数进行计数来控制音符发声时间,它大大提高了MCU 的效率。 3.2.1比较匹配中断函数(发声函数)

在最开始定义全局变量时,可以通过语句“#define system_clock 8000000”来变换系统的时钟频率,也就达到了系统频率可调。int_n 记录了中断的次数,代表节拍长度。数组freq[]、time[Max_note]为音符对应的频率和基本1/4节拍应产生的半周期数。music_name 数组中为整个音乐的发声数据。在程序中语句“aa= music_name[note_n]+tone ”可以通过改变tone 值的大小来改变用户数组元素在频率数组中所对应的位置,也就相当于变换了音调,从而达到音调可调。

系统软件采用T/C1的CTC 比较匹配模式。中断函数通过对PG3脚输出的电平翻转产生方波信号来推动蜂鸣器发声。系统时钟为8MHz ,则根据CTC 模式下PWM 的频率计算公式

freq=

OCR1A)

2N(1ck

system_clo ,式中变量N 代表分频因子(1、8、64、256或1024),在本方

案中分频因子N 取1。

可算出OCR1A= system_clock /2/freq-1,freq 表示音符频率。寄存器OCRA1中为音符的半周期值,所以2次匹配中断的匹配比较输出在OC1A 上输出一个完整的方波(注意,OC1A 为触发取反方式)。变量int_n 记录了中断的次数,用于控制该音符脉冲输出的个数,实际上就是音符输出的时间,代表了节拍的长度。

在T/C1的OC1A 中断服务中会自动判别整个音乐是否全部播放完成,如果音乐没有全部播完,将取出下一个音符的音调和节拍,继续播放。

程序中巧妙的通过利用设置选定T/C1的计数脉冲源的方法来启动和停止T/C1的工作。设置T/C1无计数脉冲源输入(TCCR1B = 0x08)就是停止了T/C1的工作,不会产生脉冲输出。而TCCR1B = 0x09是设置系统时钟1分频后作为计数脉冲输入,这样就启动了T/C1工作计数,一旦计数值与OCR1A 相同,不仅在OC1A 脚上产生电平的变化(脉冲输出发音),而且也产生了中断申请。

#define system_clock 8000000 //选择系统时钟频率,单位Hz #define clock_freq system_clock/2 //OCR1A 要用到的计算频率 /***************定义音符频率数组****************/ uint __attribute__((progmem)) freq[] = {0,

//低音262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494, //中音523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988, //高音1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975};

#define Max_note sizeof(freq)/sizeof(uint) //音符频率元素个数 /***************定义1/4基本节拍输出半周期的个数****************/ // 正常速度时,每分钟定义120拍,每拍200ms,1/4拍为125ms (0.125s ), // 输出音符个数=频率*0.125*2=频率/4,2表示半周期 uint time_user[Max_note]={0,

66, 69, 74, 78, 83, 87, 93, 98, 104, 110, 117, 124, 131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247, 262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};

/***************定义数据处理数组****************/

//定义一个数据缓冲区,以防止time_user数组改变

uint time[Max_note]={0};

/***************定义用户发声数组****************/

uchar __attribute__((progmem)) music_name[] = {

20,2,25,2,20,2,18,2,17,2,15,2,13,4,13,2,13,2,15,2,17,2,17,3,13,2,17,2,18,2,20,8,00,00};

…………………

…………………

/************************************************************************* 程序说明:int_n记录了中断的次数,代表节拍长度。数组freq[]、time[Max_note]为音符对应的频率和基本1/4节拍应产生的半周期数。music_name 数组中为整个音乐的发声数据。play_on 是播放标志。sy stem_clock是系统时钟频率,clock_freq=system_clock/2 *************************************************************************/ ISR(SIG_OUTPUT_COMPARE1A)

{

PORTG^=0x08;//PG3翻转,即取反,输出脉冲发音

if (--int_n == 0)

{

TCCR1B = 0x08;

if(music_name[note_n+1]) //节拍不为0

{

if(music_name[note_n]) //频率不为0,即不是休止符

{aa= music_name[note_n]+tone; //计算在频率数组中的位置

OCR1A = clock_freq/freq[aa]-1; //音符频率计算

int_n = time[aa];

note_n++; //取节拍

int_n = int_n * (music_name[note_n]); //此处不能用aa代替

note_n++; //取下一个音符

DelayMs(5); //节拍停顿

TCCR1B = 0x09; }

else //遇休止符

{TCCR1B=0; DDRG=0; //停止T/C1

DelayMs(125*music_name[note_n+1]); //暂停,基本节拍为500ms

int_n = 1; //重新赋值

note_n+=2; //取下一个音符

TCCR1B=0x09;DDRG=1<

}

else play_on = 0; //一首歌播放结束

}

}

3.2.2音乐选择函数

在此例中,可用外部中断来控制num的大小,那么get_music_num()函数就可以达到选择音乐的目的。

/***************音乐选择函数****************

1.为保证播放速度取值范围大,播放速度定义为实型,可取小数

2.音调的取值范围是[-6,6],是整数,超出范围可能会影响播放长度

3.播放速度的取值范围(1,10),正常速度是4,每一拍时间为500ms

如果为慢速,假设每一拍为800ms,则播放速度=2.5,speed/4=500/每拍时长*******************************************/

void get_music_num(void) //(音乐名称,-6=<音调<=6,1=<播放速度<10)

{

if(num>4) num=1;//循环歌曲

if(num<1) num=4;

switch (num)

{case 0: break;

case 1: play_music(dongni,0,2.5); break;

case 2: play_music(liangzhu,0,4); break;

case 3: play_music(zlmdshi,0,4); break;

case 4: play_music(rshcbxf,0,2.5); break;

default:break; }

}

3.2.3音乐播放函数

程序中,通过for循环语句中的音乐播放速度speed 的大小来调节1/4节拍输出半周期个数的大小,从而改变比较匹配中断函数中的int_n的大小,也就改变了节拍时长,也就实现了音乐播放速度可调。play_on是一个播放标志,在中断函数中一旦音乐播放完毕,play_on 就会被清零,程序指针也就会跳出音乐播放函数的while语句,停止播放音乐。

void play_music(uchar music_name_1[],int tone_1,float speed_1)//(音乐名称,曲调,播放速度)

{

uchar i;

music_name=music_name_1;

tone=tone_1;

speed=speed_1;

for(i=0;i

{

time[i]=time_user[i]; //取原始数据

time[i]=((float)time[i])*4/speed;//4表示正常速度,speed越大播放速度越快 }

play_on=1; //播放标志为1

note_n =0; //音乐数组元素个数

int_n = 1; //发出脉冲个数

OCR1A=0x30; //赋一个初值,使程序快速进入中断

TCNT1=0;

TCCR1B=0x09; //开启T/C1

TIMSK=1<

while(play_on) //放歌

{

led_bright(); //LED闪烁

}

TCCR1B=0; //一首歌播放完,关闭T/C1

TIMSK =0; //关闭中断

DelayMs(200); //延时停顿

}

4.结束语

本例给出的设计方法充分利用了AVR的T/C1的特点,仅使用一个定时计数器,配合它的比较匹配功能,结合中断实现了不需要前台管理的音乐全程播放功能。而且这种功能的设计实现,可以非常方便的组合在一个复杂系统中使用。

实际上在图1中还可以外接led二极管,可以做成音乐彩灯,完整电路图如下所示:

参考文献:

[1]马潮.基于AVR的单片嵌入式系统原理与实践应用[M].北京:北京航空航天大学出版社,2007.

[2]https://www.wendangku.net/doc/2d4060693.html,

[3]https://www.wendangku.net/doc/2d4060693.html,

附件:源程序

Main.c

/*****************************************************

芯片型号: ATmega 128

编译环境: AVR Studio4.16+WinAVR20090313

时钟频率: 8.000000 MHz (可调)

功能:可调系统频率,可调播放速度和音调,可选择音乐

*****************************************************/

#include

#include

#include

#include

#define uint unsigned int

#define uchar unsigned char

#define PRG_RDB(addr) pgm_read_byte(addr)

#define PRG_RDW(addr) pgm_read_word(addr)

#define system_clock 8000000 //选择系统时钟频率,单位Hz #define clock_freq system_clock/2 //OCR1A要用到的计算频率

#define FREQ system_clock/1000000 //延时函数需用变量

/***************全局变量****************/

uchar play_on; //播放标志

uchar num=1; //音乐选取变量

uchar *music_name; //定义音乐数组指针(频率,节拍,频率,节拍.....) float speed; //播放速度

volatile uint int_n,note_n,aa; //发出脉冲个数,计数器

int tone; //定义曲调,有正负之分,正表示升调,负表示降调

/***************用户函数****************/

#include "music_date.h"

#include "break.h"

#include "led.h"

/***************初始化函数****************/

void init_device(void)

{

PORTG =0; //PG端口输出低电平

DDRG =1<

PORTD =0; //外部中断引脚0、1、2、3允许,其它引脚禁止为高组态

DDRD =0x41; //外部中断,设置输入

PORTE =0xf0; //外部中断引脚4、5、6、7允许,其它引脚禁止为高组态

DDRE =0; //外部中断,设置输入

PORTA =0xff; //驱动LED

DDRA =0xff;

TCCR1A=0x00;

}

/***************延时函数****************/

void DelayMs(uint ms)

{

uint i;

for(i=ms;i>0;i--)

_delay_loop_2(FREQ * 250);

}

/***************音乐播放函数****************/

void play_music(uchar music_name_1[],int tone_1,float speed_1)//(音乐名称,曲调,播放速度)

{

uchar i;

music_name=music_name_1;

tone=tone_1;

speed=speed_1;

for(i=0;i

{

time[i]=time_user[i]; //取原始数据

time[i]=((float)time[i])*4/speed;//4表示正常速度,speed越大播放速度越快

}

play_on=1; //播放标志为1

note_n =0; //音乐数组元素个数

int_n = 1; //发出脉冲个数

OCR1A=0x30; //赋一个初值,使程序快速进入中断

TCNT1=0;

TCCR1B=0x09; //开启T/C1

TIMSK=1<

while(play_on) //放歌

{

led_bright(); //LED闪烁

}

TCCR1B=0; //一首歌播放完,关闭T/C1

TIMSK =0; //关闭中断

DelayMs(200); //延时停顿

}

/***************音乐选择函数****************

1.为保证播放速度取值范围大,播放速度定义为实型,可取小数

2.音调的取值范围是[-6,6],是整数,超出范围可能会影响播放长度

3.播放速度的取值范围(1,10),正常速度是4,每一拍时间为500ms

如果为慢速,假设每一拍为800ms,则播放速度=2.5,speed/4=500/每拍时长

*******************************************/

void get_music_num(void) //【音乐名称,-6=<音调<=6,1=<播放速度<10】

{

if(num>4) num=1;//循环歌曲

if(num<1) num=4;

switch (num)

{case 0: break;

case 1: play_music(dongni,0,2.5); break;

case 2: play_music(liangzhu,0,4); break;

case 3: play_music(zlmdshi,0,4); break;

case 4: play_music(rshcbxf,0,2.5); break;

default: break; }

}

/***************定时器1比较配输出中断函数****************/

ISR(SIG_OUTPUT_COMPARE1A)

{

PORTG^=0x08;//PG3翻转,即取反,输出脉冲发音

if (--int_n == 0)

{

TCCR1B = 0x08;

if(PRG_RDB(&music_name[note_n+1])) //节拍不为0

{

if(PRG_RDB(&music_name[note_n])) //频率不为0,即不是休止符

{aa=PRG_RDB(&music_name[note_n])+tone; //计算在频率数组中的位置

OCR1A = clock_freq/PRG_RDW(&freq[aa])-1; //音符频率计算

int_n = time[aa];

note_n++; //取节拍

int_n = int_n * (PRG_RDB(&music_name[note_n])); //此处不能用aa-tone代替 note_n++; //取下一个音符

DelayMs(5); //节拍停顿

TCCR1B = 0x09; }

else //遇休止符

{TCCR1B=0; DDRG=0; //停止T/C1

DelayMs(125*PRG_RDB(&music_name[note_n+1])); //暂停,1/4节拍为125ms

int_n = 1; //重新赋值

note_n+=2; //取下一个音符

TCCR1B=0x09;DDRG=1<

}

else play_on = 0; //一首歌播放结束

}

}

/***************主函数****************

说明:为保证播放速度取值范围大,播放速度

定义为实型,可取小数

***************主函数****************/

int main(void)

{

init_device(); //初始化

EIMSK=0; //屏蔽外部中断

EICRB=0; //低电平触发中断

EIFR =0xff; //清楚中断标志

EIMSK=0xe0; //开外部中断

sei(); //开全局中断

while (1)

{

get_music_num(); //选取歌曲

if(num<5) num++;

}

}

music_date.h:

#define uint unsigned int

#define uchar unsigned char

/***************定义音符频率数组****************/

uint __attribute__((progmem)) freq[] = {0,

//低音262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494,

//中音523, 554, 587, 622, 659, 698, 740, 784, 831, 880, 932, 988,

//高音1047, 1109, 1175, 1245, 1319, 1397, 1480, 1568, 1661, 1760, 1865, 1975}; #define Max_note sizeof(freq)/sizeof(uint) //音符频率元素个数

/***************定义1/4基本节拍输出半周期的个数****************/

// 正常速度时,每分钟定义120拍,每拍200ms,1/4拍为125ms(0.125s),

// 输出音符个数=频率*0.125*2=频率/4。 2表示半周期

uint time_user[Max_note]={0,

66, 69, 74, 78, 83, 87, 93, 98, 104, 110, 117, 124,

131, 139, 147, 156, 165, 175, 185, 196, 208, 220, 233, 247,

262, 277, 294, 311, 330, 349, 370, 392, 415, 440, 466, 494};

/***************定义数据处理数组****************/

//因为每首歌的播放速度在变化,所以必须用另外一个数组来处理

//1/4基本节拍输出半周期的个数,以防止time_user数组改变

uint time[Max_note]={0};

/***************定义用户音乐数组(频率,节拍,频率,节拍.....)****************/

//万水千山总是情

uchar __attribute__((progmem)) music[] = {

17,04,18,04,20,06,20,02,22,04,20,04,17,12,15,04,13,06,17,02,15,04,13,04,10, 12,10,04,8,8,13,04,15,04,17,04,20,04,22,04,17,04,15,15,15,04,17,04,17,04,18, 04,20,06,20,02,22,04,20,04,17,12,15,04,13,06,17,02,15,04,13,04,10,12,10,04,

8,8,13,06,17,02,15,06,13,02,13,04,10,04,13,15,13,8,17,04,20,04,22,12,25,10, 22,04,18,04,20,06,22,02,20,12,17,04,20,8,17,04,20,04,22,12,25,04,25,04,22,

04,20,04,17,04,15,15,15,8,17,04,18,04,20,06,20,02,22,04,20,04,17,12,15,04,

13,06,17,02,15,04,13,04,10,12,10,04,8,8,13,04,17,04,15,06,13,02,10,04,12,

04,13,15,13,15,00,00};

//梁祝

uchar __attribute__((progmem)) liangzhu[] ={

24,4,22,4,24,4,20,6,22,2,18,4,17,4,15,2,17,2,18,2,17,2,20,6,17,2,15,2,17,2, 20,2,15,2,17,2,18,2,17,2,15,2,13,12,20,4,12,4,15,4,10,4,13,4,8,12,10,2,13,2, 8,16,5,8,8,6,10,2,13,6,15,2,10,2,13,2,8,4,20,6,25,2,22,2,20,2,17,2,20,2,

15,16,15,6,17,2,12,4,10,4,8,6,10,2,13,4,15,4,5,4,13,4,10,2,8,2,10,2,13,2,

8,16,17,6,20,2,12,4,15,4,10,2,13,2,8,8,5,2,8,4,5,2,8,2,10,2,12,2,15,2,10,

12,8,2,10,2,13,6,15,2,20,4,17,4,15,4,17,2,15,2,13,4,10,2,8,2,5,8,13,8,10,

3,13,1,10,2,8,2,5,2,8,2,10,2,13,2,8,12,0,0};

//最浪漫的事

uchar __attribute__((progmem)) zlmdshi[] ={

8,2,8,2,10,2,13,4,13,2,13,2,13,2,10,2,10,2,17,2,17,8,8,2,10,4,13,2,13,2,13,2,13, 2,13,4,17,2,20,2,20,12,20,2,22,2,20,2,22,2,20,2,22,4,20,2,15,1,17,1,17,2,15,1,13 ,1,13,4,13,2,13,2,10,2,13,4,13,2,10,2,13,2,17,4,15,2,15,16,8,2,10,2,13,2,13,2,13 ,2,13,2,13,2,13,2,13,2,10,2,15,2,15,2,17,2,17,4,17,2,8,2,10,2,13,2,13,2,13,2,13, 2,13,2,13,4,17,2,20,2,20,12,20,2,20,2,22,2,20,2,22,2,20,2,22,4,22,2,20,2,15,2,17 ,2,15,2,13,4,10,2,10,2,13,2,8,4,17,2,15,2,13,4,10,2,10,2,13,1,15,1,13,2,13,12,20 ,2,22,2,25,2,22,4,22,2,20,2,22,2,20,2,17,2,20,2,20,8,20,2,22,2,25,2,22,4,22,2,20 ,2,22,2,20,2,22,2,13,2,13,8,13,2,15,2,17,2,15,2,15,2,15,2,13,2,15,2,13,2,10,2,17 ,2,17,2,15,2,15,4,20,2,22,2,17,2,20,4,20,2,17,2,20,2,17,2,17,4,22,2,20,2,22,2,20 ,2,17,2,20,2,20,2,22,2,25,2,22,4,22,2,20,2,22,2,20,2,17,2,20,2,20,8,20,2,22,2,25

,2,22,4,22,2,20,2,22,2,20,2,22,2,13,2,13,8,13,2,15,2,17,2,18,4,18,2,20,2,22,2,22 ,2,20,2,22,2,22,2,25,2,22,2,22,2,22,2,25,2,22,2,20,2,20,8,20,2,13,2,22,2,20,2,20 ,8,20,2,22,2,25,3,17,1,15,2,17,1,15,1,13,12,0,0};

//人生何处不相逢

uchar __attribute__((progmem)) rshcbxf[] ={

20,1,22,2,20,1,25,2,22,1,20,1,20,2,17,2,17,4,15,1,17,2,20,1,17,2,15,1,17,1,10,8, 13,1,13,2,10,1,8,2,10,2,13,3,15,1,13,4,15,1,15,2,13,1,10,2,17,2,17,2,15,2,15,4,2 0,1,22,2,20,1,25,2,22,1,20,1,20,2,17,2,17,4,15,1,17,2,20,1,17,2,15,1,17,1,10,8,1 3,1,13,2,10,1,8,2,10,2,13,3,15,1,13,4,15,1,15,2,13,1,10,2,15,1,17,1,13,8,20,1,17 ,2,20,1,17,2,20,2,22,1,25,1,22,2,20,2,17,1,17,2,15,1,17,2,20,2,17,8,20,1,17,2,20 ,1,17,2,20,2,22,2,22,1,25,1,22,2,20,2,17,1,17,2,15,1,17,2,20,2,17,8,15,3,17,1,15 ,2,17,2,20,3,22,1,20,2,22,2,25,8,25,8,22,1,22,2,22,1,20,2,22,2,20,3,17,1,15,2,17 ,2,20,16,20,1,22,2,20,1,25,2,22,1,20,1,17,8,15,1,17,2,20,1,17,2,15,1,17,1,10,8,1 3,1,13,2,10,1,8,2,10,2,13,3,15,1,13,4,15,1,15,2,13,1,10,2,15,1,17,1,13,8,0,0};

//懂你

uchar __attribute__((progmem)) dongni[] ={

13,4,0,3,13,2,15,2,20,2,17,1,15,1,17,6,0,4,15,2,17,2,15,2,17,2,0,1,15,2,

13,2,10,2,10,2,15,6,15,8,20,6,13,2,13,4,0,2,20,4,25,2,13,2,13,4,10,2,15,

2,15,2,17,2,17,2,15,2,13,3,10,1,8,2,13,6,13,8,0,8,17,2,17,2,17,2,15,2,0,1,

17,2,17,2,15,2,13,3,13,1,13,2,10,2,0,1,8,2,13,2,15,2,17,2,17,2,17,2,15,2,

15,2,13,2,13,2,10,2,8,2,17,6,17,8,0,1,22,2,22,2,20,2,0,1,22,2,22,2,20,2,

22,2,25,2,25,2,13,2,0,2,10,2,13,2,15,2,17,2,17,2,15,2,15,2,15,4,17,2,22,2,

20,6,20,8,20,8,20,4,22,4,25,2,25,2,25,2,25,2,25,2,22,2,20,2,25,2,25,2,13,

2,15,2,17,2,17,8,20,2,22,2,20,2,22,2,22,2,20,2,22,2,25,2,25,2,10,2,13,2,

15,2,15,8,20,6,13,2,13,4,0,2,20,4,25,2,13,2,13,4,10,2,13,2,15,2,17,2,15,

2,17,2,17,2,15,2,15,2,17,2,22,2,20,6,20,4,22,4,25,2,25,2,25,2,25,2,25,2,

22,2,20,2,25,2,25,2,13,2,15,2,17,2,17,8,20,2,22,2,20,2,22,2,22,2,20,2,22,

2,25,2,25,2,10,2,13,2,15,2,15,8,20,6,13,2,13,4,0,2,20,4,25,2,13,2,13,4,10,

2,13,2,15,2,17,2,15,2,17,2,17,2,15,2,13,3,10,1,8,2,13,6,13,8,0,8,20,6,13,2, 13,4,0,2,20,4,25,2,13,2,13,4,10,2,13,2,15,2,17,2,15,2,17,2,17,2,15,2,13,3,

10,1,8,2,13,6,13,8,0,0};

/**********外部中断INT5,低触发,暂停**********/

ISR(SIG_INTERRUPT5)

{

uchar i;

i = 100;

while (i --) //按键消抖

{ if((PINE & (1 << PE5)) != 0) //按键是否为低电平

return ; }

TCCR1B = 0x00; //T/C1停止

while((PINE & (1 << PE5)) == 0);//暂停

TCCR1B = 0x09; //T/C1启动

}

/**********外部中断INT6,低电平沿触发,选取下一首**********/

ISR(SIG_INTERRUPT6)

{

uchar i;

i = 100;

while (i --) //按键消抖

{ if((PINE & (1 << PE6)) != 0) //按键是否为低电平

return ; }

play_on=0; //终止当前播放,选下一首歌曲(返回时还要运算主函数的num++,故选得下首歌)

}

/**********外部中断INT7,低电平触发,选取上一首**********/

ISR(SIG_INTERRUPT7)

{

uchar i;

i = 100; //按键消抖

while (i --)

{ if ((PINE & (1 << PE7)) !=0) //按键是否为低电平

return ; }

if(num!=1) num-=2; //上一首歌曲(返回时还得经过主函数的num++,故用num-=2) else num =3;//如果num=1,则上一首歌是num=4 (返回时还得经过主函数的num++) play_on=0;

}

#define WORK_LED_ON PORTD = 1<

void delay(int d1,int d2)

{

int i,j;

for(i=0;i

{ if(play_on==0) break;

for(j=0;j

}

void all_show(void) //全亮

{

PORTA=0xff;

delay(600,700);

}

unsigned int power_2(int n) //定义函数2的n次幂

{

int i;

unsigned int value=1; //注:2的0次幂等于1,故开始应等于1

if(n!=0) //若n==0,则value==1

{

for(i=0;i

{value*=2;}

}

return value;

}

void led_2(void)

{

unsigned char i,j;

for(j=0;j<3;j++)

{

if(play_on==0) break;

for(i=1;i<9;i++)

{

switch(i)

{

case 1:

case 8: PORTA=0x81;break;

case 2:

case 7: PORTA=0x42;break;

case 3:

case 6: PORTA=0x24;break;

case 4:

case 5: PORTA=0x18;break;

default: break;

}

delay(100,800);

}

}

}

void led_bright(void)

{

int i,j;

unsigned char led;

led=0x01; //LED的初始值,为1时亮,为0时灭

all_show();

for(j=1;j<8;j++) //最开始进入循环时,led=0000 0001b

{

if(play_on==0) break;

for(i=0;i<9-j;i++) //模式1,向左依次熄灭

{ PORTA=(led<

asm("nop");

if(i%2)WORK_LED_ON;

else WORK_LED_OFF;

delay(100,800); }

led=led+power_2(j); //当j=1时led=0000 0011b,j=2时led=0000 0111b ...... } //当j=6时led=0111 1111b,j=7时led=1111 1111b

all_show();

led_2();

all_show();

led=0x80;

for(j=7;j>0;j--) //最开始进入循环时,led=1000 0000b

{

if(play_on==0) break;

for(i=0;i<=j;i++) //模式2,向右依次熄灭

{ PORTA=(led>>i);

asm("nop");

if(i%2)WORK_LED_ON;

else WORK_LED_OFF;

delay(100,800); }

led=led+power_2(j-1); //j=7时led=1000 0000b,当j=6时led=1100 0000b,

} //当j=2时led=1111 1100b,j=1时led=1111 1110b ...... }

音乐播放器前十排行

音乐播放器前十排行 1、QQ音乐 QQ音乐是腾讯公司推出的网络音乐平台,是中国互联网领域领先的正版数字音乐服务的领先平台,海量乐库在线试听、卡拉ok歌词模式、最流行新歌在线首发等,绿钻用户还可享受高品质音乐试听、正版音乐下载、MV观看等特权。 QQ音乐目前是国内音乐APP的绝对龙头,2016年底其曲库已经超过2000万首,旗下拥有的版权也是音乐APP中的第一,如索尼、华纳、杰尔威、英皇、韩国YG等,其市场份额也超过50%。虽然总有人吐槽QQ音乐,但是十大音乐APP排行榜第一位毫无悬念。在此前评选的全球音乐流服务排行榜,QQ音乐排名第四。 2、虾米音乐 虾米音乐版权建设虽然起步较晚,歌曲量在整体版权音乐中的比例低于20%,但在华语资源上仍具有一定优势。你想要听到华研唱片下的林宥嘉、S.H.E和田馥甄、相信音乐的五月天、梁静茹以及聚集了李宗盛、周华健等人的滚石,还是要投入虾米音乐的怀抱。而且虾米也在去年取得了韩国SM公司的音乐版权,这在国内来说,争取到了很大一部分的韩粉。虽然无法对QQ音乐造成威胁但依旧稳居十大音乐APP排行榜第二。 3、网易云音乐 网易云音乐不用再过多介绍了,近两年大火的音乐APP,口碑爆棚,市场份额目前也达到15%,局国内第二仅次于QQ音域。为何口碑份额双丰收的网易云音乐仅列十大音乐APP排行榜第三?网易云音乐的版权数量实在太少,并且官方也并不太重视版权的购买,虽然网易云音乐的版权音乐歌曲量占整体版权音乐的70%左右,但非常有意思的是大部分的版权都是通过转授权获得的。

4、酷狗音乐 酷狗音乐是一款集中播放、音乐效果、在线下载歌词等众多功能于一身,完全免费的手机音乐播放器。酷狗算是老牌音乐APP了, 但此前酷狗和酷我同QQ音乐一起加入新音乐集团,三大音乐APP曲 库资源基本互通,而且音乐伴奏资源众多也是酷狗的一大优势,喜 欢唱歌的人通常都是用酷狗搜索放伴奏唱歌、录歌。 不过酷狗的音质是劣势,对于耳朵挑剔的乐迷,对音质要求高的人来说很难满足。 5、咪咕音乐 咪咕音乐是一款面向所有用户的手机音乐APP,它包含了在线听歌、下载歌曲、订购彩铃以及开通会员等功能和业务,用户通过咪 咕音乐可以第一时间聆听中国移动无线首发的最新音乐,感觉最热 最流行歌曲,实时了解最新音乐咨讯及娱乐新闻,并可通过软件行 使无线音乐俱乐部会员权益。目前该软件已经覆盖市面上高中低端 主流机型,无论你是何种手机,均可轻松安装和使用。 6、酷我音乐 酷我音乐是中国数字音乐的交互服务品牌,是互联网领域的数字音乐服务平台,同时也是一款内容全、聆听快和界面炫的音乐聚合 播放器,是国内的多种音乐资源聚合的播放软件。自平台成立以来,酷我音乐作为前端潮流音乐的重要推手,率先与唱片公司、版权管 理机构合作探索发展,免费向广大用户提供方便流畅的在线音乐, 还有免费无损音乐方便用户的试听和下载,生成了丰富的音乐流媒 体生态系统。 7、天天动听 天天动听是一款功能强大、完全免费的手机音乐播放软件,支持歌词和歌曲图片下载,简洁人性化的操作,带来手机听歌的全新体验,是拇指一族必备的音乐播放工具。 8、百度音乐

音乐播放器的详细设计

音乐播放器详细设计 1.引言 随着社会的快速发展,现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,音乐成了我们生活工作中的一个重要的部分。而3G时代的到来,手机移动应用越来越普遍。此文档就是为了能更好地设计出一个基于android系统的音乐播放器而编写的。 1.1 编写目的 为软件的开发者能更好的理解和明确软件开发的详细过程,安排项目与进度、组织软件开发与测试,撰写本文档。本文档供项目组成员,软件开发人员参考。1.2项目背景 本项目由李雪梅、杨挺等人提出,由本组成员联合开发,实现播放现今流行的音乐MP3等文本格式。 该软件是基于Android系统的音乐播放软件,并能够与其他音乐播放软件兼容。 1.3 参考资料 [1] 重庆大学出版社《软件工程》“软件计划与可行性分析” [2] 靳岩、姚尚明人民邮电出版社《Android开发入门与实践》 [3] 可行性分析 [4] 《音乐播放器需求分析书》 [5] 《音乐播放器总体设计说明书》 1.4项目开发计划 实施计划:

阶段名称负责人 需求分析杨挺、李雪梅 总体设计李雪梅、杨挺 详细设计李雪梅、杨挺 软件测试李雪梅、杨挺 在技术方面,编程知识比较缺乏,对有些与项目相关的软件 不熟悉,需进行人员的技术培训(自学为主),技术难点是数据库的构架和软件功能的设计。 2. 总体设计 2.1 项目目的 本项目的目的是开发一个可以播放主流的音乐文本格式的播放器。设计的主要实现功能是播放MP3等格式的音乐文件,并且能控制播放,暂停,停止,音量控制,选择上一曲,选择下一曲,更改皮肤,歌曲列表文件的管理操作,在线播放,读取 存储卡播放等多种播放控制,界面简明,操作简单。 软件系统检测到错误行为时,报告错误,并提示处理操作。 2.2 软件运行环境 硬件:Android操作系统手机 系统软件:Android 2.2 -- 4.0版本 支撑软件:Eclipse 7.5 、ADT 1.5 2.3 需求概述

项目二第二课时 了解声音和图像的数字化

第一单元数据与信息 项目二探究计算机中的数据表示———认识数据编码 第二课时了解声音和图像的数字化 ■教材分析 本项目旨在落实课标中“知道数据编码的基本方式”这一内容要求,让学生在体验数值、文本、声音、图像的基本编码方法的过程中,了解在数字化工具中存储数据的一般原理与方法。这部分内容理论性强,且对于高中生有一定难度。 教材继续延用“鸟类研究”这一项目情境,从“将鸟类研究过程中采集的数据数字化后存入计算机”这一需求出发,以生活中的编码为切入点,按照各类数据编码的原理及特点设计了三个活动———从树牌号认识编码、了解数值数据和文本数据的编码、了解声音和图像的数字化,引导学生探究各类数据在计算机中的表示方法,学习数值、文本、声音、图像等类型数据的基本编码方法,增强信息意识、发展计算思维、提升数字化学习能力。 ■教学目标 (1)经历声音数据数字化的过程,掌握声音数据数字化的基本方法,了解声音数字化的基本原理,知道采样频率、量化位数和声道数对数字化音频文件大小及效果的影响。 (2)经历图像数字化的过程,掌握图像数字化的基本方法,了解图像数字化的基本原理,知道分辨率和量化位数对位图的影响。 (3)亲历方案设计、对比分析、探究实验等学习活动,体会运用信息技术开展学习、解决问题的思想与方法。 (4)在数字化学习过程中掌握数字化学习的策略和方法,能够根据需要选用恰当的方法及合适的数字化工具和资源开展有效学习。 ■教学准备 (1)软硬件环境:机房,音频编辑软件,图像处理软件。 (2)教学素材:各类数据编码实例和编码表,用于体验活动的声音文件和图像文件。 ■教学重点 数字化过程的三个步骤:采样、量化、编码。

课程设计简易单片机音乐播放器

课程设计 题目:基于单片机音乐演奏曲Title: instrumental music based on single chip 姓名: 学号: 系别: 专业: 年级: 指导教师: 2012年5 月25 日

摘要 单片机具有强大的控制功能和灵活的编程实现特性,它已经溶入现代人们的生活中,成为不可替代的一部分。本设计以At89c2051为核心,主要由电源电路、复位电路、音频放大电路、时钟电路和数码管电路和蜂鸣器电路构成单片机奏乐附加时钟的一个小系统。电路中I/O口采用分时复用的借口技术,使AT89c2051单片机的引脚资源得以充分利用,本系统的电路简单,实现的功能强大,所用芯片比较便宜,性价比较高。 关键词:At89c2051,数码管,单片机奏乐,分时复用

目录 摘要 ........................................................... - 1 - 1.引言 (3) 2.系统整体结构 (4) 2.1系统总设计 (4) 2.2实现的功能 (4) 2.3主要芯片介绍 (4) 2.3.1 AT89c2051芯片介绍 (4) 3.系统硬件设计 (5) 3.1键盘输入模块 (5) 3.2时钟模块 (5) 3.3显示模块 (6) 3.4复位电路 (6) 3.5蜂鸣器电路设计 (7) 4.系统软件设计 (7) 4.1系统主程序流程图系 (7) 4.2 部分子程序流程图 (8) 结束语 (10) 参考文献 (10) 致谢 (11) 附录 (11)

1.引言 随着社会的发展、科技的进步以及人们生活水平的逐步提高,各种方便于生活的自动控制系统开始进入了人们的生活,以单片机为核心的各种系统也越来越多。同时也标志了自动控制领域成为了数字化时代的一员。它实用性强,功能齐全,技术先进,使人们相信这是科技进步的成果。它更让人类懂得,数字时代的发展将改变人类的生活,将加快科学技术的发展。 本次设计为单片机奏乐器,硬件部分它以单片机AT89C2051为核心,由功放电路、数码管等组成。当接上电源按下开关时,就能听到优美的旋律。当然这些音乐都是通过软件编程实现的,把它存储在存储器里,根据存储容量大小决定存储音乐的数目。 [2]

多边形区域填充算法

13. 设五边形的五个顶点坐标为(10, 10),(15, 5),(12, 5),(8, 2)和(4, 5),利用多边形区域填充算法,编一程序生成一个实心图。 解:假设以上五个顶点依次对应编号A-B-C-D-E,首先计算得到ET表: 6-10 5 4 3 2 1 该多边形的AET指针的内容为: 1 AET为空 2 3 4 1 2 3 4 5 6 7 8 9 10 01234567891011121314 1516

5 6 7 8 9 10 具体编程实现如下: 第1步:(1) 根据输入的五个顶点坐标找到y 值最小的点(例如点D ,此时y=2),并找到与D 有边关系的两个顶点(此时为E 和C),在y=2处建立ET 边表记录(ymax 、xi 和m 值均可通过顶点坐标间的计算得到,例如DE 边的建立,特别注意:当D 点和E 点y 坐标值相同时,也即是DE 与x 轴平行,该边不能计入ET 边表),之后标记D 点被访问过;(2) 排除访问过的点以及和该点相关联的边,重复(1)直至将ET 表建立完善。 [注]边关系的建立可通过邻接矩阵的数据结构实现,权值可以为该矩阵行编号对应点的y 坐标值,ET 边表采用邻接表的数据结构 第2步:根据ET 表构建AET 表,并逐行完成多边形填充,具体的C++代码如下: (1) 建立头文件base_class.h ,主要是边表结点结构体和ET 边表类的实现 enum ResultCode{Success, Failure}; template struct Enode { Enode() {next=NULL;} Enode(T pymax, float pxi, float pm, Enode *pnext) { ymax=pymax; xi=pxi; m=pm; next=pnext; } T ymax, xi; //ymax 表示最大的y 值,xi 表示最底端点的x 坐标值 float m; //m 表示斜率的倒数 Enode *next; }; //定义了ET 表和AET 表中结点的结构体

嵌入式MP3播放器的设计

嵌入式MP3播放器的设计 1 系统概述 本文采用STM32系列微控制器,结合解码芯片VS1003、SD卡、LCD等外围设备设计并实现了MP3播放器。其主要功能有:播放VS1003支持的所有音频文件,如MP3、WMA、WAV文件,且音质非常好;通过触摸屏实现按键功能,控制播放上一首/下一首、音量增减等;通过LCD显示歌曲名字和播放状态;本系统还实现了读卡器功能,PC机可通过USB接口直接对开发板上的SD卡进行读写操作,以方便拷贝音频文件。 MP3播放过程是STM32通过SPI1接口将数据从SD卡中取出,然后通过SPI2接口送至解码芯VS1003解码播放。这里解码模块单独使用一个SPI接口,以减小干扰和噪声、提高音质。 2 系统硬件设计方案 本系统在硬件上分为6个模块: 微控制器STM32F103、解码模块VS1003、存储模块SD卡、触摸屏、USB接口和显示屏LCD。系统硬件框架如图5所示。 VS1003 STM32 图5 系统硬件框架图 2.1 存储模块设计 SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格低廉、存储容量大、使用方便、通用性与安全性强等优点。SD卡支持两种总线方式: SD方式与SPI方式。其中SD 方式采用6线制,而SPI方式采用4线制,采用单片机对SD卡进行读写时一般都采用SPI模式。可用不同的初始化方式使SD卡工作于SD方式或SPI方式。 在本设计中,音频数据MP3文件是以SD卡为载体。所以在电路设计中必须含有读取SD卡模块。该系统使用STM32内部接口SPI1与SD卡进行通信,下面介绍其引脚连接情况。 PE3:低电平有效,连接到SD卡的片选引脚CD/DAT3。SPI在和SD卡进行通

音频基本知识

音频基本知识 第一部分 模拟声音-数字声音原理 第二部分 音频压缩编码 第三部分 和弦铃声格式 第四部分 单声道、立体声和环绕声 第五部分 3D环绕声技术 第六部分数字音频格式和数字音频接口 第一部分 模拟声音-数字声音原理 一、模拟声音数字化原理 声音是通过空气传播的一种连续的波,叫声波。声音的强弱体现在声波压力的大小上,音调的高低体现在声音的频率上。声音用电表示时,声音信号在时间和幅度上都是连续的模拟信号。 图1 模拟声音数字化的过程 声音进入计算机的第一步就是数字化,数字化实际上就是采样和量化。连续时间的离散

化通过采样来实现。 声音数字化需要回答两个问题:①每秒钟需要采集多少个声音样本,也就是采样频率(f s)是多少,②每个声音样本的位数(bit per sample,bps)应该是多少,也就是量化精度。 ?采样频率 采样频率的高低是根据奈奎斯特理论(Nyquist theory)和声音信号本身的最高频率决定的。奈奎斯特理论指出,采样频率不应低于声音信号最高频率的两倍,这样才能把以数字表达的声音还原成原来的声音。采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,一次振动中,必须有2个点的采样,人耳能够感觉到的最高频率为20kHz,因此要满足人耳的听觉要求,则需要至少每秒进行40k 次采样,用40kHz表达,这个40kHz就是采样率。我们常见的CD,采样率为44.1kHz。电话话音的信号频率约为3.4 kHz,采样频率就选为8 kHz。 ?量化精度 光有频率信息是不够的,我们还必须纪录声音的幅度。量化位数越高,能表示的幅度的等级数越多。例如,每个声音样本用3bit表示,测得的声音样本值是在0~8的范围里。我们常见的CD位16bit的采样精度,即音量等级有2的16次方个。样本位数的大小影响到声音的质量,位数越多,声音的质量越高,而需要的存储空间也越多。 ?压缩编码 经过采样、量化得到的PCM数据就是数字音频信号了,可直接在计算机中传输和存储。但是这些数据的体积太庞大了!为了便于存储和传输,就需要进一步压缩,就出现了各种压缩算法,将PCM转换为MP3,AAC,WMA等格式。 常见的用于语音(Voice)的编码有:EVRC (Enhanced Variable Rate Coder) 增强型可变速率编码,AMR、ADPCM、G.723.1、G.729等。常见的用于音频(Audio)的编码有:MP3、AAC、AAC+、WMA等 二、问题 1、为什么要使用音频压缩技术? 我们可以拿一个未压缩的CD文件(PCM音频流)和一个MP3文件作一下对比: PCM音频:一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码CD文件,它的数据速率则为 44.1K×16×2 =1411.2 Kbps,这个参数也被称为数据带宽。将码率除以8 bit,就可以得到这个CD的数据速率,即176.4KB/s。这表示存储一秒钟PCM编码的音频信号,需要176.4KB的空间。 MP3音频:将这个WAV文件压缩成普通的MP3,44.1KHz,128Kbps的码率,它的数据速率为128Kbps/8=16KB/s。如下表所示: 比特率 存1秒音频数据所占空间 CD(线性PCM) 1411.2 Kbps 176.4KB MP3 128Kbps 16KB AAC 96Kbps 12KB mp3PRO 64Kbps 8KB 表1 相同音质下各种音乐大小对比 2、频率与采样率的关系 采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为44.1KHz,这意味着什么呢?假设我们有2段正弦波信号,分别为20Hz和20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行40KHz的采样,我们可以得到一个什么样的结果呢?结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频

数字系统设计音乐播放器

一、实验目的和要求(必填) 二、实验内容和原理(必填) 三、主要仪器设备(必填) 四、操作方法和实验步骤 五、实验数据记录和处理 六、实验结果与分析(必填) 七、 讨论、心得 一、实验目的和要求: 实验目的: (1)掌握音符产生的方法,了解DDS 技术的应用。 (2)了解AC97音频接口电路的应用。 (3)掌握系统“自顶而下”的设计方法。 实验任务: 设计一个音乐播放器。 (1)可以播放四首乐曲,设置play 、next 、reset 三个按键。按play 键播放当前乐曲,按next 键播放下一首乐曲。 (2)LED0指示播放情况(播放时点亮)、LED2和LED3指示当前乐曲序号。 二、实验内容和原理 (1)音乐播放器的设计原理 根据实验任务可将系统分为主控制器(mcu )、乐曲读取(song_reader )、音符

播放(note_player)、AC97音频接口(codec_conditioner)和ac97_if五个子模块,系统的总体框图如下: 各个模块的功能如下: 模块接收按键信息,通知song_reader模块是否要播放(play)及播放哪首乐曲(song),若一曲播放结束则进入播放结束END状态。 模块根据mcu模块的要求,逐个取出音符{note,duration}送给note_player模块播放,当一首乐曲播放完毕,回复mcu模块乐曲播放结束信号(song_done)。 模块接收到需播放的音符,在音符的持续时间内,以48kHz速率送出该音符的正弦波样品给AC97音频接口模块。当一个音符播放结束,向song_reader模块发送一个note_done脉冲索取新的音符。 、ac97_if模块负责与AC97音频系统接口工作,本实验已提供了这两个模块的代码。 另外,按键处理模块完成输入同步化、防颤动和脉宽变换等功能。 1、主控制模块mcu的设计 mcu模块是主控制模块,有响应按键信息、控制系统播放两大任务,工作流程如下面的流程图所示。要求系统复位后经RESET状态初始化后进入WAIT状态等待按键输入或乐曲播放结束应答,若有按键输入则转入相应的按键处理状态(NEXT或PLAY),若一曲播放结束则进入结束播放END状态。 mcu的控制器算法流程图如下图: 以下为mcu的端口含义

图形学种子填充算法

/种子填充算法 void CZhztchView::boundaryfill4(int x, int y, int boundarycolor, int newcolor) { int color; CClientDC dc(this); //获取客户区设备描述表 color=dc.GetPixel(x,y); if(color!=newcolor&&color!=boundarycolor) { dc.SetPixel(x,y,newcolor); boundaryfill4(x,y+1,boundarycolor,newcolor); boundaryfill4(x,y-1,boundarycolor,newcolor); boundaryfill4(x-1,y,boundarycolor,newcolor); boundaryfill4(x+1,y,boundarycolor,newcolor); } } ///////////////////////////////////////////////////////////////// /////////////// //扫描线填充算法 void CZhztchView::OnScanfill() {

RedrawWindow(); CDC* pDC=GetDC(); CPen newpen(PS_SOLID,3,RGB(255,0,0)); CPen *old=pDC->SelectObject(&newpen); spt[0]=CPoint(100,100); //绘制多边形区域 spt[1]=CPoint(300,100); spt[2]=CPoint(250,250); spt[3]=CPoint(100,250); spt[4]=CPoint(150,200); spt[5]=CPoint(90,180); spt[6]=CPoint(150,150); spt[7]=CPoint(100,100); pDC->Polyline(spt,8); //pDC->SelectObject(old); //ReleaseDC(pDC); // TODO: Add your command handler code here //CDC* pDC=GetDC(); CPen newpen2(PS_SOLID,1,RGB(0,255,0)); CPen *old2=pDC->SelectObject(&newpen2); int j,k,s = 0;

音乐播放器的设计与实现

德州学院信息管理学院 课程设计报告实习名称课程设计2 设计题目Android音乐播放器的设计与实现实习时间 专业班级12级计算机科学与技术 指导老师刘想 教学单位(盖章) 小组成员分工情况: 学号姓名分工 3018 周生明音乐播放的设计与实现1052曹法瑞 1040 张正奎 1055 李元华 2049 王山 二〇一五年六月三十日

目录 摘要 ................................................................................................................ 错误!未定义书签。 1 引言 ............................................................................................................ 错误!未定义书签。 2 可行性分析................................................................................................. 错误!未定义书签。 2.1 技术可行性...................................................................................... 错误!未定义书签。 2.2 经济可行性...................................................................................... 错误!未定义书签。 2.3 管理可行性...................................................................................... 错误!未定义书签。 2.4 可行性分析结论.............................................................................. 错误!未定义书签。 3 系统需求分析............................................................................................. 错误!未定义书签。 3.1 功能分析.......................................................................................... 错误!未定义书签。 3.2 数据流程分析.................................................................................. 错误!未定义书签。 4 系统功能设计............................................................................................. 错误!未定义书签。 4.1 播放器功能结构.............................................................................. 错误!未定义书签。 4.1.1 播放器主界面功能模块....................................................... 错误!未定义书签。 4.1.2 播放器菜单功能模块........................................................... 错误!未定义书签。 4.2 播放器功能流程.............................................................................. 错误!未定义书签。 5 系统实现..................................................................................................... 错误!未定义书签。 5.1 播放器主界面功能列表.................................................................. 错误!未定义书签。 5.2 播放器基本功能的实现.................................................................. 错误!未定义书签。 5.3 播放列表的实现.............................................................................. 错误!未定义书签。 6 软件测试与验证......................................................................................... 错误!未定义书签。 6.1 软件测试的目的.............................................................................. 错误!未定义书签。 6.2 软件测试的方法.............................................................................. 错误!未定义书签。 6.3 软件测试环境.................................................................................. 错误!未定义书签。 6.3.1 android模拟器 ...................................................................... 错误!未定义书签。 6.3.2 真机测试............................................................................... 错误!未定义书签。 6.4 软件测试流程与结果评估.............................................................. 错误!未定义书签。 6.4.1 测试流程............................................................................... 错误!未定义书签。 6.4.2 结果评估............................................................................... 错误!未定义书签。

新型变频数码音乐播放器使用手册

新型变频数码音乐播放器使用手册 江苏华宇电气有限公司 (网址)https://www.wendangku.net/doc/2d4060693.html, (邮箱)cnhuayu@https://www.wendangku.net/doc/2d4060693.html, 第一章总述........................................................................................................- 3 - 1.1简介 .....................................................................................................- 3 - 1.1.1 华宇MP3型超级智能数码音乐播放仪特点........................- 3 - 1.1.2 手册约定 .................................................................................- 4 - 1.1.3 通讯软件计算机系统要求 .....................................................- 4 - 1.1.4 产品包装 .................................................................................- 4 - 1.2 安装说明 ..........................................................................................- 5 - 1.2.1 硬件安装 .................................................................................- 5 - 1.2.2 软件安装 .................................................................................- 6 - 1.2.3 运行程序 .................................................................................- 6 - 第二章编程说明................................................................................................- 6 - 2.1 编程准备 ............................................................................................- 6 - 2.1.1 整理时间表: .........................................................................- 6 - 2.1.2 编程状态说明: .....................................................................- 7 - 2.1.3编程顺序: ..............................................................................- 7 - 2.1.4编程位左右移动: ..................................................................- 7 - 2.1.5数值输入: ..............................................................................- 7 - 2.1.6 编程存贮: .............................................................................- 7 - 2.1.7编程退出: .................................................................................- 7 - 2.2 定时音乐播放程序编程 ....................................................................- 8 - 2.2.1 时间设置: ................................................................................- 8 - 2.2.2 曲目设置: ................................................................................- 8 - 2.2.3 星期设置: ................................................................................- 8 -

【推荐下载】html5 简单音乐播放器

html5 简单音乐播放器 2016/04/09 0 html5 简单音乐播放器 !DOCTYPE html html xmlns=“w3/1999/xhtml”head meta http-equiv=“Content- Type”content=“text/html;charset=UTF-8”/title /title style type=“text/css”body{font-family:微软雅黑;} #container{width:500px;margin:10px auto;border:1px solid #ccc;background:#999999;border-radius:5px;padding:10px;} #mName{float:left;width:250px;} #mTime{float:left;width:250px;text-align:right;} #player{margin-top:20px;} #media{width:450px;} ul{list-style:none;padding-left:5px;} ul li{margin-top:5px;} #mList{height:200px;} #changeMusic{text-align:right;} a{text- decoration:none;color:black;} a:hover{color:red;} /style script //声明两个数组,用来存储歌曲名称和文件地址var musicNames=[],musicSrcs=[],randomNums=[]; var RANDOMNUM=5;//随机的歌曲数量function $(id){ return document.getElementById(id); } function initial(){ //为数组赋值musicNames[0]=“Blood Money.mp3”;musicNames[1]=“California Hotel.mp3”; musicNames[2]=“Loving You.mp3”;musicNames[3]=“Miracle.mp3”; musicNames[4]=“SantaFe.mp3”;musicNames[5]=“Wonderful Tonight.mp3”; musicSrcs[0]=“music/Blood Money.mp3”;musicSrcs[1]=“music/CalifoniaHotel.mp3”; musicSrcs[2]=“music/Loving You.mp3”;musicSrcs[3]=“music/Miracle.mp3”; musicSrcs[4]=“music/SantaFe.mp3”;musicSrcs[5]=“music/Wonderful Tonight.mp3”; //获取元素media = $(“media”);//绑定事件media.addEventListener(“canplay”,media_canplay,false); media.addEventListener(“play”,media_play,false); //获取歌曲loadMusic(); } /** * 判断r 在randomNums 中是否已经存在* return true : 已经存在* return false : 不存在*/ function checkRExists(r){ for(var i=0;i randomNums.length;i++){ if(randomNums[i] == r){ //存在return true; } } return false; } /** * 方法:用于生成指定个数随机数* 如果碰到重复的数字,则重新生成*/ function generateRandom(){ var i=0; for(;;){ var

音乐播放器需求分析

音乐播放器需求分析 项目名称音乐播放器 需求分析左茂元 界面设计杨婷、李映 程序测试杨婷、李映 程序员1 高守林 程序员2 廖敬之 总负责人魏秋兴 2016 年11 月

摘要:随着生活水平的提高,娱乐已成为非常主流的话题,人们不仅需要通过音乐陶冶情操,而且越来越多的人倾向于使用音乐、视频等娱乐和放松自己,这大大促进了媒体软件的发展.本文旨在介绍研究常用数字音频编码和解码的相关知识,并结合VS2013编写多功能音乐播放器,了解音乐播放器功能的实现,掌握开发音乐播放器所需的相关知识,采用了面向对象软件工程方法,其开发主要包括应用程序界面设计和后台代码运行两个方面,实现了多功能音乐播放器在计算机上的应用,可以在很大程度上满足用户的需求.该系统主要具备:音乐播放控制、音乐文件控制、音量控制、下载控制、歌词控制、进度控制、音乐剪辑等功能模块。 关键字:音乐播放器,音频编码格式,C#,Visual Studio 2013

1.前言 (4) 1.1选题的背景及意义 (4) 1.2项目目的 (4) 1.3参考资料 (4) 2.具体需求 (5) 3.前台功能需求 (5) 3.1用户登录需求 (5) 3.2播放器的基本控制需求 (5) 3.3播放列表管理需求 (6) 4.界面需求 (6) 5.后台管理需求 (6) 5.1管理员管理 (6) 5.2歌手管理 (7) 5.3歌曲管理 (7) 5.4类别管理: (7) 6.性能需求 (7) 7. 可靠性要求 (7) 8.音乐播放器需求修改明细 (8)

1.前言 随着社会的快速发展,现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,音乐成了我们生活工作中的一个重要的部分。现今播放器的种类繁多,此文档是为了设计一个基于Microsoft系统而设计的一个音乐播放器。 1.1选题的背景及意义 本项目由项目经理魏秋兴提出由项目组员一起联合开发并实现其功能。开发此软件是为软件的开发者能更好的理解和明确软件开发的详细过程,安排项目与进度、组织软件开发与测试,撰写本文档。本文档供项目组成员,软件开发人员参考。 1.2项目目的 本项目的目的是开发一个可以播放主流的音乐文本格式的播放器。设计的主要实现功能是播放MP3格式的音乐文件,并且能控制播放,暂停,停止,音量控制,选择上一曲,选择下一曲,更改皮肤,歌曲列表文件的管理操作,在线播放,读取存储卡播放等多种播放控制,界面简明,操作简单。软件系统检测到错误行为时,报告错误,并提示处理操作。 1.3参考资料 待定——————————————————————————————————————————————————————————————————————————

在线音乐播放系统详细设计

<在线音乐播放系统> 详细设计说明书 作者: 完成日期: 签收人: 签收日期: 修改情况记录:

1 引言 1.1 编写目的 为软件开发人员在编码的过程中有所依据和参考。 面向人员:程序开发人员 1.2 背景 说明: a.待开发的软件系统的名称:在线音乐播放系统 b.列出本项目的任务提出者:北软老师 c.开发者:邓凯 d.用户:广大互联网用户 e.将运行该项软件的单位:web服务器 1.3 定义 OMS :Online music system,在线音乐播放系统。 1.4 参考资料 列出要用到的参考资料,如: a.本项目的经核准的计划任务书或合同、上级机关的批文; b.在线音乐播放系统概要设计.doc; c.本文件中各处引用的文件、资料,包括所要用到的软件开发标准。 列出这些文件的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。 2 程序系统的结构 本程序主要采用四层结构,如下所示: 图1 系统结构示意图

3 程序(标识符)设计说明 3.1 在线音乐网络爬虫设计说明: 资源的数量和质量将决定了系统的商业价值,为了获取更多的网络媒体资源,为系统设计了一款针对互联网上音乐资源的网络爬虫。 3.1.1爬虫的原理: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从Internet网上下载网页,是搜索引擎的重要组成。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。 聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止,另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。 相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题: (1)对抓取目标的描述或定义; (2)对网页或数据的分析与过滤; (3)对URL的搜索策略。 3.1.2在线音乐播放系统爬虫的设计: 与通用爬虫不同,在线音乐播放系统爬虫只针对https://www.wendangku.net/doc/2d4060693.html,音乐频道 https://www.wendangku.net/doc/2d4060693.html,音乐频道,针对MP3格式的资源。 3.1.3爬虫的流程图:

相关文档
相关文档 最新文档