Results 1 to 15 of 15

Thread: Probleem: Waveform (met NewAc)

  1. #1

    Probleem: Waveform (met NewAc)

    Voor mijn programma (zie BWF-draadje) wil ik een waveform laten zien. Om geluiden af te spelen, gebruik ik NewAc van Andrei Borovsky. Bij de demo's zit een aardig voorbeeldje van hoe je een waveform kunt laten zien. Het werkt prima, maar niet met bestanden die een hogere sample rate dan 44100 Hz hebben. Dan krijg je bagger te zien. Ik zie volgens mij iets over het hoofd waardoor je hogere waarden krijgt (zie screenshot). Wie ziet de "fout"?

    Dit zijn de twee procedures die de waveform maken en teken.

    Delphi Code:
    1. private
    2.     { Private declarations }
    3.     values: array of array [0 .. 1] of Byte;

    Delphi Code:
    1. procedure TMainForm.GetWaveForm;
    2. var
    3.   dx, dy, Summ, Sump: Int64;
    4.   i, l, l1, x, acc: Integer;
    5.   Buf: array [0 .. 1023] of Byte;
    6. begin
    7.   SetLength(values, Image1.Picture.Width);
    8.   FillChar(values[0], Length(values) * 2, 0);
    9.   AudioConverter1.Reset;
    10.   AudioConverter1.Init;
    11.   dx := AudioConverter1.Size;
    12.   dy := Image1.Width;
    13.   x := 0;
    14.   Summ := 0;
    15.   Sump := 0;
    16.   acc := 0;
    17.   while true do
    18.   begin
    19.     l := 0;
    20.     repeat
    21.       l1 := AudioConverter1.CopyData(@Buf[l], 1024 - l);
    22.       inc(l, l1);
    23.     until (l1 = 0) or (l = 1024);
    24.     if l = 0 then
    25.       Break;
    26.     for i := 0 to l - 1 do
    27.     begin
    28.       Dec(dx, dy);
    29.       if Buf[i] >= 128 then
    30.         inc(Sump, Buf[i])
    31.       else
    32.         inc(Summ, Buf[i]);
    33.       inc(acc);
    34.       if dx <= 0 then
    35.       begin
    36.         values[x][0] := Summ div acc;
    37.         values[x][1] := Sump div acc;
    38.         inc(x);
    39.         Summ := 0;
    40.         Sump := 0;
    41.         acc := 0;
    42.         inc(dx, AudioConverter1.Size);
    43.       end;
    44.     end;
    45.   end;
    46.   AudioConverter1.Flush;
    47. end;
    48.  
    49.  
    50. procedure TMainForm.DrawGraph;
    51. var
    52.   i, k: Integer;
    53. begin
    54.   for i := 0 to Length(values) - 1 do
    55.   begin
    56.     k := i * TrackBar1.Max div Image1.Picture.Width;
    57.     if (k >= TrackBar1.Position) and (k <= TrackBar2.Position) then
    58.       Image1.Canvas.Pen.Color := sSkinManager1.GetGlobalFontColor; // $808080;
    59.     if DXAudioOut1.Status = tosPlaying then
    60.       if (k >= TrackBar1.Position) and
    61.         (k <= TrackBar1.Position + (DXAudioOut1.Progress * (TrackBar2.Position -
    62.         TrackBar1.Position) div 100)) then
    63.         Image1.Canvas.Pen.Color := sSkinManager1.GetActiveEditColor;
    64.     Image1.Canvas.MoveTo(i, Round((values[i][0] / 48) * (Image1.Height)) - 48);
    65.     Image1.Canvas.LineTo(i, Round((values[i][1] / 48) * (Image1.Height)) - 48);
    66.   end;
    67. end;
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	impulsen.jpg 
Views:	217 
Size:	52.3 KB 
ID:	5446  

  2. #2
    Senior Member Ruud123's Avatar
    Join Date
    Sep 2007
    Location
    Leerdam
    Posts
    536
    Misschien is het handig om de source van het testprojectje hier te plaatsen?
    Dan hebben we meteen de properties van de trackbars etc.
    Ik krijg nu een fout in: values[x][0] := Summ div acc;
    Jammer dat de maker van NewAC gestopt is met het support op zijn spullen; er zitten helaas een aantal bugs in heb ik gemerkt, maar op zich zijn zijn componenten prima voor audiotoepassingen.
    O ja, ik heb ook geen sSkinManager, maar die waardes zijn natuurlijk eenvoudig te vervangen door standaardkleuren.

    Edit: was vergeten de properties van Audioconverter1 in te stellen! (Met de source erbij was dit ook geen probleem geweest.)
    Last edited by Ruud123; 14-May-11 at 16:31. Reason: Vergeten de juiste properties in te stellen

  3. #3
    Hier is het demoprojectje.
    Attached Files Attached Files

  4. #4
    Misschien dat we hier het NewAc-pakket kunnen neerzetten en updaten. Er zijn hier vast mensen die verstand hebben van audio en die aan dat pakket willen sleutelen.

  5. #5
    Senior Member Ruud123's Avatar
    Join Date
    Sep 2007
    Location
    Leerdam
    Posts
    536
    Ik wil vanzelfsprekend niemand 'pushen' , maar volgens mij is VideoRipper een behoorlijke audio-specialist en ik meen ooit op een screenshotje gezien te hebben dat hij ook NewAC gebruikte, of in elk geval op zijn PC had staan.
    Dus misschien is h?¡j wel de juiste man...

  6. #6
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik heb NewAC volgens mij ooit eens geïnstalleerd (jaren terug), maar was niet helemaal
    tevreden over de implementatie, dus daarna nooit meer naar gekeken.

    Voor zover ik mij kan herinneren is NewAC niets meer dan een schil rond de ACM (Audio
    Compression Manager) van Wndows zelf; wanneer data dus niet goed wordt gedecodeerd,
    dan kan dit betekenen dat de ACM-codec voor die compressiemethode het formaat niet
    ondersteund (maar bijvoorbeeld alleen tot 44.1 of 48kHz) of dat de implementatie van het
    VCL-component geen rekening houdt met exotische (niet huis-tuin-en-keuken) samplerates.

    ...Enkele minuten later...

    Na wat dingen geprobeerd te hebben, lijkt het erop dat geen enkele ACM codec samplerates
    boven de 44.1kHz ondersteunt; het is tenslotte al een verouderd systeem...
    Mijn Theatron Agrippa ondersteunt wél formaten tot 24 bit en 96kHz, maar ik kan met geen
    mogelijkheid iets afspelen over ACM terwijl dit wel lukt over DirectSound.

    Click image for larger version. 

