Vissza a főoldalra    Vissza az Zenei elektronika főoldalra

<< Hangmintakészítő algoritmus   Vissza a HF generátor hangkártyából oldalra

 


Hangmintakészítő program


 

      A hangmintafájlokat előállító program a *.wav fájlok formátumleírása és az előző oldal algoritmusa alapján könnyen elkészíthető.
      A következőkben ennek megvalósítása látható Turbo Pascal programozási nyelven. A letölthető programlisták az 1990-es kiadású Borland Turbo Pascal 6.0 programmal készültek.

      A programfej és a deklarációs rész a szükséges változókkal:

program cdgen;
const
  lepeskoz: real=1/44100;
var
  frekvencia: word;
  periodusido,meret,valodi_frekvencia,valodi_hossz: real;
  lepesszam,ertek,teljeshossz,adatszam: longint;
  mintaszam,szamlalo,hullamszam,temp: longint;
  fajlnev: string[8];
  hossz: byte;
  fajl: file of longint;

      Mivel a hangmintafájlt négybájtos szavanként (longint) kezeljük, szükség van még egy összefűző függvényre, amely 4db egybájtos adatból egyetlen négybájtosat készít. A következő függvény az a, b, c, d bemenő egybájtos adatokat felfűzi egy d - c - b - a sorrendű négybájtos dupla szóvá, amely a little endian tárolási mód miatt majd újra a helyes sorrendben (a - b - c - d) fog tárolódni a fájlban.

function konverzio(a,b,c,d):longint;
begin
  temp:=d;
  temp:=(temp shl 8);
  temp:=temp+c;
  temp:=(temp shl 8);
  temp:=temp+b;
  temp:=(temp shl 8);
  temp:=temp+a;
  konverzio:=temp;
end;

      A program végrehajtó része az adatbevitellel kezdődik:

begin
  write('A létrehozandó hangfájl neve:');
  readln(fajlnev);
  write('A frekvencia [Hz]:');
  readln(frekvencia);
  write('Az időtartam [s]:');
  readln(hossz);

      A szükséges segédadatok számítása:

  periodusido:=1/frekvencia;
  hullamszam:=round(hossz/periodusido);
  mintaszam:=round((hullamszam*periodusido)/lepeskoz);
  adatszam:=(mintaszam*4)+8;
  teljeshossz:=adatszam+36;
  valodi_hossz:=lepeskoz*mintaszam;
  valodi_frekvencia:=hullamszam/valodi_hossz;
  valodi_hossz:=valodi_hossz+(lepeskoz*2);
  meret:=(teljeshossz+8)/1024/1024;

      A hangmintafájl első konstans adatainak beírása:

  assign(fajl,fajlnev+'.wav');
  rewrite(fajl);
  temp:=konverzio(82,73,70,70);
  write(fajl,temp);
  temp:=teljeshossz;
  write(fajl,temp);
  temp:=konverzio(87,65,86,69);
  write(fajl,temp);
  temp:=konverzio(102,109,116,32);
  write(fajl,temp);
  temp:=konverzio(16,0,0,0);
  write(fajl,temp);
  temp:=konverzio(1,0,2,0);
  write(fajl,temp);
  temp:=konverzio(68,172,0,0);
  write(fajl,temp);
  temp:=konverzio(16,177,2,0);
  write(fajl,temp);
  temp:=konverzio(4,0,16,0);
  write(fajl,temp);
  temp:=konverzio(100,97,116,97);
  write(fajl,temp);
  temp:=adatszam;
  write(fajl,temp);
  temp:=konverzio(0,0,0,0);
  write(fajl,temp);

      Ezután következik a hangminták értékeinek számítása. Mivel mindkét hangcsatornában ugyanazt a hangjelet kell szerepeltetni, a számított kétbájtos értékeket egy eltolással meg kell duplázni négybájtossá. A hangmintafájl számított szinuszos értékei:

  szamlalo:=1;
  repeat
    ertek:=round(32766*sin(szamlalo*lepeskoz*2*pi/periodusido));
    ertek:=ertek*65536+ertek;
    szamlalo:=szamlalo+1;
  until (szamlalo*4)>(adatszam-7);

      A befejező nulla jel beírása és a fájl bezárása:

  temp:=konverzio(0,0,0,0);
  write(fajl,temp);
  close(fajl);

      A számított adatok kiírása, majd a program vége:

  writeln('A hangfájl frekvenciája: ',valodi_frekvencia,' Hz');
  writeln('A hangfájl időtartama: ',valodi_hossz,' s');
  writeln('A hangfájl mérete: ',meret,' MB');
end.

      A fenti programlista menürendszerrel és írási állapot kijelzősávval bővítve letölthető a cdgen11.pas helyről, a program kerekített hullámhosszú változata pedig a cdgen10.pas helyről.
      Ezzel a módszerrel a két csatorna eltérő fázishelyzetű és eltérő frekvenciájú hangjelekkel is feltölthető az értékszámító rész átírásával.

 

  Tudomány és Technika (test@t-es-t.hu)


 

<< Hangmintakészítő algoritmus   Vissza a HF generátor hangkártyából oldalra

Vissza a főoldalra    Vissza az Zenei elektronika főoldalra