Biblioteka BASS i znormalizowany wykres dźwięku

0

Witam.

Za pomocą biblioteki BASS próbuję wyrysować przebieg czasowy dźwięku (czyli wykres amplitudy od czasu) z wczytanego pliku .WAV. Uzyskany obraz nie wygląda jednak tak jak powinien:

user image

Użyłem w Borland C++ Builderze następującego kodu:

   DWORD r, l;
   DWORD OK;
   HSTREAM Uchwyt;
   float r2, l2;
   Uchwyt = BASS_StreamCreateFile(False, "file.wav", 0, 0, BASS_STREAM_DECODE);
   while (BASS_ChannelIsActive(Uchwyt) > 0)
   { 
         
         OK = BASS_ChannelGetLevel(Uchwyt);
          r=HIWORD(OK);
          l=LOWORD(OK);
          if (r <= 16384)
          {
                r2 = (float)r/16384;
                r2 = (1-r2)*-1;
          }
          else
          {
                r2 = (float)(r-16384);
                r2 = r2/16384;
          }
          if (l <= 16384)
          {
                l2 = (float)l/16384;
                l2 = (1-l2)*-1;
          }
          else
          {
                l2 = (float)(l-16384);
                l2 = l2/16384;
          }
          //rysowanie na komponentach TChart
          Chart1->Series[0]->Add(r2, "", clGreen); 
          Chart2->Series[0]->Add(l2, "", clGreen); 
      }

Funkcja BASS_ChannelGetLevel zwraca wartości z przedziału od 0 do 32768. Chciałbym by wykres był znormalizowany i wyświetlał się tak jak w edytorach dźwięku np. AudaCity czy GoldWave - w związku z tym musi przyjmować wartości od -1 do 1. Jako środek przedziału ustanowiłem więc połowę zwracanego zakresu czyli 16 384 i dokonałem odpowiednich obliczeń, które widać powyżej. Teoretycznie wszystko powinno być dobrze, a jednak wykres rysuje się inaczej niż np. w wyżej wymienionych programach...
Może ktoś będzie mi w stanie pomóc bądź zauważy błąd, którego ja nie mogę jak na razie dostrzec ?

Pozdrawiam.

1

mylisz wykres amplitudy z przebiegiem czasowym. nie ma amplitudy -1.
BASS_ChannelGetLevel zwraca wartość od 0 (cisza) do 32768 (max). możesz to sobie przeskalować do 0..1, ale wartości ujemne nie mają fizycznego sensu, bo nie istnieje dźwięk cichszy niż cisza.

to co masz na myśli mówiąc o edytorach dźwięku, to prawdopodobnie wykres przebiegu (jak z oscyloskopu) a nie wykres amplitudy.

0

Najwidoczniej pomyliłem pojęcia, dzięki za sprostowanie. W takim razie chodzi mi o przebieg czasowy dźwięku.

Podjąłem kolejną próbę - tym razem z funkcją ChannelGetData, która zwraca znormalizowane próbki:

DWORD read;
float r2, l2;
float buffer[2048];
read = BASS_ChannelGetData(Uchwyt, buffer, sizeof(buffer) | BASS_DATA_FLOAT);
          if(read != -1)
          {
                read /= sizeof(float); 
                for (int i=0 ; i<read ; i+=2)
                {
                        l2=buffer[i];                    
                        r2=buffer[i+1];                          // ???
                }
          } 

Wykres rysuje się - przynajmniej na oko - poprawnie :) Nie jestem tylko pewny czy dobrze wyodrębniłem wartości dla lewego i prawego kanału (l2 i r2) ?

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