3万篇免费论文,近200个详细分类,为你的论文写作排忧解难。点击进入
《计算机世界月刊》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(); } 转贴于 中国文秘网 http://www.zgwmw.com
《也谈下重放*.WAV文件》来源于中国文秘网,中国最专业的文秘网站,欢迎阅读也谈下重放*.WAV文件。
|