Hallo,
ich habe es mittlerweile geschafft, die aktuelle Frequenz/Welle oder wie ihr es auch nennen wollt darzustellen.
Ein 440Hz-Sinus-Ton-Darstellung ist im Anhang.
Bitte im Folgenden den Ausdruck "stehende Welle" nicht allzu physikalisch, eher bildlich nehmen
Auf dem angehängten Bild steht die Welle zwar, in meinem Programm (welches diese Werte natürlich andauernd abtastet) verschiebt sich die Welle aber mit jeder Aktualisierung auf der X-Achse.
Ich hätte aber gerne, dass die Welle praktisch steht (was schön wäre, da der Ton ja auch 30s lang einen konstanten 440Hz-Sinus beschreibt).
Hier der verantwortliche Code:
Delphi-Quellcode:
var
WaveData : array [0..2048] of DWORD;
With image2 do
begin
// Ränder zeichnen usw...
// [...]
HalfHeight := Height div 2;
// Anfangspos setzen
Canvas.moveto(0, HalfHeight);
//BASS-Daten abrufen
BASS_ChannelGetData(ReturnPlayingChannel, @WaveData, 2048);
// Daten Zeichnen
for i := 0 to Width do
begin
R := SmallInt(Loword(WaveData[i])); // Rechter Kanal
// Zusammenrechnen der Kanäle + Zoom
YPos := HalfHeight+ trunc((R / 65535) * Height);
Canvas.lineto(i, YPos);
end;
end;
Wie man sehen kann ist das ganze auch nicht auf die Breite des Bildes optimiert (Array 2048 lang, Bild ~ 300px breit), das müsste ich auch noch hinbekommen.
Womit ich auch Probleme habe ist die Größe des Arrays allgemein.
Wenn ich das Array jetzt nur 512 (+1) Werte groß mache, dann sollte man meinen da i nur bis 300 geht -> Bild wird voll mit Sinus ausgefüllt. Aber ab ~ einem Drittel des Bildes ist nur noch ... ja eine Art Rauschen sichtbar.
Wie kann ich die Wellen "stehend" anzeigen?
Wie genau muss ich meine Arraygröße wählen?
Thx,
Flips
Philipp F.