Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Visualiesirung (https://www.delphipraxis.net/108653-visualiesirung.html)

Desmulator 17. Feb 2008 10:46


Visualiesirung
 
HalliHallo,

also ich komme mal direkt zu sache, ich abreite immoment an einer Visualiesirung für Waves, bzw Soundaten. Das heißt das ein Kreis passend zur musik seine größe ändern soll, bei 8bit Mono geht das ja alles ganz gut... nur jetzt habe ich ein problem mit 16 bit.

Mein Ziel ist, einen Kreis (300 px durchmesser maximal) relativ zu den schwinungen zu vergrößern / verkleiner. heißt bei 8 bit :
127 / 256 ( Bei 8 Bit gibt es Maximal 256 tonfrequenzen ) soll der kreis nur halb so groß sein.

Delphi-Quellcode:
  Visual : record
    Center : Word;
    Right : Word;
    Left : Word;
  end;


    { Wenn Mono }
    if WaveEx.nChannels = Mono then begin
      //Position ermitteln
      Stream.Position := Position.sample * ( WaveEx.wBitsPerSample div 8 * WaveEx.nBlockAlign ) + AudioStart;
      //Einlesen
      Stream.Read(Visual.Center,WaveEx.wBitsPerSample div 8);
      //Amplitude anpassen Maximal 300 Pixel und Zentriren
      Amplitude := round(( Visual.Center / WaveEx.wBitsPerSample * WaveEx.nBlockAlign ) * 300 - 150);
      if Amplitude < 0 then
        Amplitude := 0;
      //Position berechnen
      DrawXYPos := 300; //Position
      DrawXYPos := DrawXYPos - round(Amplitude / 2);
      //Kreiszeichnen
      VisualWnd.Canvas.Pen.Color := RGB(Random(255),Random(255),Random(255));
      VisualWnd.Canvas.Ellipse(bounds(DrawXYPos,DrawXYPos,Amplitude,Amplitude)); //Der Kreis wird einfach drüber gemalt
    end;
So aber Irgendwie will der net, was muss ich ändern?

3_of_8 17. Feb 2008 11:05

Re: Visualiesirung
 
Bei 8 Bit soll es maximal 256 Tonfrequenzen geben? Ich würde eher sagen, die Anzahl der Frequenzen ist unendlich groß. Egal, welche Auflösung die Abtastwerte haben.

Desmulator 17. Feb 2008 11:20

Re: Visualiesirung
 
-?-

ein von uns beiden hat dan was flasch verstanden :?

Also bei 8 BitsPerSample kann man maximal 256 ton unterschiede darstellen?
Und bei 16 BitsPerSampel sind es dan 2 hoch 16 als 65536 unterschiede...

Sonst wäre die Quallität ja nicht so schlecht wenn man nur 8 Bits hat ? :wall:

3_of_8 17. Feb 2008 11:46

Re: Visualiesirung
 
Das sind die Abstufungen der Abtastwerte. Frequenzen sind was ganz anderes. Gedankenbeispiel: Du kannst eine beliebig große Frequenz darstellen, wenn du die Abtastwerte nur langsam genug steigen lässt.

Jede Frequenz v lässt sich darstellen als Funktion f(x)=sin (vs).

Du kannst also jede Frequenz in diskreten Abtastwerten so speichern:
Delphi-Quellcode:
for I:=0 to high(Buffer) do
  Buffer[I]:=round(sin(I/SAMPLERATE*FREQUENCY))*MAXVALUE;
SAMPLERATE ist hierbei die Samplingrate, also die Anzahl Abtastwerte pro Sekunde und MAXVALUE ist der Wert, der für vollen Ausschlag steht (bei 8 Bit 127, bei 16 Bit 32767). FREQUENCY ist, natürlich, die Frequenz, die der Ton darstellen soll.

Wie du siehst, ist die Menge der darstellbaren Frequenzen völlig unabhängig von der Auflösung der einzelnen Samples. Die Auflösung bestimmt nur, wie groß die "Artefakte" sind. Ein 8 Bit-Sample kann einen Wert natürlich nicht so genau darstellen wie ein 16 Bit-Sample.

Desmulator 17. Feb 2008 11:51

Re: Visualiesirung
 
:wall: ja kalr natrülich hast du recht... ich hab die ganzezeit die amplitude ( also lautstärke -?- ) mit der frequenz frequenz verwechslet... naatrülich kann ich die frequenz so groß machen wie ich will...

also der Kreis soll passent zu amliotude also dem ausschlag seine größe ändern

Desmulator 17. Feb 2008 12:45

Re: Visualiesirung
 
Delphi-Quellcode:
    if WaveEx.nChannels = Mono then begin
      //Position ermitteln
      Stream.Position := Position.sample * ( WaveEx.wBitsPerSample div 8 * WaveEx.nBlockAlign ) + AudioStart;
      //Einlesen ( ein Sample )
      Stream.Read(Visual.Center,2);
      //Amplitude anpassen Maximal 300 Pixel und Zentriren
      Amplitude := Trunc(Power( 2 ,WaveEx.wBitsPerSample)); //Maximum
      Amplitude := round(( Visual.Center / Amplitude) * CricleSize); //Relativ zu 300
      Amplitude := Amplitude - ( CricleSize div 2 );

      //Wenn Unter 0
      if Amplitude < 0 then
        Amplitude := 0;//Amplitude * -1; // Positiv machen
      //Position berechnen
      DrawXYPos := 300; //Position
      DrawXYPos := DrawXYPos - round(Amplitude / 2);
      //Kreiszeichnen
      VisualWnd.Canvas.Pen.Color := RGB(Random(255),Random(255),Random(255));
      VisualWnd.Canvas.Ellipse(bounds(DrawXYPos,DrawXYPos,Amplitude,Amplitude));

    end;
Wenn ich es nun 8bit- samples abspielen lasse, funktiert es, jedoch macht er bei 16bit einfach irgendwas und hängt sich schließlich auf... wo ist der fehler?

SnuffMaster23 17. Feb 2008 13:17

Re: Visualiesirung
 
Hats vielleicht damit zu tun dass die 8 Bit unsigned und die 16 Bit signed sind?

8 Bit: 0 Vollausschlag nach unten, 127 kein Ausschlag, 255 Vollausschlag nach oben
16 Bit: -32768 Vollausschlag nach unten, 0 kein Auschlag, 32767 Vollausschlag nach oben

Desmulator 20. Feb 2008 19:53

Re: Visualiesirung
 
Nun ich denke mal des es vom endgültiken datentüp abhengt ob die werte negativ oder positiv sind...

da ich die 16bit als Word und nicht als SmallInt einlese, dürfte es daran nicht liegen...

Delphi-Quellcode:
 0       0         
 .      .
 .      .
 .      .
255    65536

SnuffMaster23 21. Feb 2008 03:32

Re: Visualiesirung
 
öhm doch^^
Stichwort Zweierkomplement
Du kannst die nicht einfach als unsigned betrachten und alles ist gut. :D
Die sind dann zwar positiv, aber die Werte liegen woanders.

z.B -1: Bitfolge 11111...111
macht signed eben -1, unsigned aber 65535 und nicht 32766 wie du es erwartest


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz