对联 ·故事 ·史海钩沉 ·人物档案 ·地方风俗 ·谚语大全 ·讽刺与幽默 · 赚钱 · 法律 · 在线教研 · 会员中心 · 心理测试 · 魔鬼词典 · 顺口溜
 
主页特效 网页特效 百家姓
娱乐 歇后语 绕口令 脑筋急转弯
 
谚语 谜语 名言 邮政编码
便民 酒方 验方 偏方 站长工具  
 
算命 风俗 手相 爱情
女孩 音乐 面相 星座 血型
 
饮食 穴道 偏方 医药
生活 软件 硬件 解梦 高考



   JS特效



实用工具
便民服务 加密解密
 
魅力高密 民间故事 Flash教程 PS教程 最新国内新闻
新华字典 黄道吉日 英语园地  万年历 Html2anycode
  首页 | 美图 | 短信 | 安全 | 校园 | 网站 | 游戏 | UFO | 文秘 | 生活 | 信息技术 | 论文 | 人生 | 情感 | 日记
返回首页
当前位置: 主页 > 论文大全 > 理工类 >

也谈下重放*.WAV文件

时间:2010-07-27 23:39来源:盼盼的家园 作者:纽带 点击:
《计算机世界月刊》1995.3期曾刊登了《在DOS下使用Windows *.WAV文件》一文,根据《在》文中所附的源程序重放WAV文件,发现其音质确实较差;又用文中所提及的第二种延时方法,效果并无
  

《计算机世界月刊》1995.3期曾刊登了《在DOS下使用Windows *.WAV文件》一文,根据《在》文中所附的源程序重放WAV文件,发现其音质确实较差;又用文中所提及的第二种延时方法,效果并无改善(大概是循环次数int(vol[counter]/256)≡0)。究其原因,可能是重放时将原WAV文件中127/128的有用信息抛弃了。
实际上,我们是可以把原来抛弃的127/128的有用信息捡回来的。我们知道,WAV文件中所存的是采样时的电压幅值信号,只要将电压信号重现在PC的小喇叭上,就可以逼真地重放WAV文件了。
喇叭上发出的声音,其实就是驱动喇叭的电压变化。而对PC上的数字开关喇叭,只有“0”和“1”两种状态:“1”时喇叭纸盆向外运动,“0”则纸盆向内运动而回复正常位置。
但是向喇叭发送“1”信号时,喇叭向外运动有一个延迟时间,当喇叭还没到达最外位置时,立即再发送“0”信号,纸盆来不及运动到最外位置而转向向内运动。根据这一原理,我们控制喇叭向外运动的时间,就可以间接地控制纸盆运动的幅度,从而根据WAV文件的采样值来控制喇叭的声音大小。
对于PC时钟,显然来不及控制纸盆运动的幅度(即使对8253定时器重新编程,也无法使纸盆从正常位置到最外位置有若干个int08h发生),因此,对于WAV文件的延时,只能采用loop指令。实际上,Windows也正是用这种方法来延时的(以标准模式和增强模式分别启动时,Windows要重新建立延迟时间而发出测试的声音)。
程序中读WAV文件头信息和WAV数据与《在》文相同,发声子程序重新改写了。若发出的声音在频率上有失真,可以修改wave函数中cx的初值(386增强模式、386DX33微机上Windows使用0x13)。
程序运行环境:386兼容机,DOS6.2,Twrbo C++3.0编译系统。
#include<dos.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h> お
#define MAXSIZE 50000 お
unsigned int a[]=
{
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,
0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff81,0xff83,
0xff88,0xff8d,0xff92,0xff97,0xff9c,0xffa1,0xffa6,0xffab,
0xffb0,0xffb5,0xffba,0xffbf,0xffc4,0xffc9,0xffce,0xffd3,
0xffd8,0xffdd,0xffe2,0xffe7,0xffec,0xfff1,0xfff6,0xfffb,
0x0000,0x0005,0x000a,0x000f,0x0014,0x0019,0x001e,0x0023,
0x0028,0x002d,0x0032,0x0037,0x003c,0x0041,0x0046,0x004b,
0x0050,0x0055,0x005a,0x005f,0x0064,0x0069,0x006e,0x0073,
0x0078,0x007d,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,
0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f,0x007f
=======================================================
}; お
struct wave-file-head
{
char riff-id[4];
long size0;
char wave-fmt[8];
long size1;
int fmttag;
int channel;
long samplespersec;
long bytepersec;
int blockalign;
int bitpersamples;
} filehead; お
long datasize;
unsigned char vol[MAXSIZE];
void wave(void); お
void wave()
{
unsigned int i; お
for(i=0;i<datasize;i++)
{
_BL=vol[i];
asm {
xor bh,bh
shl bx,1
mov bx,a[bx];
xor di,di;
xor dx,dx;
in al,0x61;
and al,0xfc;
out 0x61,al;
mov cx,17;
}
loc33:
asm{
add di,bx;
jge loc34
and al,0xfc;
sub di,0xff81;
out 0x61,al;
loop loc33;
jmp loc35;
}
loc34:
asm{
or al,3;
sub di,0x7f;
out 0x61,al;
loop loc33;
}
loc35;
}
} お
void main(int argc,char *argv[])
{
long j;
int key;
char *s;
FILE *fp; お
if (argc==1)
{
printf("Required parameter missing\n");
exit(0);

>}
if((fp=fopen(argv[1],"rb"))==NULL)
{
printf("File not open\n");
exit(0);
}
if(fread(&filehead,sizeof(struct wave-file-head),1,fp) ==NULL)
{
prinft("File read error\n");
exit(0);
}
fseek(fp,4,SEEK-CUR);
fread(&datasize,4,1,fp); お
for(j=0;j<datasize;j++)
vol[j]=getc(fp);
fclose(fp);
printf("%s\n","Press[ESC] to stop\nSounding...");
while(bioskey(1)==0)wave();
nosound();
}

DvNews



顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
赞助商位置
推荐内容
杂七杂八