Hallo
Hier mal meine FFT Routine..
Delphi-Quellcode:
function BASS_WMPVIS_Render(channel: DWORD): boolean; stdcall;
BASS_ChannelGetData(channel, Data32, FFTSize or
DWORD(IfThen(ChanInfo.chans = 2,
BASS_DATA_FFT_INDIVIDUAL)));
if (ChanInfo.chans = 2) then
begin
for i := 0 to 1023 do
try
begin
VisData^.frequency[0, i] :=
Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
Inc(Data32Pos, FFT_SkipCount);
VisData^.frequency[1, i] :=
Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
Inc(Data32Pos, FFT_SkipCount);
end;
except
Result := false;
exit;
end;
end
else
begin
for i := 0 to 1023 do
begin
VisData^.frequency[0, i] :=
Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
VisData^.frequency[1, i] :=
VisData^.frequency[0, i];
Inc(Data32Pos, FFT_SkipCount);
end;
end;
FreeMem(Data32);
try
_IWMPEffects.Render(VisData^, BassWMPVis1.ContainerHdc, pRect);
except
Result := false;
exit;
end;
Result := true;
BassFuncs^.SetError(BASS_OK);
exit;
end;
Result := False;
BassFuncs^.SetError(BASS_ERROR_MEM);
end;
Mein Problem ist nun das in dieser schleife bedingt durch TimedLevel
nur 1024 samples übergeben werden können.
Delphi-Quellcode:
if (ChanInfo.chans = 2) then
begin
for i := 0 to 1023 do
try
begin
VisData^.frequency[0, i] :=
Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
Inc(Data32Pos, FFT_SkipCount);
VisData^.frequency[1, i] :=
Max(0, Min(1023, (Trunc(Power(Data32Pos^, FFTSAmplification) * 1023))));
Inc(Data32Pos, FFT_SkipCount);
end;
Im Original Quelltext wird aber ein VariablesArray erstellt
TimedLvl.frequency = new byte[2048];
in dem nun unabhängig von TimedLevel die Daten ausgelesen werden können.
Wie kann ich in meiner schleife den rechten Kanal trotzdem auslesen und die samples
von 1024 to 2048 übergeben damit kein rangecheck error auftritt ?
Code:
// The first value is the
DC component so we'll skip it and start at index 1
for (int i = 1; i < 1024; i++)
{
try
{
float val = (fft[i] * 255);
if (val < 0)
val = 0;
if (val > 255)
val = 255;
audioData[i] = (byte)val;
audioData[i + 1024] = (byte)val;
}
catch (
Exception ex)
{
Console.WriteLine("
Exception occurred at index {0}", i);
return false;
}
}
return true;
Zur zeit sieht es so aus das rechts und links die gleichen Daten übergeben werden.
Und seltsamer weise (wohl bedingt durch den rechten Kanal) einige Samples bei einigen Plugins fehlen.
Das sieht dann so aus siehe PIC die hellgrüne grundläsche die frei ist.
Müßte eigentlich mit Samples belegt sein.
Gruss Emil