我来说说我的思路:
判断文件的类型 使用对应的解码函数(可以自己写 也可以调用的别人的库)(因为类型都有不同的格式)
装载文件到内存 利用声卡驱动程序(或是对应的发声函数)来播放
假设现在是在windows平台
您就可以利用 PlaySound函数来播放音乐 不过需要连接winmm.lib库而且需要包含头文件 mmsystem.h
好,现在我再举一个例子:(假设还是在windows平台)(这里利用了Beep函数来播放简单声音)
#include <stdio.h>
#include <windows.h>
#include <conio.h>
int main()
{
char filename[1024]
FILE* fp
int a = 0,b = 0
printf("您需要播放什么文件:")
gets(filename)
fp = fopen(filename,"r")* 读取文件到内存 */
while(!ferror(fp) &&fscanf(fp,"Beep(%d,%d)\n",&a,&b) == 2)/* 读取文件到内存 (按该文件制定的播放格式来播放)*/
{
Beep(a,b)/* 发声 */
}
fclose(fp)
fp = 0
puts("播放完毕!")
getch()
return 0
}
这个程序就是按我刚刚说的步骤来做的
要播放的文件使用了我自己制定的音乐格式(呵呵 只是为了给你说清楚)(真正的音乐格式其实是2进制格式的 而不是这里的文本格式)(格式是这样的:
Beep(频率,播放时间) )
#include <dos.h>#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
void main()
{
void set(int *set1,int *set2,char *f,char *n,int *t,int rate,int num)
void music(int *set1,int *set2,int num)
int flag=0
FILE *f1
int t
int rate
char in[3]
int i
int n
char *frequency
char *note
int *time
int *set1
int *set2
int menu
int FileName[30]
while(1)
{
f1=NULL
flag=0
frequency=NULL
note=NULL
time=NULL
set1=NULL
set2=NULL
i=n=0
printf("1 播放程序自带的音乐music1\n")
printf("2 播放程序自带的音乐music2\n")
printf("3 通过输入文件名进行音乐的播放\n")
printf("4 退出\n")
while(1)
{
scanf("%d",&menu)
if(menu==1)
{
strcpy(FileName,"music1.txt")
break
}
if(menu==2)
{
strcpy(FileName,"music2.txt")
break
}
if(menu==3)
{
scanf("%s",FileName)
break
}
if(menu==4)
exit(1)
}
printf("\n该文件的音乐编码如下:\n")
/*-------------------------------------*/
if((f1=fopen(FileName,"r"))==NULL)
{
printf("不能打开文件!\n")
exit(1)
}
/*-------------------------------------*/
fscanf(f1,"%d",&rate)
frequency=(char *)malloc(sizeof(char))
note=(char *)malloc(sizeof(char))
time=(int *)malloc(sizeof(int))
while(!feof(f1)&&flag!=1)
{
fscanf(f1,"%s%d",in,&t)
if(t!=-1)
{
printf("%s %d ",in,t)
frequency[i]=in[0]
note[i]=in[1]
time[i]=t
i++
n++
frequency=(char *)realloc(frequency,(i+1)*sizeof(char))
note=(char *)realloc(note,(i+1)*sizeof(char))
time=(int *)realloc(time,(i+1)*sizeof(int))
}
else
flag=1
}
fclose(f1)
for(i=0i<ni++)
{
switch(frequency[i])
{
case 'h':
switch(note[i])
{
case '1':
note[i]=523
time[i]=time[i]*rate
break
case '2':
note[i]=587
time[i]=time[i]*rate
break
case '3':
note[i]=659
time[i]=time[i]*rate
break
case '4':
note[i]=698
time[i]=time[i]*rate
break
case '5':
note[i]=784
time[i]=time[i]*rate
break
case '6':
note[i]=880
time[i]=time[i]*rate
break
case '7':
note[i]=988
time[i]=time[i]*rate
break
}
break
case 'm':
switch(note[i])
{
case '1':
note[i]=262
time[i]=time[i]*rate
break
case '2':
note[i]=296
time[i]=time[i]*rate
break
case '3':
note[i]=330
time[i]=time[i]*rate
break
case '4':
note[i]=349
time[i]=time[i]*rate
break
case '5':
note[i]=392
time[i]=time[i]*rate
break
case '6':
note[i]=440
time[i]=time[i]*rate
break
case '7':
note[i]=494
time[i]=time[i]*rate
break
}
break
case 'l':
switch(note[i])
{
case '1':
note[i]=131
time[i]=time[i]*rate
break
case '2':
note[i]=147
time[i]=time[i]*rate
break
case '3':
note[i]=165
time[i]=time[i]*rate
break
case '4':
note[i]=175
time[i]=time[i]*rate
break
case '5':
note[i]=196
time[i]=time[i]*rate
break
case '6':
note[i]=220
time[i]=time[i]*rate
break
case '7':
note[i]=247
time[i]=time[i]*rate
break
}
break
}
for(i=0i<ni++)
{
sound(note[i])
delay(time[i])
nosound()
}
free(frequency)
free(note)
free(time)
free(set1)
free(set2)
putchar('\n')
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)