Hangkártyák programozása retro 14.

6.3. Az impulzusválasz teszt kódja

A rendszer felépítésének ismertetése már megtörtént, s láthattuk, hogy milyen programozási eszközök vannak a kezünkben ahhoz, hogy megvalósítsuk az általunk kitűzött célokat. Tudunk hangfelvételt készíteni a Sound Blaster segítségével és képesek vagyunk hangot megszólaltatni a Gravis Ultrasound ACE hangkártyával. Ezek után tekintsük át az impulzusválasz tesztet megvalósító program kódját.

uses crt, sb16mix, sb_aidma, gus;{ A szükséges unitok }

var     filehandle: file;

filename: string;

rec,w,r,rs:word;

Procedure SetSBMixer; { A Sound Blaster mixerének beállítása }

begin

SetMasterVolume($ff,$ff);   { Bemeneti eszközök hangereje maximumon}

SetDSPVolume($ff,$ff);      { DSP hangereje maximumon }

SetMicVolume($ff);          { Mikrofon hangereje maximumon }

SetLineVolume($ff,$ff);     { Vonali bemenet hangereje maximumon }

OutputSelect($00);          { Nincs eszköz a kimeneten }

InputSelect($01,$01);       { Csak a mikrofonról van bemenet: $01}

MicAGC(off);                { AGC lekapcsolva }

SetRecordSampleRate(44100); { Beállítjuk a mintavételi frekvenciát }

end;

Procedure GravisSign; { Hangminta generálása Gravis Ultrasound-dal }

var i,y:longint;

begin

GravisReset; { A hangkártya alapállapotba hozása }

{ Egyetlen hangminta széles impulzus betöltése a GUS DRAM-ba }

for i:=0 to 0 do

PutByte(i,127);

for i:=1 to 65535 do

PutByte(i,0);

Volume($00,64); { Hangerő közvetlen beállítása}

Note($00,36);   { A csatornához tartozó frekvencia beállítása }

GravisBalance($00,$08); { Egy csatorna balanszértékének beállítása }

SetGF1Byte($00,$4c,$03); { Inicializálás }

PlayVoice($00,$08,0,0,524288); { A hangminta lejátszása }

end;

BEGIN

clrscr;

if AllocDMAbuffer(16384)<0 then{ Helyfoglalás a DMA buffer részére}

begin

writeln(‘Failed to allocate DMA buffer!’);

halt;

end;

SetSBMixer;

InitInterrupt(nil);  { Beállítjuk a megszakításvezérlőt  }

SetDMAblockSize(8192);  { Beállítjuk a DSP blokkméretét  }

InitDMAcontroller(RecordMode);{ Inicializáljuk a DMA vezérlőt (REC)}

{ A felvétel mentési útvonalát várja paraméterként a parancssorba }

Writeln(‘Recording, press any key to stop…’);

if paramcount=0 then

begin

writeln;

writeln(‘Usage: REC1 <path>’);

delay(5000);

exit;

end;

filename:=paramstr(1);

assign(filehandle,filename);

rewrite(filehandle,1);    { Megnyitjuk a hangmitna fájlt írásra }

rs:=Halfsize;

GravisSign;              { Impulzus generálásának elindítása }

StartAutoInitDMArecord;   { Elindítjuk a felvételt }

rec:=0;

repeat

if RfshRequest then { Ha a fél buffert feltöltötte… }

begin

inc(rec);

RfshRequest:=false;  { RfshRequest= FALSE ! }

{ Kiírjuk a blokkot a HDD-re   }

blockwrite(filehandle,DMAptr^,HalfSize,rs);

write(‘*’);

NextBuffer;     { A következő félbufferre váltunk }

end;

until rec=8;  { Kilépünk, 65536 minta felvétele után }

close(filehandle); { Lezárjuk a fájlt }

writeln;

StopAutoInitDMA;   { Leállítjuk a DMA átvitelt }

DoneDMAcontroller; { Tiltjuk a DMA csatornát }

DoneInterrupt;     { Visszaállítjuk a megszakítást }

FreeDMAbuffer;     { Felszabadítjuk a DMA buffert }

StopVoice($00);    { Gravis elhallgat }

readln;

END.

A teszt eredménye egy hangállomány, amely visszajátszható a mellékelt Play program segítségével, és hullámformája megtekinthető a Scroll nevű programmal. (A Play program listája a F.29-ben tanulmányozható, a Scroll pedig a F.30-ban.) Az időfüggvény sok mindent elárul az adott terem hangzásáról. Példaként már említettük, hogy segítségével igen pontosan meg lehet határozni a visszhangok helyét, illetve el lehet választani a közvetlenül a hangforrásból származó hangokat és az egyéb visszaverődéseket.  Illusztrációként nézzük meg egy ilyen impulzusválasz időfüggvényének részletét. (Lásd F.17.)

F.17. Az impulzusválasz időfüggvénye. Az ábra alapján kiszámolható, hogy a mikrofon a hangforrástól 136 cm-re volt. 0,5 ms-ra volt szüksége az impulzusnak ahhoz, hogy a hangszórón megjelenjen, és 4 ms telt el, míg az első hanghullámok eljutottak a hangforrástól a mikrofonig.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s