-   
-   
- _TITLE "Celebrate your programming language with music!" 
-   
-   
-   
- INPUT "Insert WAV audio file (16 bit, stereo) name:"- ; file$ 
 
- CONST-  CACHE  = 441 '             minimal detected frequency for analyzer is 100 Hz, so this is enought value (with 44100 biterate)
 
-     subchunksize  AS LONG '      4 bytes  (lo / hi), $00000010 for PCM audio
-     format  AS STRING * 2 '      2 bytes  (0001 = standard PCM, 0101 = IBM mu-law, 0102 = IBM a-law, 0103 = IBM AVC ADPCM)
-     channels  AS INTEGER '       2 bytes  (1 = mono, 2 = stereo)
-     rate  AS LONG '              4 bytes  (sample rate, standard is 44100)
-     ByteRate  AS LONG '          4 bytes  (= sample rate * number of channels * (bits per channel /8))
-     Block  AS INTEGER '          2 bytes  (block align = number of channels * bits per sample /8)
-     Bits  AS INTEGER '           2 bytes  (bits per sample. 8 = 8, 16 = 16)
-     subchunk2  AS STRING * 4 '   4 bytes  ("data")  contains begin audio samples
-   
-   
-   
-   
-   
-   
-   
-   
-   
-   
-   
- 'REDIM scache(CACHE) AS ....  FLOAT can not be used, because is for decimaly numbers only, but program need integer values OR decimaly values! 
-   
-     'next for analyzer use 
-   
- REDIM-  sour (62) AS-  Sour  ' for visualisation
 
-   
-   
-   
- block = H.Block 
- RATE = H.rate 
- chan = H.channels 
- bits = H.Bits 
-   
- IF-  bits  <> 16 OR-  chan  <> 2 THEN BEEP- :  PRINT "QB64 limit: Your WAV format is "- ; bits;  " bits and "- ; chan;  " channels. For replaying it comment row 106 and set valid type on row 77."- :  SLEEP 3- :  SYSTEM
 
- 'STUPID BASIC LIMITS... 
-   
-   
-   
-   
- ToScreen = 1 / 1256 '3140 
-   
-   
- '---- This work NOT under QB64v1.3-------------------------  Please comment row 77 for verify! 
- '---------------------------------------------------------- 
-   
-     FrekvLeft = 0 
-     FrekvRight = 0 
-         f = f + 1 
-         lef = scache(P).Left 
-         IF-  chan  = 1 THEN-  righ  =-  lef  ELSE-  righ  =-  scache (- P )- .Right 
 
-                 lef = lef / 256 
-                 righ = righ / 256 
-                 lef = lef / RATE 
-                 righ = righ / RATE 
-             CASE 32 'values are the same (tested) 
-   
-         IF-  RATE  > 44100 THEN-  frekvence  =-  RATE  ELSE-  frekvence  = 44100
 
-         FOR-  plll  = 1 TO-  frekvence  /-  RATE 
 
-   
-         CurrentMovementL = WaveMovement(lef, lf) 
-         CurrentMovementR = WaveMovement(righ, rf) 
-         IF-  OldMovementL  = 0 THEN-  OldMovementL  =-  CurrentMovementL 
 
-         IF-  OldMovementR  = 0 THEN-  OldMovementR  =-  CurrentMovementR 
 
-         IF-  OldMovementL  <>-  CurrentMovementL  THEN-  OldMovementL  =-  CurrentMovementL: FrekvLeft  =-  FrekvLeft  + 1
 
-         IF-  OldMovementR  <>-  CurrentMovementR  THEN-  OldMovementR  =-  CurrentMovementR: FrekvRight  =-  FrekvRight  + 1
 
-   
-         lf = lef 
-         rf = righ 
-   
-   
-   
-   
- DrawTo: 
- IF-  lef  >= -1 AND-  lef  <= 1 THEN 'comment this two IF conditions for show, what ON TIMER then do.
 
-   
-             k = 0 
-             COLOR &HFFFFFF00 ', &HFFAA56D7 
-                 LINE (- EqL  + 700, 600)-(- EqL  + 708, 700), _RGB32(255),-  B  'right
 
-                 lenght = U(ff).L1 
-                 lenght2 = U(ff).L2 
-   
-                 IF-  lenght  > 95 THEN-  lenght  = 95
 
-                 IF-  lenght2  > 95 THEN-  lenght2  = 95
 
-   
-                 U(ff).L1 = 0 
-                 U(ff).L2 = 0 
-   
-                 IF-  lenght  >-  U (- ff )- .max1  THEN-  U (- ff )- .max1  =-  lenght 
 
-                 IF-  lenght  >-  U (- ff )- .X  THEN-  U (- ff )- .X  =-  lenght 
 
-                 IF-  lenght2  >-  U (- ff )- .max2  THEN-  U (- ff )- .max2  =-  lenght2 
 
-                 IF-  lenght2  >-  U (- ff )- .Y  THEN-  U (- ff )- .Y  =-  lenght2 
 
-   
-   
-                     IF-  U (- ff )- .X  <= 0 THEN-  U (- ff )- .X  = 0- : U (- ff )- .t  = 0- : U (- ff )- .max1  = 0
 
-                     IF-  U (- ff )- .max1  --  U (- ff )- .X  > 6 THEN-  U (- ff )- .max1  = 0
 
-                     IF-  U (- ff )- .Y  <= 0 THEN-  U (- ff )- .Y  = 0- : U (- ff )- .t2  = 0- : U (- ff )- .max2  = 0
 
-                     IF-  U (- ff )- .max2  --  U (- ff )- .Y  > 6 THEN-  U (- ff )- .max2  = 0
 
-   
-   
-   
-                 IF-  U (- ff )- .X  > 0 AND-  U (- ff )- .max1  THEN LINE (100 +-  ff  * 10, 700 --  U (- ff )- .max1  - 5)-(100 + (- ff  * 10) + 8, 700 --  U (- ff )- .max1 ), &HFFFF0000,-  BF 
 
-                 IF-  U (- ff )- .Y  > 0 AND-  U (- ff )- .max2  THEN LINE (800 +-  ff  * 10, 700 --  U (- ff )- .max2  - 5)-(800 + (- ff  * 10) + 8, 700 --  U (- ff )- .max2 ), &HFFFF0000,-  BF 
 
-   
-                 LINE (100 +-  ff  * 10, 700)-(100 + (- ff  * 10) + 8, 700 --  U (- ff )- .X ), ,-  BF 
 
-                 LINE (800 +-  ff  * 10, 700)-(800 + (- ff  * 10) + 8, 700 --  U (- ff )- .Y ), ,-  BF 
 
-             I = 0 
-   
-   
-   
-         lfV = (lef * 150) 
-         riV = (righ * 150) 
-   
-         X  =-  MiddleX  + SIN(- k ) *-  Radius  +-  lfV 
-         Y  =-  MiddleY  + COS(- k ) *-  Radius  +-  riV 
-         sour(I).X = X 
-         sour(I).Y = Y 
-         I = I + 1 
-   
-                     oX = sour(D - 1).X 
-                     oY = sour(D - 1).Y 
-                     nX = sour(D).X 
-                     nY = sour(D).Y 
-                 oX = sour(0).X 
-                 oY = sour(0).Y 
-                 nX = sour(62).X 
-                 nY = sour(62).Y 
-                     oX = sour(D - 1).X 
-                     oY = sour(D - 1).Y 
-                     nX = sour(D).X 
-                     nY = sour(D).Y 
-   
-                     iiX  =-  mIx  + SIN(- D  / 10) *-  mIx 
-                     iiY  =-  mIh  + COS(- D  / 10) *-  mIh 
-                     oiX  =-  mIx  + SIN((- D  - 1) / 10) *-  mIx 
-                     oiY  =-  mIh  + COS((- D  - 1) / 10) *-  mIh 
-                     _MAPTRIANGLE (- iiX ,-  iiY )-(- oiX ,-  oiY )-(- mIx ,-  mIh ),-  image&  TO(- oX ,-  oY )-(- nX ,-  nY )-(- mmIx ,-  mmiY ),-  Virtual& 
 
-                 oX = sour(0).X 
-                 oY = sour(0).Y 
-                 nX = sour(62).X 
-                 nY = sour(62).Y 
-   
-                 oiX  =-  mIx  + SIN(6.2) *-  mIx 
-                 oiY  =-  mIh  + COS(6.2) *-  mIh 
-                 _MAPTRIANGLE (- iiX ,-  iiY )-(- oiX ,-  oiY )-(- mIx ,-  mIh ),-  image&  TO(- oX ,-  oY )-(- nX ,-  nY )-(- mmIx ,-  mmiY ),-  Virtual& 
 
-   
-   
-         text$ = "Example how visualise music in QB64.    Writed Petr Preclik." 
-   
-   
- analyzer: 
- FrekvL = FrekvLeft * 100: lf = 0 
- FrekvR = FrekvRight * 100: rf = 0 
-   
- U(sh).L1 = U(sh).L1 + .09 
-   
-   
- U(sh2).L2 = U(sh2).L2 + .09 
-   
- FUNCTION-  WaveMovement  (- New_Value ,-  Old_Value ) ' Tested with WAV from 100 Hz to 20 KHz and return correct outputs (see row 156 to 164, previous signal values on row 163, 164 are needed)
 
-     IF-  New_Value  >-  Old_Value  THEN-  WaveMovement  = 1
 
-     IF-  New_Value  <-  Old_Value  THEN-  WaveMovement  = -1
 
-