Private Sub Visualization_Timer()
Static Max(255) As Integer, Avg(255) As Integer, Curs(255) As New Collection, Maxs(255) As New Collection
Dim A As Integer, B As Byte, Cur(255) As Long, tMax(255) As Long, Bigger As Long, Smaller As Long
Static C As Integer, D As Boolean, Mover(255) As Long
Dim Red As Integer, Green As Integer, Blue As Integer, Soften As Single, NewTop As Integer
On Error Resume Next
If MyMedia.VideoWidth > 1 Then Exit Sub
Visualization.Enabled = False
Visual.Update
For A = 0 To 255
Cur(A) = CInt(Abs(CLng(Visual.GetData(A)) + CLng(Visual.GetData(A + 1))) / 2)
If Cur(A) > Max(A) Then Max(A) = Cur(A)
If Cur(A) Then Avg(A) = CInt((CLng(Avg(A)) + CLng(Cur(A))) / 2)
Cur(A) = Cur(A) + Avg(A) / 2
If Cur(A) < 0 Then Cur(A) = 0
tMax(A) = Max(A) + Avg(A) / 2
If tMax(A) = 0 Then tMax(A) = 1
Curs(A).Add Cur(A)
Maxs(A).Add tMax(A)
If Curs(A).Count > 10 Then Curs(A).Remove 1
If Maxs(A).Count > 10 Then Maxs(A).Remove 1
Smaller = 0
Bigger = 0
For B = 1 To Curs(A).Count
Soften = Abs(1 + (B - Curs(A).Count / 2) / 50)
Smaller = Smaller + Val(Curs(A).Item(B)) * Soften
Bigger = Bigger + Val(Maxs(A).Item(B)) * Soften
Next B
Red = 384 / Bigger * Smaller
Blue = (768 + (Rnd * 256)) / Bigger * Smaller
Green = (512 + (Rnd * 64)) / Bigger * Smaller
If Red < 0 Then Red = 0
If Green < 0 Then Green = 0
If Blue < 0 Then Blue = 0
If Red > 255 Then Red = 255
If Green > 255 Then Green = 255
If Blue > 255 Then Blue = 255
Mover(A) = Mover(A) * 0.5 + (Max(A) - Avg(A) + 1) / (Cur(A) + 1) * 10
If Mover(A) > VisBG.ScaleHeight Or Mover(A) = 0 Then Mover(A) = VisBG.ScaleHeight
BitBlt VisBG.hdc, NewTop, 0, VisBG.ScaleWidth / 256 + 1, VisBG.ScaleHeight / Mover(A) * (Mover(A) - 1), VisBG.hdc, NewTop, VisBG.ScaleHeight / Mover(A), vbSrcCopy
SetPixel VisBG.hdc, NewTop, VisBG.ScaleHeight - 1, RGB(CByte(Red), CByte(Green), CByte(Blue))
StretchBlt VisBG.hdc, NewTop, VisBG.ScaleHeight / Mover(A) * (Mover(A) - 1), VisBG.ScaleWidth / 256 + 1, VisBG.ScaleHeight / Mover(A), VisBG.hdc, NewTop, VisBG.ScaleHeight - 1, 1, 1, vbSrcCopy
NewTop = NewTop + VisBG.ScaleWidth / 256 + 1
If NewTop > Video.ScaleWidth Then Exit For
Next A
If D Then
C = C - 1
If C < 1 Then C = 0: D = False
Else
C = C + 1
If C > 254 Then C = 255: D = True
End If
VisBG.Refresh
BitBlt Video.hdc, 0, 0, Video.ScaleWidth, Video.ScaleHeight, VisBG.hdc, 0, 0, vbSrcCopy
Video.CurrentX = 5
Video.CurrentY = Video.ScaleHeight - Video.TextHeight(Playlist.Tag) - 2
Video.Print Playlist.Tag
Video.Refresh
Visualization.Enabled = True
End Sub