OPEN "voltage.dat"  FOR OUTPUT AS #1
OPTION EXPLICIT 
#INCLUDE ONCE "fmod.bi" 
' Init constants for FMOD 
CONST FALSE = 0 
CONST BUFFERSIZE = 2^15 
CONST BUFFERBYTES = BUFFERSIZE * 2 
IF( FSOUND_Init(44100, 32, 0) = FALSE ) THEN 
   PRINT "Can't initialize FMOD" 
   END 1 
END IF 

DIM AS INTEGER Rec_Buffer 
' for sample lock 
DIM s_ptr1 AS SHORT PTR 
DIM s_ptr2 AS SHORT PTR 
DIM offset AS INTEGER 
DIM length AS INTEGER 
DIM s_len1 AS UNSIGNED INTEGER 
DIM s_len2 AS UNSIGNED INTEGER 
DIM i AS INTEGER 
DIM c AS INTEGER 
DIM f AS INTEGER 

DIM AS INTEGER itr,cycles 
DIM AS DOUBLE t 
DIM AS DOUBLE k,h,g
DIM AS DOUBLE s
DIM AS DOUBLE sin1
DIM AS DOUBLE cos1
DIM AS DOUBLE max
DIM AS DOUBLE min
DIM AS DOUBLE DC
dim as Double x (1000)
dim as Double y2 (1000)
DIM j AS DOUBLE 
DIM y AS INTEGER 
' This is the amount of bytes behind the 
' record cursor that we want to lock. 
' Each sample is 2 bytes, so we want 
' to get twice the width of the screen 
' in bytes. 
length = 1600 
' set screen resolution 
SCREEN 19
' create the palette 
' start the record buffer 
Rec_Buffer = FSOUND_SAMPLE_Alloc (FSOUND_UNMANAGED, _ 
         BUFFERSIZE, FSOUND_NORMAL, 44100, 255, 128, 255)         '           
FSOUND_Record_StartSample ( Rec_Buffer, 1) 
Locate 10,1:print Rec_Buffer
t = TIMER 
itr = 0 

      DO 
      IF TIMER > (t + 1) THEN 
         t = TIMER 
         cycles = itr 
         itr = 0 
      END IF 
      itr += 1 
        
      offset = (FSOUND_Record_GetPosition() * 2) - length 
      IF offset < 0 THEN offset += (BUFFERBYTES) 
        
      IF FSOUND_Sample_Lock (Rec_Buffer, offset, _ 
            length, @s_ptr1, @s_ptr2, @s_len1, _ 
            @s_len2) = 1 THEN 
          
         SCREENLOCK 
         ' plot buffer contents 
          LINE (0,0)-(799,599),0,bf 
          LINE (0,351)-(799,351),6
          min=32767:max=-32768:s=0:
         FOR i = 0 TO (s_len1 SHR 1) -1 
            j =351+((s_ptr1[i]) SHR 8)
            s=-s_ptr1[i]+s
            IF MAX< (-s_ptr1[i])THEN MAX=(-s_ptr1[i])
            IF MIN> (-s_ptr1[i])THEN MIN=(-s_ptr1[i])
           'locate 1,1:PRINT using "######.#";(s_ptr1[i])
             x(i)=(s_ptr1[i])
             line (i,351-x(i)shr 9)-(i-1,351-x(i-1)shr 9 )
            
         NEXT i 
            h=1/512
            for f=0 to 255
              sin1=0:cos1=0:k=6.28318530718*f:g=0
                 for t=0 to 1 step h
                   sin1=x(g)*sin(k*t)+sin1
                   cos1=x(g)*cos(k*t)+cos1
                   g+=1
                 next t
                y2(f)=sqr(cos1*cos1+sin1*sin1)*h
             line (f*2+100,598)-(f*2+100,598-y2(f) shr 2)
              next f
              
           dc=(s/800)*.001+dc*.999
           locate 1,20:PRINT  "N samle=";s_len1 shr 1
           locate 1,40:PRINT using "average800=#####.#";s/800
           locate 1,60:PRINT using "DC=#####.# ";dc
           locate 2,60:PRINT  "max=";max
           locate 3,60:PRINT  "min=";min
         LOCATE 2,1: PRINT "Cycles per second: = "; cycles 
         LOCATE 3,1: PRINT using "######.#";s_len1
         Locate 10,1:print Rec_Buffer
         SCREENUNLOCK 
         FSOUND_Sample_UnLock (Rec_Buffer, @s_ptr1, @s_ptr2, s_len1, s_len2) 
          ELSE 
         PRINT "Something CRAZY just happened!" 
      END IF 
LOOP WHILE INKEY$ = "" 
FSOUND_Record_Stop 
FSOUND_Sample_Free(Rec_Buffer) 
FSOUND_Close 
SLEEP 
CLOSE #1
END 