Name:	acmprops.png 
Views:	154 
Size:	28.7 KB 
ID:	5448

    Mijn conclusie is dus dat de ACM codecs zelf gewoon de limiterende factor zijn.
    De oplossng is dus om gebruik te maken van DirectSound, of een externe engine als BASS
    of FMOD voor de decodering.

    Bij ongecomprimeerde (PCM) audio kun je uiteraard zelf alles direct tekenen vanuit de data,
    aangezien daar geen decodering aan te pas komt.

    Greetz,

    Peter.
    Last edited by VideoRipper; 15-May-11 at 03:03.
    TMemoryLeak.Create(Nil);

  7. #7
    Quote Originally Posted by VideoRipper View Post
    Bij ongecomprimeerde (PCM) audio kun je uiteraard zelf alles direct tekenen vanuit de data,
    aangezien daar geen decodering aan te pas komt.
    Daar had ik het ook over. Mijn code bevat een fout waardoor hogere resoluties niet goed weergegeven worden.

  8. #8
    Maar ik denk dat het voor mij toch verstandiger is om weer terug te gaan naar BASS omdat NewAc niet meer geupdate wordt.

  9. #9
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ah... dan heb ik mij laten afleiden door dat AudioConvertor1-component: je wilt
    tenslotte helemaal niets converteren (naar PCM)

    Quote Originally Posted by Yuroun View Post
    terug te gaan naar BASS
    Nou... wanneer je toch alleen maar PCM data wilt laten zien, dan zou ik het toch
    zelf doen; ook al is BASS/FMOD maar klein van stuk, de data is tenslotte
    al gewoon voor handen (en met de RIFFUnit weet je ook wat de eigenschappen
    van deze data zijn)

    Het wordt uiteraard anders wanneer een sample is gecodeerd met MPEG Layer I/II
    (wat ook is toegestaan in het BWF formaat); je zult dan niet om een decoder
    heen kunnen

    Het is dat ik zo dadelijk weg moet, maar wanneer ik weer terug ben zal ik kijken
    of ik iets in elkaar kan fratsen voor de weergave van een PCM golfvorm.

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  10. #10
    Quote Originally Posted by VideoRipper View Post
    Ah... dan heb ik mij laten afleiden door dat AudioConvertor1-component: je wilt
    tenslotte helemaal niets converteren (naar PCM)
    Dat componentje zat er tussen als een tussenstation om wel gecomprimeerde wav's, flac's etc. weer te gegeven. Mijn programma werkt met zuivere wav's in eerste instantie, maar moet later ook de gecomprimeerde bestanden kunnen verwerken.

    Quote Originally Posted by VideoRipper View Post
    Het is dat ik zo dadelijk weg moet, maar wanneer ik weer terug ben zal ik kijken
    of ik iets in elkaar kan fratsen voor de weergave van een PCM golfvorm.
    Bij de BASS-demo's zit een aardig voorbeeldje, maar als je toch wil knutselen is het interessanter om een spectrum te laten zien dan een waveform. Vergelijk onderstaande screenshot's (van dezelfde sample) maar eens. Een spectrum zegt veel meer dan een waveform.
    Attached Thumbnails Attached Thumbnails Click image for larger version. 

Name:	spectrum.jpg 
Views:	163 
Size:	19.5 KB 
ID:	5449   Click image for larger version. 

Name:	waveform.jpg 
Views:	213 
Size:	62.7 KB 
ID:	5450  

  11. #11
    Senior Member Ruud123's Avatar
    Join Date
    Sep 2007
    Location
    Leerdam
    Posts
    536
    Ik heb ooit eens een waveform display gemaakt in BASS, maar het weergeven van een lange MP3 file kostte dan toch vrij veel tijd. Het enige alternatief leek de waveform éénmalig te berekenen en op te slaan (zoals veel programma's doen als b.v. *.pk) met dezelfde naam als de audiofile, en deze de volgende keer te gebruiken. WAV was vele malen sneller in te lezen; daarbij was het mogelijk de grafische weergave 'real time' te doen. Hoe dan ook: ik volg dit topic met zeer grote belangstelling!

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik denk dat hetvolgende scenario in Yuroun's geval het eenvoudigst is:
    • Bereken/teken eenmalig de waveform of het spectrum op een bitmap met een vaste
      breedte en hoogte (iets groter dan nodig misschien)
    • Sla deze bitmap (al dan niet gecomprimeerd als PNG oid) op in de dataset
    • Bij het ophalen/laten zien in de applicatie scale je de bitmap op de juiste grootte in
      het waveform/spectrum veld van de applicatie (met antialias filter om harde randjes te
      voorkomen)
    In feitte heb je dan "Een soort van" .pk bestand; je kunt er alleen niet echt op inzoomen

    Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  13. #13
    Met een beetje googlen ben uitgekomen op een mooie, redelijk snelle Waveform display component voor BASS: http://www.3delite.hu/Object%20Pasca...display3d.html

    Het maakt wel gebruik van DirectX9 en DirectSound.

    Het is freeware voor niet-commerciëel gebruik.
    Last edited by Yuroun; 16-May-11 at 14:13.

  14. #14
    Hi guys, I've been browsing net searching information about this "AudioConverter1.Flush" command and now I see you recommend BASS and FMOD. Can you tell me, are this libraries for Delphi 7 (I use Windows XP 32 bit) and where can I find their homepage and download them? Is it possible to get the libraries for such old system? Thank you for interestiong disscusion and the code/attachments which has been uploaded.

  15. #15
    BASS you can find and download from un4seen

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •