推薦文檔列表

也談下重放*.WAV文件

時間:2021-10-01 10:08:26 計(jì)算機(jī)論文 我要投稿

也談下重放*.WAV文件

《計(jì)算機(jī)世界月刊》1995.3期曾刊登了《在DOS下使用Windows *.WAV文件》一文,根據(jù)《在》文中所附的源程序重放WAV文件,發(fā)現(xiàn)其音質(zhì)確實(shí)較差;又用文中所提及的第二種延時方法,效果并無改善(大概是循環(huán)次數(shù)int(vol[counter]/256)≡0)。究其原因,可能是重放時將原WAV文件中127/128的有用信息拋棄了。

實(shí)際上,我們是可以把原來拋棄的127/128的有用信息撿回來的。我們知道,WAV文件中所存的是采樣時的電壓幅值信號,只要將電壓信號重現(xiàn)在PC的小喇叭上,就可以逼真地重放WAV文件了。

喇叭上發(fā)出的聲音,其實(shí)就是驅(qū)動喇叭的電壓變化。而對PC上的數(shù)字開關(guān)喇叭,只有“0”和“1”兩種狀態(tài):“1”時喇叭紙盆向外運(yùn)動,“0”則紙盆向內(nèi)運(yùn)動而回復(fù)正常位置。

但是向喇叭發(fā)送“1”信號時,喇叭向外運(yùn)動有一個延遲時間,當(dāng)喇叭還沒到達(dá)最外位置時,立即再發(fā)送“0”信號,紙盆來不及運(yùn)動到最外位置而轉(zhuǎn)向向內(nèi)運(yùn)動。根據(jù)這一原理,我們控制喇叭向外運(yùn)動的時間,就可以間接地控制紙盆運(yùn)動的幅度,從而根據(jù)WAV文件的采樣值來控制喇叭的聲音大小。

對于PC時鐘,顯然來不及控制紙盆運(yùn)動的幅度(即使對8253定時器重新編程,也無法使紙盆從正常位置到最外位置有若干個int08h發(fā)生),因此,對于WAV文件的延時,只能采用loop指令。實(shí)際上,Windows也正是用這種方法來延時的(以標(biāo)準(zhǔn)模式和增強(qiáng)模式分別啟動時,Windows要重新建立延遲時間而發(fā)出測試的聲音)。

程序中讀WAV文件頭信息和WAV數(shù)據(jù)與《在》文相同,發(fā)聲子程序重新改寫了。若發(fā)出的聲音在頻率上有失真,可以修改wave函數(shù)中cx的初值(386增強(qiáng)模式、386DX33微機(jī)上Windows使用0x13)。

程序運(yùn)行環(huán)境:386兼容機(jī),DOS6.2,Twrbo C 3.0編譯系統(tǒng)。

#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,

[1] [2] [3]