wykres obwiedni

0

Jak narysowac wykres obwiedni pobierajc dane z pliku muzycznego wav.

Pobieram takie take dane z pliku. Brakuje mi tylko sposobu na narysowanie wykresu OBWIEDNI za pomocą TImage.

var p:tfilestream;
dialog:topendialog;
zz,z,i,j,ll,pp:integer;
g,h:integer;
dane:record
ChunkID :array[0..3] of char;
ChunkSize :integer;
Format :array[0..3] of char;
Subchunk1ID :array[0..3] of char;
Subchunk1Size :integer;
AudioFormat :integer;
NumChannels :integer;
SampleRate :integer;
ByteRate :integer;
BlockAlign :integer;
BitsPerSample :integer;
Subchunk2ID :array[0..3] of char;
Subchunk2Size :integer;
end;

begin
dialog:=topendialog.Create(form1);
dialog.Filter:='wav';
if dialog.Execute then
begin
p:=tfilestream.Create(dialog.FileName,fmopenread);
p.Read(dane.ChunkID,4);
p.Read(dane.ChunkSize,4);
p.Read(dane.Format,4);
p.Read(dane.SubChunk1ID,4);
p.Read(dane.SubChunk1Size,4);
p.Read(dane.AudioFormat,2);
p.Read(dane.NumChannels,2);
p.Read(dane.Samplerate,4);
p.Read(dane.ByteRate,4);
p.Read(dane.BlockAlign,2);
p.Read(dane.BitsPerSample,2);
p.Read(dane.Subchunk2ID,4);
p.Read(dane.Subchunk2Size,4);

  zz:=dane.Subchunk2Size;
  z:=dane.BlockAlign;
  case dane.NumChannels of
    1: begin

        for i:=0 to ((zz div z)) do
          begin
            p.Read(dane.lewy,z);
            p.Seek(z,sofromcurrent);
          end;
       end;
    2: begin
        for i:=0 to ((zz div z)) do
          begin
            p.Read(dane.lewy,(z div 2));
            p.Read(dane.prawy,(z div 2));                 
            p.Seek(z,sofromcurrent);
          end;
        end;
  end;
 p.Free;
end;
0

. Brakuje mi tylko sposobu na narysowanie wykresu OBWIEDNI za pomocą TImage.

Może konkretniej ;)

0
Bizon napisał(a)

Jak narysowac wykres obwiedni pobierajc dane z pliku muzycznego wav.

Pobieram takie take dane z pliku. Brakuje mi tylko sposobu na narysowanie wykresu OBWIEDNI za pomocą TImage.

var p:tfilestream;
dialog:topendialog;
zz,z,i,j,ll,pp:integer;
g,h:integer;
dane:record
ChunkID :array[0..3] of char;
ChunkSize :integer;
Format :array[0..3] of char;
Subchunk1ID :array[0..3] of char;
Subchunk1Size :integer;
AudioFormat :integer;
NumChannels :integer;
SampleRate :integer;
ByteRate :integer;
BlockAlign :integer;
BitsPerSample :integer;
Subchunk2ID :array[0..3] of char;
Subchunk2Size :integer;
end;

begin
dialog:=topendialog.Create(form1);
dialog.Filter:='wav';
if dialog.Execute then
begin
p:=tfilestream.Create(dialog.FileName,fmopenread);
p.Read(dane.ChunkID,4);
p.Read(dane.ChunkSize,4);
p.Read(dane.Format,4);
p.Read(dane.SubChunk1ID,4);
p.Read(dane.SubChunk1Size,4);
p.Read(dane.AudioFormat,2);
p.Read(dane.NumChannels,2);
p.Read(dane.Samplerate,4);
p.Read(dane.ByteRate,4);
p.Read(dane.BlockAlign,2);
p.Read(dane.BitsPerSample,2);
p.Read(dane.Subchunk2ID,4);
p.Read(dane.Subchunk2Size,4);

  zz:=dane.Subchunk2Size;
  z:=dane.BlockAlign;
  case dane.NumChannels of
    1: begin

        for i:=0 to ((zz div z)) do
          begin
            p.Read(dane.lewy,z);
            p.Seek(z,sofromcurrent);
          end;
       end;
    2: begin
        for i:=0 to ((zz div z)) do
          begin
            p.Read(dane.lewy,(z div 2));
            p.Read(dane.prawy,(z div 2));                 
            p.Seek(z,sofromcurrent);
          end;
        end;
  end;
 p.Free;
