#COMPILE EXE #REGISTER ALL #INCLUDE "..\..\winapi\g_win.inc" 'GLOBAL Pi2 AS DOUBLE TYPE ADSRType a AS DWORD 'nr of (stereo!)samples of attack d AS DWORD ' + decay s AS DWORD ' + sustain r AS DWORD ' + release = total nr of stereosamples (1000 samples is internally 0 - 999, but this value shd be 1000) sval AS SINGLE 'sustainvalue [0-1] END TYPE DECLARE FUNCTION ApplyADSR(ADSR AS ADSRType, pData AS INTEGER PTR) AS SINGLE %CD_SR = 44100 '.38 - . 44 FUNCTION PBMAIN AS LONG STATIC sharr!() LOCAL i AS LONG LOCAL ADSR AS ADSRType LOCAL pData AS INTEGER PTR LOCAL fscale AS EXT LOCAL ascale AS EXT LOCAL aoffset AS EXT LOCAL track AS LONG STATIC t AS DOUBLE DIM pulse1(4 * %CD_SR/5 - 1) AS STATIC INTEGER ' Pi2 = 6.283185307# fscale = 220 * 6.283185307# / %CD_SR 'was 440 FOR i = 0 TO UBOUND(pulse1) pulse1(i) = INT(&H70FF * SIN(i * fscale)) NEXT ADSR.a = %CD_SR/200 ADSR.d = %CD_SR/25 ADSR.s = .1 * %CD_SR ADSR.r = 2 * %CD_SR/5 ADSR.sVal = 0.2 pData = VARPTR(pulse1(0)) 'this step is necessary, passing varptr() directly in function call gives other ptr + crash.. t = TIMER FOR i = 0 TO 10000 ApplyADSR ADSR, BYVAL pData NEXT t = TIMER - t MSGBOX STR$(t) END FUNCTION FUNCTION ApplyADSR(ADSR AS ADSRType, pData AS INTEGER PTR) AS SINGLE 'applies adsr type on wave, 16bit stereo '0 err checking - we want it to be fast LOCAL i AS DWORD LOCAL mult AS SINGLE 'EXT LOCAL incmult AS SINGLE 'EXT incmult = 1/ADSR.a mult = 0 FOR i = 0 TO ADSR.a - 1 @pData = INT(@pData * mult) INCR pData @pData = INT(@pData * mult) 'stereosamples.. INCR pData mult = mult + incmult NEXT incmult = (1 - ADSR.sVal)/(ADSR.a - ADSR.d) 'a 'ADSR.d * a - ADSR.a * a'1/a mult = ADSR.a * incmult + (ADSR.sVal - incmult * ADSR.d) FOR i = ADSR.a TO ADSR.d - 1 @pData = INT(@pData * mult) INCR pData @pData = INT(@pData * mult) INCR pData mult = mult + incmult NEXT mult = ADSR.sVal FOR i = ADSR.d TO ADSR.s - 1 @pData = INT(@pData * mult) INCR pData @pData = INT(@pData * mult) INCR pData NEXT incmult = ADSR.sVal/(ADSR.s - ADSR.r) '1/a mult = (ADSR.s - ADSR.r) * incmult FOR i = ADSR.s TO ADSR.r - 1 @pData = INT(@pData * mult) INCR pData @pData = INT(@pData * mult) INCR pData mult = mult + incmult NEXT END FUNCTION