home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / WaveIn_Rec2001136152006.psc / clsDraw.cls < prev    next >
Text File  |  2006-06-15  |  7KB  |  265 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsDraw"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. ' draws a frequency spectrum (Winamp style)
  17. ' and a amplitude curve
  18.  
  19. Private Declare Function FillRect Lib "user32" ( _
  20.     ByVal hdc As Long, _
  21.     lpRect As RECT, _
  22.     ByVal hBrush As Long _
  23. ) As Long
  24.  
  25. Private Declare Function DeleteObject Lib "gdi32" ( _
  26.     ByVal hObject As Long _
  27. ) As Long
  28.  
  29. Private Declare Function CreateSolidBrush Lib "gdi32" ( _
  30.     ByVal crColor As Long _
  31. ) As Long
  32.  
  33. Private Declare Function MoveToEx Lib "gdi32" ( _
  34.     ByVal hdc As Long, _
  35.     ByVal x As Long, _
  36.     ByVal y As Long, _
  37.     ByVal D As Long _
  38. ) As Long
  39.  
  40. Private Declare Function LineTo Lib "gdi32" ( _
  41.     ByVal hdc As Long, _
  42.     ByVal x As Long, _
  43.     ByVal y As Long _
  44. ) As Long
  45.  
  46. Private Declare Function Rectangle Lib "gdi32" ( _
  47.     ByVal hdc As Long, _
  48.     ByVal X1 As Long, _
  49.     ByVal Y1 As Long, _
  50.     ByVal X2 As Long, _
  51.     ByVal Y2 As Long _
  52. ) As Long
  53.  
  54. Private Type RECT
  55.     Left                            As Long
  56.     Top                             As Long
  57.     Right                           As Long
  58.     Bottom                          As Long
  59. End Type
  60.  
  61. Private Const Pi                    As Single = 3.14159265358979
  62.  
  63. Private band(FFT_BANDS - 1)         As Double
  64.  
  65. Private clsFFT                      As clsFourier
  66.  
  67. Public Sub DrawRect( _
  68.     ByVal hdc As Long, _
  69.     ByVal lngLeft As Long, _
  70.     ByVal lngTop As Long, _
  71.     ByVal lngRight As Long, _
  72.     ByVal lngBottom As Long, _
  73.     ByVal lngColor As Long _
  74. )
  75.  
  76.     Dim udtRect As RECT
  77.     Dim hBrush  As Long
  78.  
  79.     With udtRect
  80.         .Left = lngLeft
  81.         .Right = lngRight
  82.         .Top = lngTop
  83.         .Bottom = lngBottom
  84.     End With
  85.  
  86.     hBrush = CreateSolidBrush(lngColor)
  87.     FillRect hdc, udtRect, hBrush
  88.     DeleteObject hBrush
  89. End Sub
  90.  
  91. Public Sub DrawAmplitudes( _
  92.     data() As Integer, _
  93.     picVis As PictureBox _
  94. )
  95.  
  96.     Dim dx              As Long, dy         As Long
  97.     Dim x               As Long, k          As Long
  98.     Dim dy2             As Long
  99.     Dim dc0             As Long
  100.     Dim lngPoints       As Long
  101.     Dim lngMaxAmpl      As Long, lngAmpl    As Long
  102.     Dim dblAmpl         As Double
  103.  
  104.     dx = picVis.ScaleWidth
  105.     dy = picVis.ScaleHeight
  106.     dy2 = dy \ 2
  107.     dc0 = picVis.hdc
  108.  
  109.     picVis.ForeColor = vbBlack
  110.     Rectangle dc0, 0, 0, dx, dy
  111.     picVis.ForeColor = vbWhite
  112.     MoveToEx dc0, 0, dy2, 0
  113.  
  114.     For x = 0 To UBound(data)
  115.         lngAmpl = Abs(CLng(data(x)))
  116.         If lngAmpl > lngMaxAmpl Then
  117.             lngMaxAmpl = lngAmpl
  118.         End If
  119.     Next
  120.  
  121.     'If lngMaxAmpl = 0 Then lngMaxAmpl = 32767
  122.     lngMaxAmpl = 32767
  123.  
  124.     ' points per pixel
  125.     lngPoints = UBound(data) / picVis.ScaleWidth
  126.  
  127.     For x = 1 To picVis.ScaleWidth - 3
  128.         ' average of some points
  129.         dblAmpl = 0
  130.         For k = k To k + lngPoints - 1
  131.             dblAmpl = dblAmpl + data(k)
  132.         Next
  133.  
  134.         ' normalize points
  135.         dblAmpl = (dblAmpl / lngPoints) / lngMaxAmpl
  136.         If dblAmpl > 1 Then
  137.             dblAmpl = 1
  138.         ElseIf dblAmpl < -1 Then
  139.             dblAmpl = -1
  140.         End If
  141.  
  142.         ' draw a line to the new point
  143.         LineTo dc0, x, dblAmpl * (dy2 - 2) + dy2
  144.     Next
  145.  
  146.     ' return to the middle
  147.     LineTo dc0, x + 0, dy2
  148.     LineTo dc0, x + 1, dy2
  149. End Sub
  150.  
  151. Public Sub DrawFrequencies( _
  152.     intSamples() As Integer, _
  153.     picbox As PictureBox _
  154. )
  155.  
  156.     Dim sngRealOut(FFT_SAMPLES - 1) As Single
  157.     Dim sngBand                     As Single
  158.     Dim hBrush                      As Long
  159.     Dim i                           As Long
  160.     Dim j                           As Long
  161.     Dim intRed                      As Integer
  162.     Dim intGreen                    As Integer
  163.     Dim intBlue                     As Integer
  164.     Dim rcBand                      As RECT
  165.  
  166.     If UBound(intSamples) < FFT_SAMPLES - 1 Then Exit Sub
  167.  
  168.     If clsFFT Is Nothing Then
  169.         Set clsFFT = New clsFourier
  170.  
  171.         clsFFT.NumberOfSamples = FFT_SAMPLES
  172.         clsFFT.WithTimeWindow = 1
  173.     End If
  174.  
  175.     For i = 0 To FFT_SAMPLES - 1
  176.         clsFFT.RealIn(i + 1) = intSamples(i)
  177.     Next
  178.  
  179.     ' lower band amplitudes
  180.     For i = 0 To FFT_BANDS - 1
  181.         band(i) = band(i) - FFT_BANDLOWER
  182.         If band(i) < 0 Then band(i) = 0
  183.     Next
  184.  
  185.     ' normalize values and cut them at FFT_MAXAMPLITUDE
  186.     For i = 0 To FFT_SAMPLES / 2
  187.         ' Ausgabe auf [0;1] normalisieren
  188.         sngRealOut(i) = clsFFT.ComplexOut(i + 1) / (FFT_SAMPLES / 4) / 32767
  189.  
  190.         ' cut the output to FFT_MAXAMPLITUDE, so
  191.         ' the spectrum doesn't get too small
  192.         If sngRealOut(i) > FFT_MAXAMPLITUDE Then
  193.             sngRealOut(i) = FFT_MAXAMPLITUDE
  194.         End If
  195.  
  196.         sngRealOut(i) = sngRealOut(i) / FFT_MAXAMPLITUDE
  197.     Next
  198.  
  199.     j = FFT_STARTINDEX
  200.  
  201.     For i = 0 To FFT_BANDS - 1
  202.         ' average for the current band
  203.         For j = j To j + FFT_BANDWIDTH
  204.             sngBand = sngBand + sngRealOut(j)
  205.         Next
  206.  
  207.         ' boost frequencies in the middle with a hanning window,
  208.         ' because they got less power then the low ones
  209.         sngBand = (sngBand * (Hanning(i + 3, FFT_BANDS + 3) + 1)) / FFT_BANDWIDTH
  210.  
  211.         If band(i) < sngBand Then band(i) = sngBand
  212.         If band(i) > 1 Then band(i) = 1
  213.  
  214.         ' skip some bands
  215.         j = j + FFT_BANDSPACE
  216.     Next
  217.  
  218.     ' draw bars
  219.     picbox.Cls
  220.  
  221.     intRed = 255
  222.     intBlue = 50
  223.  
  224.     For i = 0 To FFT_BANDS - 1
  225.         intGreen = (band(i) * 255)
  226.  
  227.         hBrush = CreateSolidBrush(RGB(intRed, intGreen, intBlue))
  228.  
  229.         With rcBand
  230.             .Right = i * (DRW_BARWIDTH + DRW_BARSPACE) + DRW_BARWIDTH + DRW_BARXOFF
  231.             .Left = i * (DRW_BARWIDTH + DRW_BARSPACE) + DRW_BARXOFF
  232.             .Top = max(DRW_BARYOFF, Min(picbox.ScaleHeight, picbox.ScaleHeight - (picbox.ScaleHeight * band(i))) - DRW_BARYOFF) ' - 1)
  233.             .Bottom = picbox.ScaleHeight - DRW_BARYOFF
  234.         End With
  235.         FillRect picbox.hdc, rcBand, hBrush
  236.  
  237.         DeleteObject hBrush
  238.     Next
  239. End Sub
  240.  
  241. Private Function Hanning( _
  242.     ByVal x As Single, _
  243.     ByVal Length As Long _
  244. ) As Single
  245.  
  246.     Hanning = 0.5 * (1 - Cos((2 * Pi * x) / Length))
  247. End Function
  248.  
  249. Private Function Min( _
  250.     ByVal val1 As Long, _
  251.     ByVal val2 As Long _
  252. ) As Long
  253.  
  254.     Min = IIf(val1 < val2, val1, val2)
  255. End Function
  256.  
  257. Private Function max( _
  258.     ByVal val1 As Long, _
  259.     ByVal val2 As Long _
  260. ) As Long
  261.  
  262.     max = IIf(val1 > val2, val1, val2)
  263. End Function
  264.  
  265.