end;

tym czytam sample z pliku i na podstawie tych sampli ma m w Timage narysować Wykres spektralny dzwieku i na podstawie tego wykresu mam narysowac Obeiednie

0

Hahahaha. Pytam o konkrety bo nie wiem o co ci chodzi. Czy chodzi ci o to jak w ogóle się rysuje tego typu rzeczy czy jak to zrobić za pomocą kontrolki TImage.

...narysować Wykres spektralny dzwieku i na podstawie tego wykresu mam narysowac Obeiednie

To w końcu o co ci chodzi? o wykres spektralny czy o obwiednie?

0
0x666 napisał(a)

Hahahaha. Pytam o konkrety bo nie wiem o co ci chodzi. Czy chodzi ci o to jak w ogóle się rysuje tego typu rzeczy czy jak to zrobić za pomocą kontrolki TImage.

...narysować Wykres spektralny dzwieku i na podstawie tego wykresu mam narysowac Obeiednie

To w końcu o co ci chodzi? o wykres spektralny czy o obwiednie?

chodzi mi o obwiednie o jakis wzor lub kawalek kodu to saobie dalej poradze.

0

chodzi mi o obwiednie o jakis wzor lub kawalek kodu to saobie dalej poradze.

Jeśli chodzi o wzory to nie wiem czy takowe są - ja się nie spotkałem ;)
Jeśli chodzi o kod to jest problem bo nawet jakbym wkleił tu swój to i tak prawdopodobnie nie zajarzyłbyś o co w nim chodzi - był pisany pod kontretną część większego projektu. Dlatego proponuje żebyś zadał jakieś konkretne pytania odnośnie tematu.

PS. Rozumiem, że pod pojęciem obwiedni masz na myśli coś w rodzaju oscylogramu ;)

0
0x666 napisał(a)

chodzi mi o obwiednie o jakis wzor lub kawalek kodu to saobie dalej poradze.

Jeśli chodzi o wzory to nie wiem czy takowe są - ja się nie spotkałem ;)
Jeśli chodzi o kod to jest problem bo nawet jakbym wkleił tu swój to i tak prawdopodobnie nie zajarzyłbyś o co w nim chodzi - był pisany pod kontretną część większego projektu. Dlatego proponuje żebyś zadał jakieś konkretne pytania odnośnie tematu.

PS. Rozumiem, że pod pojęciem obwiedni masz na myśli coś w rodzaju oscylogramu ;)

Oki w takim razie czy wiesz jak narysowac oscylogram. Jesli tak to byłbym wdzieczny jak bys zarzucił.

0

Kurde. Chwilowo nie mam czasu żeby to wyjaśniać. :-| Ale powiem na razie tak:
potraktuj numer/index sampla jako wartość X na wykresie, a wartość sampla jako Y. Cała sztuczka polega na odpowiednim zeskalowaniu tego - w praktyce problem jest nieco bardziej złożony. Przemyśl to i pokombinuj - jakby co, pytaj. Przyjżałem się twojej procedurze czytającej plik WAV i myśle (a raczej jestem pewnien), że będzie miała problemy z otwieraniem niektórych plików WAV - między 'kromką' (chunk) formatu a 'kromką' danych mogą znajdować sie inne 'kromki' (np. markery, loop'y itd.). Druga sprawa. Użyj buforowania bo czytanie po jednym samplu z pliku nie jest za wydajne ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1