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:
private
{ Private declarations }
values: array of array [0 .. 1] of Byte;
Delphi Code:
procedure TMainForm.GetWaveForm;
var
dx, dy, Summ, Sump: Int64;
i, l, l1, x, acc: Integer;
Buf: array [0 .. 1023] of Byte;
begin
SetLength(values, Image1.Picture.Width);
FillChar(values[0], Length(values) * 2, 0);
AudioConverter1.Reset;
AudioConverter1.Init;
dx := AudioConverter1.Size;
dy := Image1.Width;
x := 0;
Summ := 0;
Sump := 0;
acc := 0;
while true do
begin
l := 0;
repeat
l1 := AudioConverter1.CopyData(@Buf[l], 1024 - l);
inc(l, l1);
until (l1 = 0) or (l = 1024);
if l = 0 then
Break;
for i := 0 to l - 1 do
begin
Dec(dx, dy);
if Buf[i] >= 128 then
inc(Sump, Buf[i])
else
inc(Summ, Buf[i]);
inc(acc);
if dx <= 0 then
begin
values[x][0] := Summ div acc;
values[x][1] := Sump div acc;
inc(x);
Summ := 0;
Sump := 0;
acc := 0;
inc(dx, AudioConverter1.Size);
end;
end;
end;
AudioConverter1.Flush;
end;
procedure TMainForm.DrawGraph;
var
i, k: Integer;
begin
for i := 0 to Length(values) - 1 do
begin
k := i * TrackBar1.Max div Image1.Picture.Width;
if (k >= TrackBar1.Position) and (k <= TrackBar2.Position) then
Image1.Canvas.Pen.Color := sSkinManager1.GetGlobalFontColor; // $808080;
if DXAudioOut1.Status = tosPlaying then
if (k >= TrackBar1.Position) and
(k <= TrackBar1.Position + (DXAudioOut1.Progress * (TrackBar2.Position -
TrackBar1.Position) div 100)) then
Image1.Canvas.Pen.Color := sSkinManager1.GetActiveEditColor;
Image1.Canvas.MoveTo(i, Round((values[i][0] / 48) * (Image1.Height)) - 48);
Image1.Canvas.LineTo(i, Round((values[i][1] / 48) * (Image1.Height)) - 48);
end;
end;
Bookmarks